如何在微服务中扩展并行消费者
How to scale up parallel consumers in microservices
对于一个新项目,我们正在考虑将微服务与 RabbitMQ 或 Kafka 结合使用。对于这两种技术,我有同样的问题,但答案可能不同。
考虑三个事件:
- 创建产品 1
- 创建配置文件 1
- 删除产品 1
我们希望将这些事件用于 "duplicate" 服务之间的数据。当使用一个消费者时,所有消息将以正确的顺序执行,并且数据库将保持一致。
但是,当这个消费者处理消息的速度变慢时,可能需要并行添加另一个消费者。此时不确定事件1先于事件3执行,可能导致数据库不一致(先删除,后创建)。
找到了一些关于该主题的信息here,但这两种解决方案似乎都难以实施。如何扩大这些消费者的规模?使用 RabbitMQ 或 Kafka 处理此问题的方式有什么不同吗?
对于基于 Kafka 的实现,您只需要确保属于同一个 "logical group" (id?) 的所有事件都在同一个分区 - 在这种情况下,您可以添加更多消费者(最多分区数)以并行处理事件,但每个消费者将只为其逻辑组处理事件。
您可以通过选择正确的 key/partitioning 方法来实现此行为 - 使用 ID 作为键,或者使用更复杂的分区实现。
对于一个新项目,我们正在考虑将微服务与 RabbitMQ 或 Kafka 结合使用。对于这两种技术,我有同样的问题,但答案可能不同。
考虑三个事件:
- 创建产品 1
- 创建配置文件 1
- 删除产品 1
我们希望将这些事件用于 "duplicate" 服务之间的数据。当使用一个消费者时,所有消息将以正确的顺序执行,并且数据库将保持一致。
但是,当这个消费者处理消息的速度变慢时,可能需要并行添加另一个消费者。此时不确定事件1先于事件3执行,可能导致数据库不一致(先删除,后创建)。
找到了一些关于该主题的信息here,但这两种解决方案似乎都难以实施。如何扩大这些消费者的规模?使用 RabbitMQ 或 Kafka 处理此问题的方式有什么不同吗?
对于基于 Kafka 的实现,您只需要确保属于同一个 "logical group" (id?) 的所有事件都在同一个分区 - 在这种情况下,您可以添加更多消费者(最多分区数)以并行处理事件,但每个消费者将只为其逻辑组处理事件。
您可以通过选择正确的 key/partitioning 方法来实现此行为 - 使用 ID 作为键,或者使用更复杂的分区实现。