微服务不同步

时间:2016-06-08 15:22:35

标签: ruby-on-rails microservices

应用程序架构有三个微服务;让我们称他们为A,B和C.

A是持有用户权限(包括发送SMS的权限)的权限,当权限更新时,它会为对此数据感兴趣的服务发布事件。

B和C侦听权限更改,以控制发送短信。

主Rails App正在与A,B,C集成。

应用已更新A,具有防止学生A接收任何短信的权限, 然后A发布了在Queueworker中延迟的事件; 应用程序开始通过B发送短信,由于Queueworker延迟,该功能尚未更新。

我们如何确保(或设计需要更改哪些内容以确保)一旦权限更改为false,用户将无法收到短信?

1 个答案:

答案 0 :(得分:2)

您正在遇到分布式系统面临的最大挑战 - the CAP theorem。总而言之,分布式系统(就像你一样)永远无法保证以下三个方面:

  • C onsistency - 所有服务同时查看相同的数据
  • A 可用性 - 所有服务'对彼此的请求收到成功或失败的回复
  • P 目标容忍度 - 即使服务无法相互接触,系统仍可继续运行

在您的具体问题中,缺乏一致性会伤害您。你可以解决它,但你必须放弃其他一点。例如,在发送每个SMS之前,您可以让服务B对服务A执行同步HTTP请求,以验证目标收件人是否仍具有接收SMS的权限。这将修复您的一致性问题,但会创建一个依赖项,A必须启动并运行B才能运行(这意味着,您已经从CAP中丢失了 P )。

您还可以通过将权限更新通过的同一队列作为事件发送SMS请求来缓解此问题。在禁用权限后,仍然可以发送SMS,但只有在意图发送SMS之后进行权限更新时才会发生这种情况。这仍然缺乏一致性,但影响不太严重(以SMS延迟为代价)。