kafka Broker请求处理

目录

    所有的请求都是通过 TCP 网络以 Socket 的方式进行通讯的。

    Kafka 使用的是 Reactor 模式处理请求。

    Reactor 模式是事件驱动架构的一种实现方式,特别适合应用于处理多个客户端并发向服务器端发送请求的场景。多个客户端会发送请求给到 Reactor。Reactor 有个请求分发线程 Dispatcher,它会将不同的请求下发到多个工作线程中处理。工作线程可以根据实际业务处理需要任意增减,从而动态调节系统负载能力。

    Kafka 提供了 Broker 端参数 num.network.threads,用于调整该网络线程池的线程数。其默认值是 3,表示每台 Broker 启动时会创建 3 个网络线程,专门处理客户端发送的请求。

    当网络线程拿到请求后,它不是自己处理,而是将请求放入到一个共享请求队列中。Broker 端还有个 IO 线程池,负责从该队列中取出请求,执行真正的处理--如果是 PRODUCE 生产请求,则将消息写入到底层的磁盘日志中;如果是 FETCH 请求,则从磁盘或页缓存中读取消息。

    Broker 端参数 num.io.threads 控制了IO线程池中的线程数。默认值是 8,表示每台 Broker 启动后自动创建 8 个 IO 线程处理请求。

    Purgatory

    缓存延时请求(Delayed Request),针对一时未满足条件不能立刻处理的请求。

    比如设置了 acks=all 的 PRODUCE 请求,一旦设置了 acks=all,那么该请求就必须等待 ISR 中所有副本都接收了消息后才能返回,此时处理该请求的 IO 线程就必须等待其他 Broker 的写入结果。当请求不能立刻处理时,它就会暂存在 Purgatory 中。一旦完成,IO 线程会继续处理该请求,并将 Response 放入对应网络线程的响应队列中。

    posted on 2021-04-02 22:00  hainingwyx  阅读(91)  评论(0编辑  收藏  举报

    导航