Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 将数据从UI添加到不同的微服务_Rest_Oop_Domain Driven Design_Microservices - Fatal编程技术网

Rest 将数据从UI添加到不同的微服务

Rest 将数据从UI添加到不同的微服务,rest,oop,domain-driven-design,microservices,Rest,Oop,Domain Driven Design,Microservices,假设您有一张用户注册表,您在其中填写以下表格: 姓名、姓氏、年龄、地址、首选通信方式:短信、电子邮件(单选按钮)您有两个微服务: 用户管理服务 通信服务 注册用户后,我们应该在2个服务中创建2个聚合:UserManagementContext中的用户和Communications中的UserCommunications设置。我有三种方法可以实现这一点: 从UI执行2个不同的请求。如果其中一个失败了怎么办 将所有数据放在User中,然后使用所有数据引发集成事件,并在CommunicationC

假设您有一张用户注册表,您在其中填写以下表格: 姓名、姓氏、年龄、地址、首选通信方式:短信、电子邮件(单选按钮)
您有两个微服务:

  • 用户管理服务
  • 通信服务
注册用户后,我们应该在2个服务中创建2个聚合:UserManagementContext中的用户和Communications中的UserCommunications设置。
我有三种方法可以实现这一点:

  • 从UI执行2个不同的请求。如果其中一个失败了怎么办
  • 将所有数据放在User中,然后使用所有数据引发集成事件,并在CommunicationContext中捕获它。Fat事件、集成事件不应包含域数据,而应包含aggreagates的ID
  • 将消息放入队列中,这样两个上下文都有适配器获取所需的信息
  • 拆分此数据并保存信息的最佳选项是什么

    从UI执行2个不同的请求。如果其中一个失败了怎么办

    我认为这不行。你将以不一致的状态结束

    我赞成方法3:

  • 在用户存储中持久化(创建)用户
  • UserRegistered
    事件被发送,其中包含用户的ID
  • 所有相关方处理
    UserRegistered
    事件
  • 我会选择slim事件,因为您的服务可能需要不同的用户数据,最好让他们自己获取这些数据,而不是将所有内容都放到事件中

    从UI执行2个不同的请求。如果其中一个失败了怎么办

    我认为这不行。你将以不一致的状态结束

    我赞成方法3:

  • 在用户存储中持久化(创建)用户
  • UserRegistered
    事件被发送,其中包含用户的ID
  • 所有相关方处理
    UserRegistered
    事件

  • 我会选择slim事件,因为您的服务可能需要不同的用户数据,最好让他们自己获取这些数据,而不是将所有内容都放在事件中。

    正如您提到的存储通信设置,假设通信数据不属于UserManagement服务的有界上下文的一部分

    我看到在另一个答案中提出的方法#3有几个问题。虽然我认为原始答案中的方法#3与我的答案非常相似

    • 如果添加更多的通信模式会怎么样?当然,它只会导致通信服务的更改,而不会导致用户管理服务的更改。通信设置MS应将所有通信设置相关数据存储在其自己的数据存储中

    • 如果用户仅更新其通信设置首选项,该怎么办?为什么用户管理服务应该承担处理这个问题的责任?通信设置的更改应该仅仅触发其相应的微服务的更改,在我们的例子中,微服务就是通信服务


    • 我只是觉得最好使用一些自然键来跨微服务识别和关联实体,而不是由DB生成的内部ID。考虑到明天您决定使用完全不同的策略来为用户管理服务创建用户的“ID”,例如非数字ID、不同的ID生成算法等。我希望保持其他微服务不受任何这样的决定的影响。

    提议的方法:

    • 在体系结构中包括API网关。前端始终与API网关通信
    • API网关将命令发送到消息队列,如
      RegisterUser
      ,供感兴趣的微服务使用
    • 如果您希望保持架构简单,可以发布一条消息,其中包含任何感兴趣的微服务都可以使用的所有数据。如果您严格希望单个micro服务只查看其相关数据,请根据使用服务所需的唯一数据结构创建消息队列

    正如您提到的存储通信设置,假设通信数据不属于UserManagement服务的绑定上下文

    我看到在另一个答案中提出的方法#3有几个问题。虽然我认为原始答案中的方法#3与我的答案非常相似

    • 如果添加更多的通信模式会怎么样?当然,它只会导致通信服务的更改,而不会导致用户管理服务的更改。通信设置MS应将所有通信设置相关数据存储在其自己的数据存储中

    • 如果用户仅更新其通信设置首选项,该怎么办?为什么用户管理服务应该承担处理这个问题的责任?通信设置的更改应该仅仅触发其相应的微服务的更改,在我们的例子中,微服务就是通信服务


    • 我只是觉得最好使用一些自然键来跨微服务识别和关联实体,而不是由DB生成的内部ID。考虑到明天您决定使用完全不同的策略来为用户管理服务创建用户的“ID”,例如非数字ID、不同的ID生成算法等。我希望保持其他微服务不受任何这样的决定的影响。

    提议的方法:

    • 在体系结构中包括API网关。前端始终与API网关通信
    • API网关将命令发送到消息队列,如
      RegisterUser
      ,供感兴趣的微服务使用
    • 如果您希望保持架构简单,可以发布一条消息,其中包含任何感兴趣的微服务都可以使用的所有数据。如果您严格希望单个micro服务只查看其相关数据,请根据使用服务所需的唯一数据结构创建消息队列

    这也是我的首选方法