微服务中的服务间通信
Interservice communication in microservices
假设我们有四个微服务:user、shop、subscription 和 产品.
用户向他的商店发送添加产品的请求,我们需要满足这些条件才能添加产品:
- 用户必须处于活动状态(因此我们需要调用用户微服务并进行检查)
- 他的店铺必须经过验证和启用(所以我们需要打电话到他的店铺进行检查)
- 他的订阅没有过期(所以我们需要检查他的订阅)。
检查规则后,我们可以在我们的产品微服务中为他的商店创建一个产品。
我有两个选择:
- 同步调用(从产品微服务)到每个微服务并检查规则(但这样所有微服务都有紧耦合)。
- 使用 SAGA 检查这些规则然后创建产品(但用户可能需要查看创建的产品作为响应)
最好的解决方案是什么,还有更好的选择吗?
根据我对微服务的理解——它们在本质上是独立的和松散耦合的——所以最好这样对待它们——假设它们根本不了解彼此的上下文。然而,这些过程似乎非常密切相关,以至于一个过程的输出几乎可以保证是另一个过程的输入。
用户 - 听起来类似于 identity/authentication,这可以作为其他服务的先决条件 - 如果不是为了身份验证,而是为了所需的上下文。
除此之外 - 这听起来像是一个问题 - 流程是在哪里编排的?在客户端(您的选项 1)?或者在另一个 'central' 服务中代表客户端调用微服务(您的选项 2)?
https://dzone.com/articles/microservices-using-saga-pattern 建议事件消息传递也可用于避免中央服务编排流程 - 但每个微服务都需要订阅其他事件并知道何时执行自己的流程。
对我来说 - 如果您的服务真正独立(例如由不同的供应商、不同的代码库等管理),那么我会在客户端进行协调。
如果此用户界面只是众多(可以创建产品的多个应用程序)中的一个,那么我会在类似于企业服务总线的东西中创建'central' 编排服务。这使得编排流程可重用。
如果您可以完全控制所有这些微服务,并且它们是同一解决方案堆栈的一部分,那么我会将必要的规则检查构建到产品微服务中,并使其成为一项交易。您仍然可以使用 POST/PUT 命令以 RESTfuly 方式执行此操作。
这将是一个很好的图表 - 如果您觉得它有帮助,很乐意画出来。
对你(和其他人)的想法敞开心扉。
克里斯
What is the best solution, there is any better option?
要审查的一件重要事情是您的服务边界是否真正符合您的需求。您需要用于计算的数据分散在许多服务中,这是一个不好的迹象。
如果您的服务要真正实现自治,那么我们需要一种设计,其中一切仍然正常即使没有两个服务同时运行 .有了这样的约束,我们永远不会在两个服务之间进行同步调用。相反,我们将通过一些在服务关闭时不会丢失消息的传输方式来回传递消息(数据库、消息存储、消息队列,或者与服务是否存在的问题无关的东西)域逻辑过程为运行).
实际上,我们安排需要执行计算的服务将收集带有(可能过时的)必要数据副本的消息。另一种说法是:从其他服务获取的数据是 data on the outside.
数据对外的重要思想之一?数据 未 锁定。您真的不想尝试同时锁定不同服务拥有的数据。
此外,您应该假设对用户的响应将是异步的。我们可能会立即确认来自用户的消息,但这只是确认我们已将请求复制到服务可以找到它的地方。
假设我们有四个微服务:user、shop、subscription 和 产品.
用户向他的商店发送添加产品的请求,我们需要满足这些条件才能添加产品:
- 用户必须处于活动状态(因此我们需要调用用户微服务并进行检查)
- 他的店铺必须经过验证和启用(所以我们需要打电话到他的店铺进行检查)
- 他的订阅没有过期(所以我们需要检查他的订阅)。
检查规则后,我们可以在我们的产品微服务中为他的商店创建一个产品。
我有两个选择:
- 同步调用(从产品微服务)到每个微服务并检查规则(但这样所有微服务都有紧耦合)。
- 使用 SAGA 检查这些规则然后创建产品(但用户可能需要查看创建的产品作为响应)
最好的解决方案是什么,还有更好的选择吗?
根据我对微服务的理解——它们在本质上是独立的和松散耦合的——所以最好这样对待它们——假设它们根本不了解彼此的上下文。然而,这些过程似乎非常密切相关,以至于一个过程的输出几乎可以保证是另一个过程的输入。
用户 - 听起来类似于 identity/authentication,这可以作为其他服务的先决条件 - 如果不是为了身份验证,而是为了所需的上下文。
除此之外 - 这听起来像是一个问题 - 流程是在哪里编排的?在客户端(您的选项 1)?或者在另一个 'central' 服务中代表客户端调用微服务(您的选项 2)?
https://dzone.com/articles/microservices-using-saga-pattern 建议事件消息传递也可用于避免中央服务编排流程 - 但每个微服务都需要订阅其他事件并知道何时执行自己的流程。
对我来说 - 如果您的服务真正独立(例如由不同的供应商、不同的代码库等管理),那么我会在客户端进行协调。
如果此用户界面只是众多(可以创建产品的多个应用程序)中的一个,那么我会在类似于企业服务总线的东西中创建'central' 编排服务。这使得编排流程可重用。
如果您可以完全控制所有这些微服务,并且它们是同一解决方案堆栈的一部分,那么我会将必要的规则检查构建到产品微服务中,并使其成为一项交易。您仍然可以使用 POST/PUT 命令以 RESTfuly 方式执行此操作。
这将是一个很好的图表 - 如果您觉得它有帮助,很乐意画出来。
对你(和其他人)的想法敞开心扉。
克里斯
What is the best solution, there is any better option?
要审查的一件重要事情是您的服务边界是否真正符合您的需求。您需要用于计算的数据分散在许多服务中,这是一个不好的迹象。
如果您的服务要真正实现自治,那么我们需要一种设计,其中一切仍然正常即使没有两个服务同时运行 .有了这样的约束,我们永远不会在两个服务之间进行同步调用。相反,我们将通过一些在服务关闭时不会丢失消息的传输方式来回传递消息(数据库、消息存储、消息队列,或者与服务是否存在的问题无关的东西)域逻辑过程为运行).
实际上,我们安排需要执行计算的服务将收集带有(可能过时的)必要数据副本的消息。另一种说法是:从其他服务获取的数据是 data on the outside.
数据对外的重要思想之一?数据 未 锁定。您真的不想尝试同时锁定不同服务拥有的数据。
此外,您应该假设对用户的响应将是异步的。我们可能会立即确认来自用户的消息,但这只是确认我们已将请求复制到服务可以找到它的地方。