Spring cloud Spring Cloud Stream Kafka-如何实现幂等性以支持分布式事务管理(最终一致性)
我有以下典型场景:Spring cloud Spring Cloud Stream Kafka-如何实现幂等性以支持分布式事务管理(最终一致性),spring-cloud,microservices,distributed-transactions,spring-cloud-stream,spring-kafka,Spring Cloud,Microservices,Distributed Transactions,Spring Cloud Stream,Spring Kafka,我有以下典型场景: 用于购买产品的订单服务。充当分布式事务的指挥官 带有产品及其库存列表的产品服务 支付服务 Orders DB Products DB | | --------------- ---------------- ---------------- | OrderService | | ProductService | | Pa
- 用于购买产品的订单服务。充当分布式事务的指挥官
- 带有产品及其库存列表的产品服务
- 支付服务
Orders DB Products DB | | --------------- ---------------- ---------------- | OrderService | | ProductService | | PaymentService | --------------- ---------------- ---------------- | | | | -------------------- | --------------- | Kafka orders topic |------------- ---------------------
你能帮我想出一个方法来支持这个场景吗?我如何区分何时丢弃或重新处理该消息?我们使用spring integration kafka在微服务中使用kafka生成和使用消息。在我们的例子中,我们将org.springframework.messaging.Message对象发送到topics,并在从字节数组反序列化后从topics获取相同的类型。在消息实体中,有消息id、发送时间等标头值,而不是消息有效负载,它是您希望从一个微服务传输到其他微服务的实际对象。我们使用唯一的消息id值来实现幂等性。在生产者方面,您必须实现一些逻辑来确保消息的消息id在多次生成时是相同的。这实际上与您的生产逻辑有关。在我们的例子中,我们使用本地事务发布事件,这在Chris Richardson的博客中有很好的描述。通过这种方法,我们可以在生产者端用相同的消息id重新创建消息对象。在消费者方面,我们将所有已使用的消息id值持久化到数据库中,并在处理接收到的消息之前检查这些id。如果我们看到一条id在持久存储中的消息,我们只需忽略它 在您的情况下,要实现幂等性:
- 您应该在消息中保留唯一标识符
- 在生产者方面,当多次生产时,必须生成相同的标识符
- 在消费者方面,您必须检查接收到的id,以检测它是否在之前被消费