architecture - 基于无状态编排的 Saga 模式
问题描述
我正在将一个无状态的微服务分解成多个。我想保持他们所有人的无国籍状态。一些请求需要由一个(或多个)其他服务提供的数据。基于编排的Saga 模式通过让服务通过事件流进行通信并将原始请求存储在挂起状态直到返回请求的数据来解决这个问题。不幸的是,将挂起的请求存储在内存中会使依赖其他服务的服务成为有状态的。我知道这不是世界末日,但它使事情变得更加复杂,如果可能的话,我想避免这种情况。
我可以想到两种允许所有服务无状态的替代方案:
将待处理的请求临时存储在某个数据库中
我不是这个想法的忠实拥护者,因为它可能会减慢速度,并且需要额外的基础设施来维护并且是潜在的故障点。
将挂起的请求数据附加到事件并将响应推送到客户端
我使用Nchan向客户发送实时更新。我可以将所有必需的数据(完成请求所需的一切)附加到服务 A 生成的事件中,并将其发送到服务 B,而无需将挂起的请求存储在内存中。然后服务 B 会做它的事情,一旦完成,它可以直接通过 Nchan 发送(原始请求的)响应,或者将事件发送回服务 A,然后服务 A 将通过 Nchan 发送响应。
选项 2 现在对我来说似乎最可行。你怎么看,还有我想念的另一种选择吗?
解决方案
Saga Pattern 用于确保在失败的情况下所有已经执行的更新都得到补偿。顾名思义,无状态服务不存储数据,因此它确实不支持更新。所以你的原始形式的问题没有意义。
推荐阅读
- r - 计算R中数据框中每个唯一行的数量
- javascript - 检查变量的长度时,Javascript“无法读取未定义的属性'长度'”
- salesforce - Mulesoft 对 Salesforce 登录的 HTTP 请求返回 org.glassfish.grizzly.utils.BufferInputStream
- kotlin - kotlin子类的构造函数中的更多参数
- html - 表之间的边距折叠
- javascript - 如何使用正则表达式替换除了花括号中的所有子字符串?
- php - 在 Service Provider 中添加路由和使用会话信息
- java - CN1 - onTitleScrollAnimation 被窃听
- algorithm - 问:求解以下递归:T(n) = 8T(n/8) + n log n
- python - 如何通过 webdriver 在浏览器屏幕中选择一行文本以使用键盘或鼠标?