【问题标题】:Handling realtime data sync between microservices with rabbitmq queues使用rabbitmq队列处理微服务之间的实时数据同步
【发布时间】:2021-09-17 15:13:42
【问题描述】:

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

所以,我们有 service Aservice Bservice Cservice D

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

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


问题

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

可能的失败情况可能是验证失败,或者 service Bservice C 已关闭。

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

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


总结一下,

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

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

【问题讨论】:

  • 我认为对于您的用例,您应该有另一个 service-x 而不是 rabbitmq回滚操作。

标签: architecture rabbitmq microservices devops eventual-consistency


【解决方案1】:

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

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

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

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

【讨论】:

  • 这是一个可靠的答案。我要补充一点,对于我们有一个有点类似的应用程序,定期断开连接是生活中的一个事实,我们创建了一个“ConsistencyAudit”微服务(单独)订阅来自多个服务的...created事件并监视任何未命中,然后采取一些行动通知管理员。简单、独立、高效且(事实证明)不必要,但为类似的问题而构建。
  • 是的,在一个更加基于事件的系统中,这就是我想要的。
猜你喜欢
  • 2023-03-22
  • 2020-06-18
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 2021-09-16
相关资源
最近更新 更多