【问题标题】:Service Fabric cluster. Statefull service. Service Bus queue usageService Fabric 群集。有状态的服务。服务总线队列使用情况
【发布时间】:2017-10-08 09:17:19
【问题描述】:

完全披露:我是 Service Fabric 开发的新手。这是我的情况。我们有 Service Fabric 集群。我们在那里部署了有状态服务。服务有指定的服务总线队列,它监听。所以集群中所有节点上的所有服务实例都监听同一个服务总线队列。每个服务实例向服务总线队列注册 OnMessage 回调以处理如下消息:

  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);
   }

现在,根据日志中的消息,看起来所有服务实例都拾取了已同时放入队列的消息。这不构成一件好事。 问题是:

当队列中的每条消息只能由一个服务实例提取时,是否可以使用服务总线队列?

【问题讨论】:

    标签: c# azure-service-fabric azure-servicebus-queues


    【解决方案1】:

    队列客户端默认receive modePeekLock,并且将AutoComplete属性设置为false,客户端收到消息后不会自动删除消息。锁过期后,消息将再次可用,其他服务实例可以再次接收和处理。

    当队列中的每条消息只能由一个服务实例提取时,是否可以使用服务总线队列?

    您可以将 AutoComplete 属性设置为 true,或者在客户端收到并处理完消息后调用 Complete method

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

    【讨论】:

    • 嗯,这是我的眼罩。我一直在调用 Abandon 方法,认为它会将消息发送到死信队列。:) 当我切换到死信方法时,一切都神奇地再次开始变得有意义。感谢您帮助我走上正轨。
    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 2018-11-12
    • 1970-01-01
    • 2017-06-22
    • 2018-03-30
    • 2017-01-16
    • 2016-04-30
    • 2016-11-16
    相关资源
    最近更新 更多