24 请求是如何被处理的

评论区问题

1.epollo是什么,Reactor模式是什么
epoll是一种IO模型,而Reactor是一种IO处理模式(IO pattern)。可以这么说:我们可以使用epoll来实现Reactor

2.为什么不直接将Acceptor线程收到的请求存入共享队列,而要引入网络线程池来存?
单纯地想要在做一层生产者-消费者分离

3.当 IO 线程处理完请求后,会将生成的响应发送到网络线程池的响应队列中,然后由对应的网络线程负责将 Response 返还给客户端。这个响应队列不是网络线程池共享的吗?还是说IO线程指定网络线程来发送响应?
因为Kafka会记录请求是被哪个网络线程接收的,因此发送response时还会发往那个网络线程。

4.kafka生产消息,broker接收到消息后写入数据然后提交,这个提交和kafka follower高水位的更新时间顺序是什么?acks=all是ISR中每个broker都提交到生产者?

5.Reactor模式为什么要加这个中间队列?
将网络处理的线程数和IO处理的线程数解耦,达到高性能和资源少占用的目的。网络处理线程不会被IO处理阻塞

6.Kafka为什么没用已经实现了Reactor模式的netty网络应用框架,一个是追求性能,一个是不想太多依赖。
https://www.quora.com/Why-did-Kafka-developers-prefer-to-implement-their-own-socket-server-instead-of-using-Netty-Does-that-help-with-performance-Does-Kafka-implement-such-features-already

7.共享队列满了,那么这个请求会丢弃吗?
默认是500的上限,如果满了会阻塞

8.Reactor模式详解
https://my.oschina.net/u/3573545/blog/2221656

9.保证分区的顺序性
单个producer实例向单个分区下生产消息是保证有顺序的,如果在启用了retries之后设置max.in.flight.requests.per.connection = 1,该参数指定了在收到生产者响应前可以发送多少条消息,设置为1可以保证消息是按照发送顺序写入broker的(即使发生了重试)

10.当前这种异步消息处理模型,如何保证分区的消息顺序的一致性
一个broker上虽然有多个handler IO线程处理请求,但底层的日志管理器实例只有一个,因此依然能够保证消息的顺序性。当然这里所说的顺序性是指同一个producer发送消息的顺序性,多个producer同时发送消息,本来也无法确定哪个producer发送的消息在前,哪个producer发送的消息在后。
TODO

你可能感兴趣的:(kafka核心技术与实战,kafka)