使用 rabbitmq 队列处理微服务之间的实时数据同步

Handling realtime data sync between microservices with rabbitmq queues

我们已将微服务设置为使用 rabbitmq 队列来处理任何即将到来的数据。

所以,我们有 service Aservice Bservice Cservice D

当请求为 service A 创建用户时,它会创建一个用户并将事件推送到 newUserIsCreated 队列。

现在,service Bservice C 需要为新添加的用户更新他们的数据库。


问题:

如果在 service Bservice C 中创建用户失败怎么办。

可能的失败场景可以是验证失败,或者 service Bservice C 宕机。

如果 service D 尝试访问同一用户,也会出现问题。

service Bservice C 会用什么回应?因为到那时他们将没有新创建的用户。


综上所述,

如何处理验证失败或这些服务之间的任何类型的失败?

如果需要实时同步怎么办? (队列可能需要一些时间来处理)

您可以让 BC(以及任何其他需要确认用户已创建的服务)向 RabbitMQ 发布确认消息以供 A 接收; A 然后在收到确认之前不会确认用户已创建。这并非万无一失:很有可能它在任何地方都取得了成功,但 A 没有及时得到确认。对于那种(理想情况下很少见的)情况,您可以有一个清理过程。

但值得注意的是,这种同步关系基本上是通过消息队列重新实现 request/response,所以如果沿着这条路走下去,为什么不直接 request/response(例如 HTTP 或gRPC)?

如果您有一个需要影响多个服务的操作,将其建模为传奇通常很有用,它将向各种服务发出请求并处理故障(如果故障太多,则可能会放弃) ,回滚它所做的更改)。通过持久化 saga 的状态(例如更新 B,但 C 尚未确认更新),可以查询它。

如果您发现 B 中的大多数操作都是涉及 A 的 sagas 的一部分,那么可能值得考虑 BA 是否应该相同服务,这将实现更强的一致性保证并可能简化事情。