应用程序架构有三个微服务;让我们称他们为A,B和C.
A是持有用户权限(包括发送SMS的权限)的权限,当权限更新时,它会为对此数据感兴趣的服务发布事件。
B和C侦听权限更改,以控制发送短信。
主Rails App正在与A,B,C集成。
应用已更新A,具有防止学生A接收任何短信的权限, 然后A发布了在Queueworker中延迟的事件; 应用程序开始通过B发送短信,由于Queueworker延迟,该功能尚未更新。
我们如何确保(或设计需要更改哪些内容以确保)一旦权限更改为false,用户将无法收到短信?
答案 0 :(得分:2)
您正在遇到分布式系统面临的最大挑战 - the CAP theorem。总而言之,分布式系统(就像你一样)永远无法保证以下三个方面:
在您的具体问题中,缺乏一致性会伤害您。你可以解决它,但你必须放弃其他一点。例如,在发送每个SMS之前,您可以让服务B对服务A执行同步HTTP请求,以验证目标收件人是否仍具有接收SMS的权限。这将修复您的一致性问题,但会创建一个依赖项,A必须启动并运行B才能运行(这意味着,您已经从CAP中丢失了 P )。
您还可以通过将权限更新通过的同一队列作为事件发送SMS请求来缓解此问题。在禁用权限后,仍然可以发送SMS,但只有在意图发送SMS之后进行权限更新时才会发生这种情况。这仍然缺乏一致性,但影响不太严重(以SMS延迟为代价)。