2017-05-09 111 views
0

完全披露:我是服務結構開發的新手。這是我的情況。我們有服務架構集羣。我們在那裏部署了有狀態服務。服務指定了它監聽的服務總線隊列。因此,羣集中所有節點上的所有服務實例都監聽同一個Service Bus隊列。每個服務實例註冊的onMessage回調與服務總線隊列處理消息是這樣的:服務Fabric羣集。完善的服務。服務總線隊列使用情況

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 modePeekLock,並設置自動完成屬性設置爲false,客戶端收到消息後,不會自動刪除郵件。鎖定過期後,該消息將再次可用,其他服務實例可以再次接收並處理它。

當從隊列中的每條消息只能被一個服務實例獲取時,是否可以使用服務總線隊列?

您可以將AutoComplete屬性設置爲true,或者在客戶端收到並處理消息後調用Complete method

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

那麼,這是我的盲目。我一直在呼籲放棄方法,認爲它會發送消息給死信隊列。:)當我切換到Deadletter方法時,一切都神奇地開始有意義了。感謝您幫助我走上正軌。 – fatherOfWine