跨不同微服务的数据库的数据完整性

uvy*_*tas 10 database rdbms foreign-keys relational-database microservices

假设我正在为我的微服务使用关系数据库.我有CustomersMService自己的数据库与表Customer,然后我有OrdersMService自己的数据库,但有表Order和该表有列CustomerId.我的问题是如何确保数据库之间的数据完整性,该Orders表不会指向不存在的客户?

tom*_*ern 10

我的问题是如何确保数据库之间的数据完整性,Orders表不会指向不存在的客户?

这是一个很好的问题.但是,它缺少一个重要的维度,即您希望建立参照完整性的时间跨度.

如果你问,"我怎样才能确保我的所有数据始终100%一致?" - 答案是你不能.如果你想要,你需要强制执行它,或者通过外键约束(在数据库之间不可用),或者确保你永远不会写入一个数据库而不是一些分布式事务之外的其他数据库(这是荒谬的,并且会打败使用面向服务的目的).

如果你问"我怎样才能确保我的所有数据在合理的时间段内100%保持一致?",那么你可以做些什么.一种常见的方法是在服务之间实现持久的异步事件.这可确保可以在本地写入更改,然后以可靠但离线的方式远程调度.您可以做的另一件事是有一个预定的看护人流程,可定期修复数据中的不一致.

然而,必须要说的是,在交易之外,即使在合理的时间跨度内,也绝不能保证一致性.如果绝对一致性是您的应用程序的要求,那么面向服务可能不适合您.