查看原文
其他

深入理解Kafka服务端之网络架构初探

大数据记事本 2022-12-22
一、场景分析
    在之前的文章中,已经详细地分析了Kafka客户端从初始化生产者,到生产、发送消息,以及对返回响应及超时批次的处理流程。这篇开始,将深入分析Kafka服务端的重要组件及核心设计原理。
    众所周知,Kafka是一个支持高并发、高性能的流式处理平台(官网目前定义Kafka为流式处理平台),这得益于它优秀的网络架构设计。整体来讲,Kafka的网络架构采用了Java NIO中的主从Reactor多线程模型(关于Reactor模型,可以查看《图解Reactor模型》),示意图如下:

整体的通信方案如下:

  • Reactor主线程MainReactor对象通过select监听连接事件,收到事件后,通过Acceptor处理连接事件

  • 当Acceptor处理连接事件后,MainReactor将连接分配给SubReactor

  • SubReactor将连接加入到连接队列进行监听,并创建handler进行各种事件处理

  • 当有新事件发生时,SubReactor就会调用对应的handler进行处理

  • handler通过Read读取数据,分发给后面的worker线程处理

  • worker线程池会分配独立的worker线程进行业务处理,并返回结果

  • handler收到响应的结果后,再通过send将结果返回给client

  • MainReactor主线程可以关联多个SubReactor子线程

二、Kafka中Reactor模型的实现

   在分析Kafka的各个网络组件之前,先看一下它整体的网络通信层架构:

    从图中可以看出,SocketServerKafkaRequestHandlerPool是其中最重要的两个组件:
  • SocketServer:实现Reactor模式,用于处理多个Client(包括客户端和其他broker节点)的并发请求,并将处理结果返回给Client
  • KafkaRequestHandlerPool:Reactor模式中的Worker线程池,里面定义了多个工作线程,用于处理实际的I/O请求逻辑。

整个服务端处理请求的流程大致分为以下几个步骤:

  1. Acceptor接收客户端发来的请求

  2. 轮询分发给Processor线程处理

  3. Processor将请求封装成Request对象,放到RequestQueue队列

  4. KafkaRequestHandlerPool分配工作线程,处理RequestQueue中的请求

  5. KafkaRequestHandler线程处理完请求后,将响应Response返回给Processor线程

  6. Processor线程将响应返回给客户端

    对照上面的主从Reactor多线程模型:这里的Acceptor就相当于MainReactor,通过Selector用来接收连接请求,然后创建对应的SocketChannel,交给某个Processor处理。而Processor就相当于SubReactor,真正建立网络连接,并注册OP_READ事件来读取数据。KafkaRequestHandlerPool就是线程池对象,而KafkaRequestHandler是真正处理I/O请求操作的工作线程。

    Kafka默认1个Acceptor线程对应3个Processor(由num.network.threads参数决定)线程;而1个KafkaRequestHandlerPool线程池中包含8个KafkaRequestHandler工作线程。(由num.io.thread参数决定)

    在Kafka安装目录/config/server.properties配置文件中,就可以看到这两个参数的默认值:

# The number of threads that the server uses for receiving requests from the network and sending responses to the networknum.network.threads=3
# The number of threads that the server uses for processing requests, which may include disk I/Onum.io.threads=8

    这两个参数十分重要,通过合理设置这两个参数值,可以有效提升Kafka的并发处理能力

    这篇先从整体上了解一下Kafka的网络设计,从下一篇开始详细分析网络通信过程中涉及到的各个组件以及从接收请求到返回响应的整个流程。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存