apache-kafka - 当生产者数量多于分区时,Kafka 默认分区器行为
问题描述
在 Kafka 生产者中,可以指定一个分区键来指示消息的目标分区。默认情况下,使用基于散列的分区器来确定给定键的分区 id
因此,具有特定键的所有消息将始终转到主题中的同一分区:
- 消费者如何知道生产者写入哪个分区,从而可以直接从该分区消费?
- 如果生产者多于分区,并且多个生产者正在写入同一个分区,那么偏移量是如何排序的,以便消费者可以消费来自特定生产者的消息?
解决方案
消费者如何知道生产者写入哪个分区
不需要,或者至少不应该,因为这会在客户端之间产生紧密的耦合。所有消费者实例都应负责处理订阅主题的所有消息。虽然您可以assign
将消费者添加到 TopicPartition 实例列表,并且您可以为给定键调用 DefaultPartitioner 的方法以找出它会进入哪个分区,但我个人并没有遇到这种需求。另外,请记住,生产者可以完全控制partitioner.class
设置,并且不需要通知消费者此设置。
如果生产者多于分区,并且多个生产者正在写入同一个分区,那么偏移量是如何排序的......
生产者或分区的数量无关紧要。批次按顺序写入分区。您可以使用 限制每个 Producer 客户端一次发送的批次数量(并且每个应用程序只需要一个实例)max.in.flight.requests
,但是对于单独的应用程序,您当然无法控制任何排序
以便消费者可以消费来自特定生产者的消息?
同样,不应该这样做。
推荐阅读
- ruby - 自定义 Sinatra 路线
- c# - GroupBy之后,将一个组中的多条记录压缩为一条
- javascript - 如何从 JavaScript 对象中获取属性同时删除它
- python - 我的函数不断从整数列表中跳过负值
- python - 如何以与 tkinter 上的 IntVar() 或 StringVar() 相同的方式在 PyQt5 上使用 Vars?
- sql - Postgres如何迭代嵌套的JSON对象
- javascript - 输入要过滤的字符时出现Angular ng-select“未找到项目”错误
- javascript - 分隔符之间的正则表达式捕获,除非分隔符在其他分隔符之间
- r - 选择与另一个多边形相交(或完全在其中)的多边形 [R sf]
- pandoc - Pandoc `writeMarkdown` 不包括元数据,即写(读)不是 - 需要什么扩展?