2017-05-09 3 views
0

전체 공개 : 나는 Service Fabric 개발을 처음 사용합니다. 여기에 내 상황이있다. 서비스 패브릭 클러스터가 있습니다. 우리는 거기에 상태있는 서비스를 배포했습니다. 서비스가 수신 대기중인 서비스 버스 큐를 지정했습니다. 따라서 클러스터의 모든 노드에있는 모든 서비스 인스턴스는 동일한 서비스 버스 큐를 수신 대기합니다. 각 서비스 인스턴스는 다음과 같이 메시지를 처리하기 위해 서비스 버스 큐의 onMessage 콜백을 등록 : 이제서비스 패브릭 클러스터 Statefull 서비스. 서비스 버스 큐 사용량

QueueClient Queue = QueueClient.CreateFromConnectionString(
           GetServicebusConnectionString(), 
           ConfigData.SERVICE_QUEUE_NAME); 
    if (Queue != null) 
    { 
     var options = new OnMessageOptions(); 
     options.AutoComplete = false; 

     Queue.OnMessage((receivedMessage) => 
          ProcessMessage(receivedMessage), options); 
    } 

를, 모든 서비스 인스턴스가 동시에 큐에 배치 된 그 메시지를 데리러 것 같습니다 로그의 메시지에 따라 . 그게 좋은 일이 아니야. 질문은 다음과 같습니다

는 큐에서 각 메시지는 하나 개의 서비스 인스턴스에 의해 선택 될 수있는 방식으로 서비스 버스 큐를 사용할 수 있습니까?

답변

1

큐 클라이언트의 기본 receive mode은 PeekLock, 당신은 클라이언트가 메시지를 수신 후 자동으로 메시지를 삭제하지 것이다 false로 자동 완성 속성을 설정합니다. 잠금이 만료되면 메시지를 다시 사용할 수있게되고 다른 서비스 인스턴스가 다시 수신하고 처리 할 수 ​​있습니다.

대기열의 각 메시지가 하나의 서비스 인스턴스에서만 수집되는 방식으로 서비스 버스 대기열을 사용할 수 있습니까?

클라이언트가 메시지를 받고 처리 한 후에는 AutoComplete 속성을 true로 설정하거나 Complete method을 호출 할 수 있습니다.

Queue.OnMessage((receivedMessage) => 
       { ProcessMessage(receivedMessage); receivedMessage.Complete(); }, options); 
+0

글쎄, 내 눈이 멀었다. 나는 Abandon 메서드를 호출하여 데드 레터 큐에 메시지를 보낼 것이라고 생각했습니다. :) Deadletter 메서드로 전환하면 모든 것이 마술처럼 다시 시작되었습니다. 올바른 방향으로 나아갈 수 있도록 도와 주셔서 감사합니다. – fatherOfWine

관련 문제