基于无状态编排的 Saga 模式

问题描述

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

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

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

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

将待处理的请求数据附加到事件并将响应推送到客户端

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

选项 2 现在对我来说似乎最可行。你怎么看,我还缺少其他选择吗?

解决方法

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