请求类型

  • Kafka 社区把 PRODUCE 和 FETCH 这类请求称为数据类请求,把 LeaderAndIsr、StopReplica 这类请求称为控制类请求

请求处理流程

  • kafka 采用类似 Reactor 模式架构

image.png

image.png

  • SocketServer 类似 Reactor 中的 Dispatch
    • 也有对应的 Acceptor 和 worker threads ,后者命名为 网络线程池,用于处理客户端发来的请求
    • 网络线程池的数量由 num.network.threads 控制,用于调整该网络线程池的线程数
      • 其默认值是 3

请求处理

image.png

  • 不管是数据类请求还是控制类请求,都会用网络线程和IO线程来隔离请求的差异

**

  • Acceptor 线程采用轮询的方式将入站请求公平地发到所有网络线程中
  • 网络线程池不会真正的处理请求
    • 网络线程池的线程会将请求放入一个 共享队列 中(后者不在前者中)
  • Broker 端还有个 IO 线程池,真正的处理逻辑由该线程池的线程进行处理,线程池数量由 num.io.threads 控制,默认 8个
    • 如果是 PRODUCE 生产请求,则将消息写入到底层的磁盘日志中;如果是 FETCH 请求,则从磁盘或页缓存中读取消息
    • IO线程池的线程粗合理后,会将 Response 放入网络线程池对应线程请求响应队列
  • Purgatory 组件,是用于存放延迟请求 (Delayed Reques)
    • 比如设置了acks=all 的 PRODUCE 请求,一旦设置了 acks=all,那么该请求就必须等待 ISR 中所有副本都接收了消息后才能返回,此时处理该请求的 IO 线程就必须等待其他 Broker 的写入结果
    • 一旦满足了完成条件,IO 线程会继续处理该请求,并将 Response 放入对应网络线程的响应队列中