微服务-如何确保参照完整性?

时间:2019-10-13 05:43:02

标签: rest spring-boot microservices

我正在创建一个个人支出经理应用程序。为此,我创建了一些微服务,并采用了“ database per service”模式。所以,我有:

  • 费用数据库
    • 列为:id,category_id,名称,金额,付款日期,详细信息

  • 类别数据库
    • 列为:ID,名称

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

以创建时间为代价,我请求类别服务以验证类别的存在。但是我可以很清楚地看到这种方法的一个大缺陷:在一个单一的关系中它可能会很好地工作,但是当我再有四个时,该怎么办?在性能方面,调用其他五项服务以确保完整性会很麻烦。

我不知道如何处理此问题。关于如何更好地解决此问题的任何建议?

1 个答案:

答案 0 :(得分:0)

  

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

从广义上讲,您没有。也就是说,需要保持一致的信息必须存储在同一位置(即同一“微服务”的一部分)。您只需要在不必保持一致的情况下将数据分布在多个数据库中即可。

有时可以接受的一种折衷办法是,我们可以在费用数据库中存储类别信息的缓存副本。这使您可以考虑添加约束,使费用数据必须与类别数据的缓存副本一致,前提是您可以处理以下事实:类别数据的副本将陈旧,并且可能因所做的更改而失效类别数据。

但是,强制执行参照完整性会影响竞争条件。我在“确实”存在但未出现在缓存副本中的类别中提交费用。应该怎么办? “ microsecond difference in timing不应改变核心业务行为。”

另一种折衷方法是对时间进行建模-周二的费用可以使用在周二有效的类别,即使该类别在周三不再有效。因此,费用服务可以暂停判断,直到它在适当的时间知道类别是否有效为止。当预先计划费用政策变更时,这才有意义。

另一种妥协是重新组织业务功能的实现,以便与类别关联的行为全部由管理该数据的服务执行。费用服务会知道标识符,但其他信息很少。

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