没有同步通信的微服务可能吗



我知道这个问题已经被问了很多种方式和风格,我想添加另一种方式和一个具体的例子。

基本上我知道我们应该避免同步通信,我只是想知道是否有一些模式可以真正避免所有这些。让我给你举一个简短的例子,说明我不知道如何使其异步:

我有一个管理用户的服务,基本上是一个保存了用户及其配置等的数据库。现在,另一个服务API Gates提供端点来注册用户。这就是通信成为问题的地方:如果调用了注册端点,我们必须以某种方式同步调用用户服务,因为我们需要新建用户的userId。所以这是一个非常抽象的例子,在很多情况下可能不需要userId,但总的来说,我对这种模式很好奇:

一个服务需要调用另一个服务来创建新的资源,但需要新创建的资源的某种数据将其返回给它的调用者,或者在本地创建它的实体和其他服务实体之间的某种连接。

这是否有某种模式,或者这只是一个需要进行同步通信的地方?

您所描述的是OrchestrationChoreography模式:

  • Orchestration模式中,微服务直接调用其依赖项,就像在您的示例中一样,微服务调用另一个来注册用户,然后使用响应中的userId

  • 另一方面,我们可以使用Choreography模式,其中我们需要一个消息队列系统,例如KafkaRabbitMq,来解耦微服务。同样的例子如下:

    1. 用户管理器微服务将向消息队列发布RegisterUser类型的事件(命令(,其中包含用户信息
    2. API Gates订阅RegisterUser类型的事件,并且每当它获得该类型的事件时,它将正常创建用户
    3. 现在,API Gates必须让所有人知道用户已经创建,因此它将发布另一个包含用户信息的UserCreated类型的事件,例如userId
    4. 最后,用户管理器还必须订阅UserCreated事件,这样它才能继续流

使用这种方法,两个微服务彼此不认识,它们是解耦的,并且您可以有任意数量的依赖项订阅事件,即,您可以添加新的依赖项,而无需更改代码。

最新更新