69.Kafka 的网络模型是怎么样的?
Kafka 基于高吞吐率和效率考虑,并没有使用第三方网络框架,而且自己基于 Java NIO 封装的。
1)KafkaClient ,单线程 Selector 模型。
KafkaClient
实际上,就是 NettyClient 的 NIO 方式。
- 单线程模式适用于并发链接数小,逻辑简单,数据量小。
- 在 Kafka 中,Consumer 和 Producer 都是使用的上面的单线程模式。这种模式不适合 Kafka 的服务端,在服务端中请求处理过程比较复杂,会造成线程阻塞,一旦出现后续请求就会无法处理,会造成大量请求超时,引起雪崩。而在服务器中应该充分利用多线程来处理执行逻辑。
2)KafkaServer ,多线程 Selector 模型。
KafkaServer ,指的是 Kafka Broker 。
KafkaServer
Broker 的内部处理流水线化,分为多个阶段来进行(SEDA),以提高吞吐量和性能,尽量避免 Thead 盲等待,以下为过程说明。
实际上,就是 NettyServer 的 NIO 方式。
Accept Thread 负责与客户端建立连接链路,然后把 Socket 轮转交给Process Thread 。
相当于 Netty 的 Boss EventLoop 。
Process Thread 负责接收请求和响应数据,Process Thread 每次基于 Selector 事件循环,首先从 Response Queue 读取响应数据,向客户端回复响应,然后接收到客户端请求后,读取数据放入 Request Queue 。
相当于 Netty 的 Worker EventLoop 。
Work Thread 负责业务逻辑、IO 磁盘处理等,负责从 Request Queue 读取请求,并把处理结果放入 Response Queue 中,待 Process Thread 发送出去。
相当于业务线程池。
? 实际上,如果自己实现 MQ ,完全可以直接使用 Netty 作为网络通信框架。包括,RocketMQ 就是如此实现的。