2017-09-16 2 views
0

대용량 전송에서 사가를 사용하여 여러 서비스에서 활동을 조율하는 방법을 조사 중입니다. 무용담의 수명은 짧습니다 - 모두 잘되면 2 초 미만입니다.masstransit deferred in sagas

내 경우에는 클라이언트가 명령을 요청하고, 사가가 해당 명령을 처리하고, 메시지가 수신 될 때 일부 상태 변경을 거쳐 결국 첫 번째 명령에 응답하는 요청/응답 방식을 사용하고자합니다. 무용담을 시작한 시점에서 클라이언트는 응답을 받고 무용담의 결과를 표시 할 수 있습니다.

이 시점에서 볼 수 있듯이 컨텍스트는 더 이상 초기 요청을 인식하지 못합니다. 이 방법으로받은 메시지에 어떻게 회신 할 수 있습니까? 첫 번째 이벤트를 처리 할 때 사가 데이터에 유지할 수있는 무언가가 있으며 나중에 회신하기 위해 사용할 수 있습니까? 요청을 처리 할 때

// client 
var response = await client.Request(requestMessage); 

// saga 
During(SomeState, 
    When(RequestReceived) 
     .Then(...) 
     .Respond(c => MakeResponseMessage(c)) 
     .TransitionTo(Whatever) 
) 

그래서 당신이 응답 할 수 있습니다 :

답변

0

감사합니다. Alexey. 나는 사가 (Saga)에 원본 메시지의 ResponseAddress와 RequestId를 저장하고 나중에 Send()를 구성 할 수 있다는 것을 깨달았다.

응답

var responseEndpoint = await ctx.GetSendEndpoint(responseAddress); 
await responseEndpoint.Send(message, c => c.RequestId = requestId); 
보내기 원래 요청

MassTransit.EntityFrameworkIntegration.Saga.EntityFrameworkSagaConsumeContext<TSagaData, TMessage> payload; 

    if (ctx.TryGetPayload(out payload)) 
    {     
     ResponseAddress = payload.ResponseAddress; 
     RequestId = payload.RequestId ;       
    } 

의 응답 정보 얻기

0

현재 무용담 상태 머신이 같은 즉각적인 대응을 할 만 할 수 있습니다.

이전에 수신 한 것에 응답하려면 직접 요청/응답 대화를 만들어야합니다. 즉, 응답을 분리해야하므로 응답 메시지에 대해 메시지를 보내고 소비하는 소비자가 있어야합니다. 이것은 완전히 비동기적인 사업이 될 것입니다.