2017-05-09 47 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