【发布时间】:2015-01-22 13:21:03
【问题描述】:
我有一个名为Topic1 的主题,有两个分区。假设serverA 是Topic1 的领导者,partition1 和serverB 是追随者。
如果在我的客户端中我发布到serverB(在 broker.list 中我只指定serverB)会发生什么?消息如何传播?是先发到serverB,然后再发到serverA。
【问题讨论】:
标签: apache-kafka
我有一个名为Topic1 的主题,有两个分区。假设serverA 是Topic1 的领导者,partition1 和serverB 是追随者。
如果在我的客户端中我发布到serverB(在 broker.list 中我只指定serverB)会发生什么?消息如何传播?是先发到serverB,然后再发到serverA。
【问题讨论】:
标签: apache-kafka
我发现这个document 对解释 Kafka 内部发生的事情非常有帮助。
生产者使用 API 向任何一台 Kafka 服务器询问分区列表和这些分区的所有元数据。该元数据包括每个分区的领导代理。生产者调用分区器获取目标分区,然后直接与该分区的 Kafka 代理领导者对话,将消息写入分区。领导者将处理与管理分区副本的任何其他代理的通信。
【讨论】:
客户端要向分区发布消息,首先从 Zookeeper 中找到分区的领导者,并将消息发送给领导者。 领导者将消息写入其本地日志。每个追随者使用单个套接字通道不断地从领导者那里拉新消息。追随者将每个收到的消息写入自己的日志并将确认发送回领导者。一旦领导者收到来自 ISR 中所有副本的确认,则消息被提交
所以回答你的问题,如果客户端发布到 serverB,它会咨询 zookeeper 以了解 Topic1 和 partition1 的领导者。 Zookeeper 回应说 serverA 是 partition1 的领导者。所以客户端将消息发送到serverA。(这里我假设partitioner将消息发送到partition1。)
所有这些都由 kafka 生产者处理。最终用户应用程序无需担心这些细节。
你可以阅读更多关于这个here
【讨论】: