可以水平扩展的服务上的分布式操作序列

A distributed sequence of actions over services that can horizontally scale

我有一个微服务分布式操作序列。服务 A 需要告诉服务 B 做某事,一旦完成,它将告诉服务 C。顺序很重要,所以我正在使用 saga 模式,如您所见。

我的问题是服务 B 可以扩展,每个实例都需要接收消息并完成操作。该操作必须在每个服务 B 实例上发生。然后服务 C 应该只 运行 一旦所有服务 B 实例都完成了他们的任务。

这是必须在每个实例上进行的缓存清除。我无法控制此架构,因此服务 B 的缓存与每个实例耦合。如果可以的话,我会为这些实例提供共享缓存。

我想出了这个编排解决方案,但它需要维护状态和大量额外代码来处理我想避免的边缘情况。

  1. 服务 A 向它知道的所有服务 B 实例发送相同的消息
  2. 所有服务 B 实例向服务 A 发送成功
  3. 最后服务B成功,服务A消息服务C

有没有更好的替代方案?

假设您无法重新构建服务 B,您已经掌握了操作的基本复杂性:A 必须跟踪服务 B 的实例,并且必须处理大量边缘情况。该过程基本上是有状态的。

如果缓存清除命令是幂等的(即你不关心它是否在过程中多次发生)你可以简化一些边缘情况处理并且可以摆脱不太持久的状态(失败时你可以从头开始,而不是需要重建你在这个过程中的位置。