kafka客户端怎么选择发到哪个kafka的broker节点?

昨天学习kafka的时候,网上提到,kafka对于同一个topic是有多个不同的分区partition的,同一个分区会有leader和followers,分布在不同的节点上面,打个比方,有3个kafka节点,某一个topic有6个分区。当客户端往kafka发送信息时,是自己决定放到哪个分区,还是随意发到某一个kafka节点上,由kafka来决定放入哪个分区呢?为了保证高可用,是不是客户端应该配置多个kafka节点,当某一个节点挂了,客户端自动切换到可以使用的节点上,然而,我在客户端连接程序的示例中,没有发现这样的配置,zk倒是有多个节点的配置。

阅读 11.1k
3 个回答

这个可以通过设置消息的key字段来hash,分配到固定的partition,比如同一个userId。
但是不能指定分配到那个具体的分区,或许你可以看看低层API,Producer自己实现个发送的接口。
但是这样的话,如果这个分区挂了的话,kafka就无法保证高可用了。理论上来说,不该有这样的机制。
kafka相关学习的资料,可以看看我个人的博客,写的很详细。

首先kafka生产者并不能将消息发送到指定broker,消息是必然发生到leader副本所在的broker的。
假设你有3个broker,主题有6个分区,那么每个broker将分到2个分。你这里并没有提到副本,如果副本数为1,那么这6个分区唯一的副本就是leader副本。
leader副本是用来处理客户端的请求的,也包括follower复制的获取消息请求。
Kafka的高可用性也是通过副本及复制机制实现的(当其中一台包含leader副本的broker奔溃,就会从分布在其他broker的follower副本中选举leader副本)。
你能做的就是在new ProducerRecord时指定分区,每指定就会根据你配置的分区器(不指定就使用默认的分区器根据你的key(没指定将随机发送分区)算出消息的分区。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏