我的理解是Kafka在分区级别有顺序保证。我的问题是 - 如果您的应用程序有多个消费者同时运行并从同一分区读取数据,那么分区中的顺序是否重要?毕竟,您的应用程序不会无序地处理它吗?
例如,假设我按照各自的顺序 M1、M2、M3 向单个分区 P1 生成了 3 条消息。
M1:
{"userId": 1, "favourite_food": "chicken"}
Run Code Online (Sandbox Code Playgroud)
M2:
{"userId": 1, "favourite_food": "beef"}
Run Code Online (Sandbox Code Playgroud)
M3:
{"userId": 1, "favourite_food": "fish"}
Run Code Online (Sandbox Code Playgroud)
假设我在同一个消费者组中有3个消费者C1、C2、C3。这些消费者的应用逻辑是将数据(在消息正文中发送)保存到数据库中(基本上我们希望将用户最喜欢的食物保存在数据库中)。
现在,由于消息在分区本身内排序,C1 在时间 读取 M1 t,C2 在时间 读取 M2 t+1,C3 在时间 读取 M3 t+2。但是,由于我们在某种程度上并行读取消息,因此消费者将数据保存到数据库中的顺序可能是无序的。例如,假设 C1 在一台非常慢的计算机上运行,并且仅在时间 写入数据库t+10。t+5然而,C2 和 C3 运行在速度更快的计算机上,并且它们分别按时写入数据库t+6。从应用程序的角度来看,用户最喜欢的食物现在是“鸡”,尽管它实际上应该是“鱼”,因为“鱼”是“最新”消息。
我的问题是 - 我们如何保证应用程序级别的排序?即使我们可以做到这一点,如果我们无论如何都必须在应用程序级别处理排序,那么为什么 Kafka 的“分区内排序”很重要呢?
不确定我是否误会了什么......
每个分区只能由消费者组中的单个消费者使用。请参阅Kafka 文档中的Consumer 部分。
因此,如果您有一个分区并在同一组中启动 3 个消费者,则 1 个消费者将被分配到该分区并按顺序消费消息 M1、M2 和 M3,而另外 2 个消费者将处于空闲状态。
这就是每个分区排序的工作原理。
| 归档时间: |
|
| 查看次数: |
1430 次 |
| 最近记录: |