最终一致的数据库:如何处理关系数据?

Eventually consistent DB : How to deal with relational data?

假设我们有使用事件代理相互通信的微服务。 为了确保数据的主权,每个微服务都对文档进行了非规范化。 因此,每当数据更改时,服务更改了数据,就会触发 'DataAHasChanged' 事件。接下来,所有订阅了这个事件的微服务都将更改文档,它们必须保持数据 A 的一致性。(这里的 A 不是外键,而是实际数据,因为它是非规范化的)

如果服务有多个包含数据 A 的文档,并且数据 A 经常变化,这对我来说似乎不太好。我会使用数据 A 的 ID 作为外键向其他服务发送 API 调用。

现实世界的用例是: 用户创建 'contract requests' 并且它有多个供应商信息。 供应商信息会经常更改。 所以如果有 2000 个合同请求。这意味着每当供应商更改其信息时。我们应该检查每个合同请求并更改非规范化文档。

在这种情况下最终一致性仍然是最佳实践吗?还是我应该只使用同步调用从供应商服务中读取数据?

谢谢。

我会重新审视微服务解耦并提出一个问题——每种数据的真实来源是谁?您可能会到达一个拥有文档的服务,该服务也将负责更新这些文档。

即使拥有文档的专用服务,您仍然需要回答您需要的一致性保证是什么。通常您从 SLA 开始——您的服务的可用性应该如何?数据是如何存储的?通常底层数据存储会决定这些。

此外,我想指出,即使使用同步调用,您的系统最终也会保持一致——因为执行所有这些调用需要时间,因此整个系统可能会看到 non-latest 数据.

如果您真的需要真正的强一致性,您可能必须为此选择合适的存储。假设我的性能和可用性目标得到满足,我会选择高度一致的选项。以及强一致性的原因——它更容易推理;因此系统变得更简单。