.net 按最终一致性划分的一对一关系的最佳实践

krcsximq  于 2023-05-01  发布在  .NET
关注(0)|答案(1)|浏览(80)

我知道最终的一致性,但我想通过简单和实际的问题来了解它。

假设:

  • 假设这些表:
Table microservice_A.ACCOUNT {
 int AccountId,
 string AccountName
}

Table microservice_B.CUSTOMER {
 int CustomerId,
 int AccountId,
 string CustomerName
}
  • 我的假设是,这两个有一对一的关系:
micro_B                 micro_A
----------              ---------
|CUSTOMER|-1----------1-|ACCOUNT|
----------              ---------
  • 每个micro_Bmicro_A都有自己独立的数据库。
  • 业务政策:
  • 每个CUSTOMER必须有一个ACCOUNT
  • ACCOUNTMicro_A(聚合工厂)中有自己的策略。
  • CUSTOMERMicro_B(聚合工厂)中有自己的策略。
  • 我有CreateCustomer命名用例,这是软件需求之一,它导致创建一个具有有效帐户的客户。
    问题

1-哪个微服务负责实现CreateCustomer?----- * 我想是micro_B。*
2-如何工作的CreateCustomer,这里有什么最佳做法?

  • 一种选择是首先插入一个CUSTOMER,其中包含null AccountId。第二次通过Micro_B发布一个事件,用'Micro_A'捕获它。第三,创建一个ACCOUNT并生成新的AccountId,并通过'Micro_A'发布另一个事件,通知Micro_B帐户已生成,并将新生成的AccountId给予它。第四,Micro_B获取AccountId,并更新其CUSTOMER记录为合适的值。
  • 另一种选择是在它们之间使用Rest ApigRPC。以这种方式,通信是同步的。此外,如果插入CUSTOMER时发生错误,则没有恢复ACCOUNT创建的补偿解决方案。

我使用的是'dotnet'栈。如果可能,请给予您在解决方案中提供的工具。
谢谢大家。

2wnc66cl

2wnc66cl1#

你必须实现SAGA模式来处理服务之间的事务事件。
您可以使用Masstransit在项目中实现 Saga 。
读取MassTransit Saga State Machine和读取MassTransit Courier

question-1:既然您提到了CreateCustomer这个词,那就意味着客服负责启动和协调交易,我假设是某个操作员(而不是客户/用户本人)创建了客户。但是如果用户/客户自己注册了帐户,并在下面创建了客户配置文件,那么我认为这可能是帐户服务。
question-2:*首先 * 我必须说MassTransit State Machine确实协调和管理交易,MassTransit Courier形成具有补偿交易能力的Routing Slip。

  • 第二 * 不管哪个服务负责开始交易,我认为最好插入客户记录,然后用帐户保存客户ID。(例如:用户使用帐户登录并获取他/她的customerId作为声明,以便您可以检索相关数据)。这里我假设客户服务负责协调交易。
  1. Create Customer向 Saga 状态机触发一个事件。
  2. Saga 状态机用客户信息来初始化,该客户信息还包括用于向帐户注册的信息。
  3. Saga 状态机将执行包含2个步骤的路由单(1-在客户服务中创建客户,2-在帐户服务中注册帐户)
    1.路由选择单的第一步是创建客户。如果成功,则进入下一步。
    1.我们有客户id和注册帐户在客户服务与客户id作为索赔。
    1.如果在注册帐户时出现错误,则会触发补偿方法并执行补偿 www.example.com :删除特定ID的客户
    因此,上述情况是一般的,而不是特定于确切的实现。
    你可以找到真棒视频系列上masstransit here

相关问题