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