apache-kafka - 消息代理中的分区如何解决排序问题?

标签 apache-kafka kafka-producer-api messagebroker

我大致了解了分区的想法,但我无法意识到它确实如何解决排序问题。以 Chris Richardson 的书为例,如果我有 3 个关于“片键”1 的给定订单的事件(订单创建、订单更新和订单取消)。如果每个分区有多个实例,我如何确保事件按顺序处理?不是为了同样的问题而裁员吗?

我的意思是,在该示例中,所有消息都会发送到第一个分片,但它们不会在两个实例之间循环吗?

最佳答案

如果您的记录有 key ,则默认行为是任何给定 key 始终发送到同一分区。

分区是一种分而治之的方法,但会带来一些牺牲,这些牺牲在任何给定的问题域中都是可以接受的。具有多个分区的主题没有“顺序”的概念;正如您所指出的,您可以有多个竞争的消费者,它们可能以不同的速度运行。

相反,每个分区只会分配给消费者组中的一个消费者,并且正是在这一级别上,排序是严格的。我说严格是因为事情总是可能出错,并且记录可能会被重新处理,因此开箱即用的 Kafka 永远无法绝对保证您的排序。

当你说你需要按顺序处理事情时,你需要考虑这有多重要。例如您可能会认为银行帐户的交易应该按顺序处理(也许),因此特定帐户的所有记录都应该位于同一分区上,但两个不同帐户事件的相对顺序并不重要。

关于分区策略,直到V2.3,没有 key 的消息将以循环方式发送到分区。来自 v2.4从那时起,KIP-480 引入了一个粘性分区器来循环处理一批记录,而不是严格的一次一个。

关于apache-kafka - 消息代理中的分区如何解决排序问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59563792/

相关文章:

apache-kafka - 我怎么知道我已经消费了所有 Kafka 主题?

java - Apache Kafka 中数据的增量加载

apache-kafka - 使用 __consumer_offsets 杀死节点会导致消费者没有消息消费

tomcat - 部署在同一 tomcat 中的跨应用程序之间的 JMS 消息传递

microservices - 使用消息代理时,微服务如何将数据返回给调用者?或者消息队列?

java - 如何使用 Java 检查从 Spark 结构化流中的 Kafka 获取数据?

docker - 在 alpine 容器中使用 confluent-kafka python 客户端

apache-kafka - 如何将没有模式的数据发送到 kafka - 融合 jdbc - 接收器使用?

spring-boot - Rest API 的 Kafka 实现

java - Paho MQTT cleanSession 设置为 false 但未收到消息