Kafka 动态维护了一个同步状态的副本的集合(a set of In-SyncReplicas),简称 ISR,在这个集合中的结点都是和 Leader 保持高度一致的,任何一条消息只有被这个集合中的每个结点读取并追加到日志中,才会向外部通知“这个消息已经被提交”。

kafka 通过配置  producer.type  来确定是异步还是同步,默认是同步

同步复制

Producer 会先通过 Zookeeper 识别到 Leader,然后向 Leader 发送消息,Leader 收到消息后写入到本地 log 文件。这个时候 Follower 再向 Leader Pull 消息,Pull 回来的消息会写入的本地 log 中,写入完成后会向 Leader 发送 Ack 回执,等到 Leader 收到所有 Follower 的回执之后,才会向 Producer 回传 Ack。

异步复制

Kafka 中 Producer 异步发送消息是基于同步发送消息的接口来实现的,异步发送消息的实现很简单,客户端消息发送过来以后,会先放入一个  BlackingQueue  队列中然后就返回了。Producer 再开启一个线程  ProducerSendTread  不断从队列中取出消息,然后调用同步发送消息的接口将消息发送给 Broker。

Producer 的这种在内存缓存消息,当累计达到阀值时批量发送请求,小数据 I/O 太多,会拖慢整体的网络延迟,批量延迟发送事实上提升了网络效率。但是如果在达到阀值前,Producer 不可用了,缓存的数据将会丢失。