我知道最终的一致性,但我想通过简单和实际的问题来了解它。
假设:
- 假设这些表:
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_B
和micro_A
都有自己独立的数据库。 - 业务政策:
- 每个
CUSTOMER
必须有一个ACCOUNT
。 ACCOUNT
在Micro_A
(聚合工厂)中有自己的策略。CUSTOMER
在Micro_B
(聚合工厂)中有自己的策略。- 我有
CreateCustomer
命名用例,这是软件需求之一,它导致创建一个具有有效帐户的客户。
问题
1-哪个微服务负责实现CreateCustomer
?----- * 我想是micro_B
。*
2-如何工作的CreateCustomer
,这里有什么最佳做法?
- 一种选择是首先插入一个
CUSTOMER
,其中包含nullAccountId
。第二次通过Micro_B
发布一个事件,用'Micro_A'捕获它。第三,创建一个ACCOUNT
并生成新的AccountId
,并通过'Micro_A'发布另一个事件,通知Micro_B
帐户已生成,并将新生成的AccountId
给予它。第四,Micro_B
获取AccountId
,并更新其CUSTOMER
记录为合适的值。 - 另一种选择是在它们之间使用
Rest Api
或gRPC
。以这种方式,通信是同步的。此外,如果插入CUSTOMER
时发生错误,则没有恢复ACCOUNT
创建的补偿解决方案。
我使用的是'dotnet'栈。如果可能,请给予您在解决方案中提供的工具。
谢谢大家。
1条答案
按热度按时间2wnc66cl1#
你必须实现SAGA模式来处理服务之间的事务事件。
您可以使用Masstransit在项目中实现 Saga 。
读取MassTransit Saga State Machine和读取MassTransit Courier。
question-1:既然您提到了CreateCustomer这个词,那就意味着客服负责启动和协调交易,我假设是某个操作员(而不是客户/用户本人)创建了客户。但是如果用户/客户自己注册了帐户,并在下面创建了客户配置文件,那么我认为这可能是帐户服务。
question-2:*首先 * 我必须说MassTransit State Machine确实协调和管理交易,MassTransit Courier形成具有补偿交易能力的Routing Slip。
1.路由选择单的第一步是创建客户。如果成功,则进入下一步。
1.我们有客户id和注册帐户在客户服务与客户id作为索赔。
1.如果在注册帐户时出现错误,则会触发补偿方法并执行补偿 www.example.com :删除特定ID的客户
因此,上述情况是一般的,而不是特定于确切的实现。
你可以找到真棒视频系列上masstransit here