【问题标题】:Microservices out of sync微服务不同步
【发布时间】:2016-06-08 15:22:34
【问题描述】:

应用架构有三个微服务;我们称它们为 A、B 和 C。

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

B和C监听权限变化,控制发送短信。

Main Rails App 正在与 A、B、C 集成。

应用更新了 A 的权限,以防止学生 A 收到任何短信, 然后 A 发布了在 Queueworker 中延迟的事件; App开始通过B发送短信,由于Queueworker延迟,尚未更新。

一旦权限更改为 false,我们如何确保(或需要更改设计以确保)用户不会收到短信?

【问题讨论】:

    标签: ruby-on-rails microservices


    【解决方案1】:

    您遇到了分布式系统的最大挑战——the CAP theorem。总而言之,分布式系统(如您所拥有的)永远无法保证以下所有三个:

    • C一致性 - 所有服务同时看到相同的数据
    • 一个可用性 - 所有服务对彼此的请求都会收到成功或失败响应
    • P分区容错 - 即使服务无法相互访问,系统也能继续运行

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 1970-01-01
      • 2021-03-31
      • 2021-07-24
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2018-11-26
      相关资源
      最近更新 更多