c# - 微服务架构中的 Saga Orchestration 可扩展性问题

标签 c# microservices saga

我需要在微服务架构中处理分布式事务。理论上,最好的方法之一是使用 Saga Orchestration 模式。问题是我找不到任何关于如何提供可伸缩性的详细信息。

让我们使用下面的示例。 CreateOrderSaga 可以有很多,如果我有多个 OrderService.API 就会这样。因为我可以拥有多个 OrderService.API。那么如果 CreateOrderSaga 是一种状态机,那么这是否意味着它应该自己处理其中的所有步骤,或者其他协调器可以接替它的工作?

然后,如果一个 API 在运行 saga 进程时崩溃了怎么办,其他 saga 协调器能否继续以崩溃 API 离开时的相同状态运行?处理这种情况的最佳方法是什么?事件存储有何帮助?

让我详细解释一下

  1. 其中一个 Order.API 中的 Coordinator1 启动 CreateOrderSaga

  2. 在 Coordinator1 中的 CreateOrderSaga 创建一个订单,它有 待定状态

  3. 然后 Coordinator1 由于某种原因崩溃了。 (也许没电了)订单保持待定状态,现在没有人感兴趣。应该有人继续处理它或者应该标记它为失败(谁有责任)也许还需要一些补偿交易。

那么是否可以让 saga 协调器启动一个进程但其他人也可以继续处理它?

saga 协调器如何扩展?

enter image description here

c

解决方案:

我确实选择了 Masstransit 来管理分布式事务

最佳答案

Saga 模式应该作为异步过程来实现。在这种情况下,asynchronous 意味着基于消息。大多数类型的消息队列都有确认功能(对于 rabbitmq )。在这里,我将描述无状态服务(即可以在 OrderService 的不同实例中处理 CreateOrder 请求)。

您单击“下订单”按钮,CreateOrder 消息被发送到消息队列中,OrderService 从队列中接收此消息。它是可缩放的,因为您可以创建许多 OrderService 实例。

那么我们有两种情况:

1. Orchestration-based saga:OrderService 接收消息,实例化协调器,协调器消费 CustomerService。如果 OrderService 在消息处理完成之前失败,CreateMessage 消息将不会在消息队列中得到确认。随后,OrderService 的另一个实例将接收消息并尝试处理它。如果 CustomerService 在调用期间失败:您可以使整个 CreateOrder 消息失败并稍后重试,或者重试对 CustomerService 的特定调用。

2. Choreography-based saga:OrderService 收到一条消息并尝试处理该消息。如果失败,则情况相同:消息将不会被确认,并将重新发送以供稍后重试。这种方法是关于发出事件,如 OrderCreatedCustomerCreated 等(即它是面向事件的)

当然,您应该为您的服务配置监控和警报,以确保系统处于事件状态并能够处理消息。

您还应该考虑是否需要实现一些补偿逻辑或检查。想象一下:您在处理一条消息时向不同的服务发出了两个 HTTP POST 请求,第一个服务调用成功完成,但第二个服务调用失败。如果您重试整个 CreateOrder 消息 - 您不应再次调用第一个服务。

进一步阅读:overview of sagas , coordinating sagas , choreography-based sagas :

In order for the communication to be reliable, it’s essential that the saga participants use a message broker that guarantees at-least-once delivery and has durable subscriptions. That’s because at-least-once delivery and durable subscriptions ensure that a saga completes even if a participant is temporarily unavailable. A message will sit in the message broker’s channel (e.g. queue or topic) until the participant is able to successfully process it.

要获得更多关于如何正确实现它的想法,请阅读如何 NServiceBus sagas framework实现。它是 sagas 的 .NET 框架,但概念与语言无关。

关于c# - 微服务架构中的 Saga Orchestration 可扩展性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59141487/

相关文章:

c# - RestSharp - 异步请求回复模式

version-control - 微服务中的版本管理

domain-driven-design - Saga,存储聚合状态的位置

c# - DataGridView 在左键单击时保持选中多行

c# - 如何使用 StreamWriter 强制写入文件?

c# - ISession 在 Azure 辅助角色中应该具有什么生活方式?

nhibernate - 如何确保使用 MassTransit Saga 将项目添加到 NHibernate 持久化 IList 的良好性能

c# - IEnumerable 属性的 ValidationAttribute

c# - Azure 服务总线主题架构

apache-kafka - 卡夫卡论公共(public)交通