微服务 - 如何确保引用完整性?



我正在创建一个个人开支经理应用程序。为此,我正在创建一些微服务,并采用"每个服务的数据库"模式。所以,我有:

  • 费用数据库
    • 列包括:id、category_id、名称、金额、payment_date、详细信息

  • 类别数据库
    • 列是:id、名称

我现在面临的问题是:一项费用可以(并且应该(有一个类别。如果服务有自己的数据库,如何确保给定费用具有现有类别?我现在能想象的唯一方法是:

在创建费用时,我向类别服务发出请求,以验证类别的存在。但我可以清楚地看到这种方法的一个大缺陷:它可能适用于一段关系,但是当我还有四段关系时呢?在性能方面,调用其他五个服务以确保完整性将是一团糟。

我不知道如何处理这个问题。关于如何以更好的方式解决此问题的任何建议?

一项费用可以(并且应该(有一个类别。如果服务有自己的数据库,如何确保给定费用具有现有类别?

从广义上讲,你没有。 也就是说,需要一致的信息必须存储在同一个地方(即同一"微服务"的一部分(。 仅当数据不必一致时,才将数据分布在多个数据库之间。

有时可以接受的一种折衷方案是,我们可以在费用数据库中存储类别信息的缓存副本。 这允许您考虑添加约束,即费用数据必须与类别数据的缓存副本一致,前提是您可以处理类别数据的副本将过时的事实,并且可能会因对类别数据的更改而失效。

但是,强制引用完整性存在争用条件问题;我在"确实"存在的类别中提交费用,但尚未出现在缓存副本中。 应该怎么做? "时间上的微秒差异不应该对核心业务行为产生影响。

另一种折衷方案是对时间进行建模——周二的费用可以使用周二有效的类别,即使它在周三不再有效。 因此,费用服务可以暂停判断,直到它知道该类别在适当的时候是否有效。 当提前计划对费用策略进行更改时,这是有意义的。

另一种折衷方案是重新组织业务功能的实现,以便与类别关联的行为全部由管理该数据的服务执行。 费用服务将知道标识符,但其他方面知之甚少。

没有魔法 - 分布式系统需要妥协。

相关内容

最新更新