【问题标题】:masstransit deferred respond in sagassagas 中的公共交通延迟响应
【发布时间】:2017-09-16 13:15:50
【问题描述】:

我正在研究在公共交通中使用 sagas 来协调跨多个服务的活动。 saga 的生命周期很短 - 如果一切顺利,不到 2 秒。

对于我的用例,我想使用请求/响应方法,即客户端请求命令,saga 处理该命令,在收到消息时经历一些状态更改,并最终响应发起的第一个命令saga,此时客户端收到响应并可以显示 saga 的结果。

据我所知,到此为止,上下文不再知道初始请求。如何回复以这种方式收到的消息?在处理第一个事件时,我可以将某些东西持久保存到 saga 数据中,然后用它来回复吗?

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    谢谢阿列克谢。我意识到我可以将原始消息中的 ResponseAddress 和 RequestId 存储在 saga 上,然后再构造一个 Send()。

    从原始请求中获取响应详细信息

    MassTransit.EntityFrameworkIntegration.Saga.EntityFramework
    
        SagaConsumeContext<TSagaData, TMessage> payload;
        if (ctx.TryGetPayload(out payload))
        {                
           ResponseAddress = payload.ResponseAddress;
           RequestId = payload.RequestId ;                          
        }
    

    发送响应

    var responseEndpoint = await ctx.GetSendEndpoint(responseAddress);
    await responseEndpoint.Send(message, c => c.RequestId = requestId);
    

    更新:documentation 已更新以包含更完整的示例。

    【讨论】:

      【解决方案2】:

      目前,saga 状态机只能这样立即响应:

      // client
      var response = await client.Request(requestMessage);
      
      // saga
      During(SomeState,
          When(RequestReceived)
              .Then(...)
              .Respond(c => MakeResponseMessage(c))
              .TransitionTo(Whatever)
      )
      

      因此您可以在处理请求时做出响应。

      如果您想回复之前收到的内容,则必须自己制作请求/回复对话。我的意思是你必须有解耦的响应,所以你需要发送一条消息并有一个完整的消费者来回复消息。这将是完全异步的业务。

      【讨论】:

        猜你喜欢
        • 2021-07-31
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        相关资源
        最近更新 更多