gpt4 book ai didi

rest - 微服务 "JOIN"不同数据库内的表和数据复制

转载 作者:行者123 更新时间:2023-12-04 15:42:24 30 4
gpt4 key购买 nike

我正在尝试实现实体之间的数据连接。

我有 2 个独立的微服务,它们可以使用事件 (rabbitmq) 相互通信。所有请求目前都在一个 api 网关中加入。

假设我的第一个服务是UserService,第二个服务是ProductService

通常要获取产品列表,我们会执行 GET 请求,例如 /products ,当我们想要创建产品时,我们也会执行 POST 请求,例如 /products

产品架构看起来像这样:

{
title: 'ProductTitle`,
description: 'ProductDescriptio',
user: 'userId'
...
}

用户模式看起来像这样:

{
username: 'UserUsername`,
email: 'UserEmail'
...
}

因此,在创建产品或获取产品列表时,我们不会有一些关于用户的详细信息,例如 emailusername...

我想要实现的是在创建或查询产品列表时获取用户详细信息以及用户详细信息,如下所示:

[
{
title: 'ProductTitle`,
description: 'ProductDescriptio',
user: {
username: 'UserUsername`,
email: 'UserEmail'
}
}
]

我可以向 UserService 发出 REST GET 请求,以获取每个产品的用户详细信息。

但我担心的是,如果 UserService 出现故障,该产品将没有用户详细信息。

JOIN 表还有哪些其他方法?除了调用 REST API 之外?

我读过关于 DATA REPLICATION 的内容,但还有一个问题是,当我们使用 创建新产品时,如何在 ProductService 中保留用户详细信息的副本>POST 请求 ?

如果他没有创建产品,通常我不想将用户详细信息的副本保存到 ProductService。我还可以向其他服务发出事件。

最佳答案

方法 1 - 数据复制

只要数据复制使您的服务独立且有弹性,它就没有害处。但是过多的数据复制也不好。微服务并不适合所有情况,因此我们也必须在事情上做出妥协。

方法 2 - 事件溯源和物化 View

通常,如果您的数据包含多个服务,您应该考虑事件溯源和物化 View 。这些 View 是预编译的一次性数据表,可以使用来自不同数据服务的已发布事件进行更新。假设您的“用户”服务发布了事件,那么如果发布了另一个相关事件,您将更新您的 View ,您可以添加/更新物化 View 等。这些 View 可以保存在缓存中以便快速检索,并且可以查询以获取数据。这种模式几乎没有增加复杂性,但具有高度可扩展性。

事件溯源基本上是一个存储,用于保存所有事件并重播事件以达到系统的特定状态。通常我们从事件存储中创建物化 View 。

比如说您有事件存储,您可以在其中继续保存所有已发布的事件。同时你也在更新你的物化 View 。如果你想查询数据,那么你将从物化 View 中获取它。由于物化 View 是一次性的,因此始终可以从事件存储中生成。假设缓存中的物化 View 已损坏,您可以通过重放事件从事件存储中完全重新生成 View 。假设我错过了缓存命中,我仍然可以通过重播事件从事件存储中获取数据。您可以在以下链接中找到更多信息。

Event Sourcing , Materialized view

关于rest - 微服务 "JOIN"不同数据库内的表和数据复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57333965/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com