请求类型
- Kafka 社区把 PRODUCE 和 FETCH 这类请求称为数据类请求,把 LeaderAndIsr、StopReplica 这类请求称为控制类请求
请求处理流程
- kafka 采用类似 Reactor 模式架构
- SocketServer 类似 Reactor 中的 Dispatch
- 也有对应的 Acceptor 和 worker threads ,后者命名为 网络线程池,用于处理客户端发来的请求
- 网络线程池的数量由
num.network.threads
控制,用于调整该网络线程池的线程数- 其默认值是 3
请求处理
- 不管是数据类请求还是控制类请求,都会用网络线程和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 放入对应网络线程的响应队列中
- 比如设置了