【发布时间】:2021-09-11 10:10:26
【问题描述】:
=== 从消费者的角度假设一切 ===
- 我正在阅读几篇 Kafka 文章,我看到分区的数量与微服务实例的数量相关......例如:如果我为我的 serviceA 说 1topic 1partition.. Producer 将消息推送到 topicT1,partitionP1 ,并且从 consumerSide(ServiceA1) 我可以从 t1,p1 读取。如果我将新 pod(ServiceA2) 旋转为具有高吞吐量,那么第二个实例将永远不会收到任何消息,因为 Kafka/ZooKeeper 将 id 分配给每个消费者,并且 partition1 已经被 serviceA1 占用。所以 serviceA2++ 保持空闲......为了避免这样的麻烦,Kafka 建议添加更多分区,以便可以根据需要增加/减少消费者的数量。
- 我还可以通过命令行进行测试,并且 service2 从未使用过任何消息。如果我关闭 service1,那么 service2 就能够选择新消息...因此,如果我旋转更多 pod,那么 FailSafe/Availability 会增加,但吞吐量始终相同...
- 我的假设是否正确。我有什么遗漏吗。现在我觉得任何标准的消息传递都会有同样的问题......如何扩展面向消息的系统本身。
【问题讨论】:
-
这取决于您用于消息的密钥,因为消息是使用密钥分区算法路由到分区的。你用了多少个分区?您是否检查分配给第二个消费者的分区是否收到任何消息?当您关闭第一个消费者时,您的第二个消费者接收所有消息是正常行为,因为重新平衡分区将它们重新分配给第二个。
-
我认为主要问题“现在我觉得任何标准消息传递都会有同样的问题......如何扩展面向消息的系统本身”需要澄清来回答你的问题,你是什么意思通过“扩展”/“面向消息的系统”/“标准消息”
-
1) 我们刚刚开始用 Kafka 代替消息传递...2) 在传统的 MQ 中会有一个集群,并且 1orMQ 会在里面。 3)所以MQ集群/协调器服务将消息传递给客户端。 4) 现在可以有 10 个服务/客户端可以使用来自单个 MQ 的消息。 5)因此,如果 MQ 中有 10 条消息,那么每个服务/消费者/客户端可以读取/处理 1 条消息 6)现在这种情况在 Kafka 中是不可能的,我现在按照设计理解 7)为了在 Kafka 中实现类似的功能,我有添加与客户端/消费者/pods 相同或更多数量的分区...
标签: apache-kafka microservices kafka-consumer-api