Database 数据库与微服务的一致性
在基于微服务的系统中,实现数据库一致性的最佳方法是什么 在会议上,Martin Fowler谈到了微服务,他提到的一条“规则”是保留“每服务”数据库,这意味着服务不能直接连接到另一个服务“拥有”的数据库 这是非常好和优雅,但在实践中它变得有点棘手。假设您有一些服务:Database 数据库与微服务的一致性,database,soa,microservices,Database,Soa,Microservices,在基于微服务的系统中,实现数据库一致性的最佳方法是什么 在会议上,Martin Fowler谈到了微服务,他提到的一条“规则”是保留“每服务”数据库,这意味着服务不能直接连接到另一个服务“拥有”的数据库 这是非常好和优雅,但在实践中它变得有点棘手。假设您有一些服务: 前端 订单管理服务 忠诚计划服务 现在,客户在您的前端进行购买,这将调用订单管理服务,它将保存数据库中的所有内容--没问题。此时,还将呼叫忠诚度计划服务,以便其从您的帐户贷记/借记积分 现在,当所有内容都在同一个DB/DB服务器
- 前端
- 订单管理服务
- 忠诚计划服务
我很想听听你的建议!。。提前谢谢你 我通常不处理微服务,这可能不是一种好的做事方式,但这里有一个想法: 为了重申这个问题,该系统由三个独立但相互通信的部分组成:前端、订单管理后端和忠诚度计划后端。前端希望确保订单管理后端和忠诚度计划后端都保存了一些状态 一种可能的解决方案是实施某种类型的:
- 如果第一步失败,则不会更改任何数据
- 如果在第二次、第三次、第四次或第五次失败,当系统重新联机时,它可以扫描所有前端记录,查找没有关联交易ID(任何一种类型)的记录。如果它遇到任何这样的记录,它可以从步骤2开始重放。(如果在步骤3或5中出现故障,则在后端会留下一些废弃的记录,但不会将其移出暂存区域,因此一切正常。)
- 如果在第六步、第七步或第八步失败,当系统重新联机时,它可以查找所有前端记录,并填写两个事务ID。然后,它可以查询后端以查看这些已提交或未提交事务的状态。根据已提交的文件,它可以从相应的步骤恢复
许多人都在为实现强一致性而挣扎。问题是,这类场景通常可以通过引入额外的规则来处理,比如如果用户最终获得负忠诚度点数,通知他们。如果T过去而没有整理忠诚积分,则通知用户将根据某个转换率向他们收取M。当客户使用积分购买物品时,此政策应该对他们可见。我同意@Udi Dahan的说法。只是想补充一下他的答案 我认为你需要坚持这个原则