架构 (IT)后端架构师

如何正确组织微服务之间的交互层,以支持事务性?

用 Hintsage AI 助手通过面试

回答。

在设计微服务之间的交互时,常常会遇到实现分布式事务的问题。在单体架构中,内置机制足够,但在微服务中,由于不同的数据库、技术和数据交换格式,情况变得复杂。主要原则是避免长时间的分布式事务,因为它们扩展性差并带来性能下降的风险。

建议使用 SAGA 模式,而不是经典的 ACID 协议。这是一系列局部事务,每个微服务记录其更改,并在需要回滚时在其责任范围内发送补偿操作。

以下是使用 Node.js 和 REST 的 SAGA 管理的简化实现示例:

// 使用 Express 的 Saga 调度者 app.post('/saga', async (req, res) => { try { await serviceA.transaction(); await serviceB.transaction(); res.send('ok'); } catch (err) { await serviceA.rollback(); res.status(500).send('已执行回滚'); } });

主要特点:

  • SAGA 最小化服务之间的长时间锁定
  • 可扩展性——可以添加新的步骤和补偿措施
  • 适合“每个服务 - 各自存储”的架构

带有陷阱的问题。

可以在微服务之间使用经典的双阶段提交 (2PC) 来支持事务吗?

可以,但不推荐在微服务架构中使用。2PC 会减缓扩展,并在技术和组织上将服务绑定在一起。

所有 SAGA 场景都适合金融操作吗?

不。对于需要严格 ACID 的场景,例如单账户余额的重新计算,实现 SAGA 更为复杂。在此需要评估风险并寻找折中方案。

如果微服务无法回滚,如何处理中间步骤的失败?

在这种情况下,需要实现手动或自动补偿协议,可能需要使用单独的事件日志。