首页 > 解决方案 > 基于无状态编排的 Saga 模式

问题描述

我正在将一个无状态的微服务分解成多个。我想保持他们所有人的无国籍状态。一些请求需要由一个(或多个)其他服务提供的数据。基于编排的Saga 模式通过让服务通过事件流进行通信并将原始请求存储在挂起状态直到返回请求的数据来解决这个问题。不幸的是,将挂起的请求存储在内存中会使依赖其他服务的服务成为有状态的。我知道这不是世界末日,但它使事情变得更加复杂,如果可能的话,我想避免这种情况。

我可以想到两种允许所有服务无状态的替代方案:

将待处理的请求临时存储在某个数据库中

我不是这个想法的忠实拥护者,因为它可能会减慢速度,并且需要额外的基础设施来维护并且是潜在的故障点。

将挂起的请求数据附加到事件并将响应推送到客户端

我使用Nchan向客户发送实时更新。我可以将所有必需的数据(完成请求所需的一切)附加到服务 A 生成的事件中,并将其发送到服务 B,而无需将挂起的请求存储在内存中。然后服务 B 会做它的事情,一旦完成,它可以直接通过 Nchan 发送(原始请求的)响应,或者将事件发送回服务 A,然后服务 A 将通过 Nchan 发送响应。

选项 2 现在对我来说似乎最可行。你怎么看,还有我想念的另一种选择吗?

标签: architecturemicroservicessaga

解决方案


Saga Pattern 用于确保在失败的情况下所有已经执行的更新都得到补偿。顾名思义,无状态服务不存储数据,因此它确实不支持更新。所以你的原始形式的问题没有意义。


推荐阅读