【问题标题】:Simplify setup for MassTransit Saga in Azure Service Bus简化 Azure 服务总线中 MassTransit Saga 的设置
【发布时间】:2021-10-14 19:14:33
【问题描述】:

我正在尝试弄清楚如何设置 MassTransit 传奇并最大限度地降低 Azure 服务总线中设置的复杂性。

我想到的流程是这样的:

  1. 有人发送类似CreateSaga 的命令。它将被发送到名为 my-saga-queue 的队列并被 saga 使用。
  2. 基于此,saga 将生成一些其他命令,例如 DoSomething,这些命令由其他地方的消费者获取(不是特定于 saga)。
  3. 这些消费者将在完成后发布SomethingIsDone 之类的事件。
  4. saga 应该使用这些事件并根据它们做出反应。

第 4 步是我在弄清楚该怎么做时遇到的一些问题。 SomethingIsDone 事件不能直接发布到my-saga-queue 我猜(因为它是一个队列),所以它们最终必须订阅该事件的主题。

但是 saga 实例可以从该订阅消费,还是必须从订阅转发到队列?

一些背景背景:我们正在尝试简化我们的 ASB 设置,希望这会增加我们的吞吐量(有一些问题)。我们试图摆脱的事情是订阅和队列之间的转发,因为订阅本身就是队列)。

【问题讨论】:

    标签: azureservicebus masstransit


    【解决方案1】:

    您可以手动配置初始队列以及订阅端点,使用相同的 saga 存储库在每个端点上配置 saga。它的工作量更大,并且将总线配置与 saga 消耗的每个事件紧密耦合,但可以混合使用接收端点和订阅端点。

    例如,如果您有一个 CartStateMachine 和一个 CartState,您可以将每个事件配置为:

    cfg.SubscriptionEndpoint<CartItemAdded>("cart-state-machine", endpoint =>
    {
        endpoint.ConfigureSaga<CartState>(context);
    });
    
    cfg.SubscriptionEndpoint<CartItemRemoved>("cart-state-machine", endpoint =>
    {
        endpoint.ConfigureSaga<CartState>(context);
    });
    

    那么,初始命令的实际队列(接收端点)将是:

    configurator.ReceiveEndpoint("cart-state", endpoint =>
    {
        endpoint.ConfigureConsumeTopology = false;
        
        endpoint.Subscribe<CreateCart>("cart-state");
        
        endpoint.ConfigureSaga<CartState>(context);
    });
    

    您仍然可以像往常一样将 saga 状态机添加到容器中:

    services.AddMassTransit(x =>
    {
        x.AddSagaStateMachine<CartStateMachine, CartState>()
            .InMemoryRepository();
    
        x.UsingAzureServiceBus((context, cfg) => 
        {
            // bus configuration
        });
    });
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多