【问题标题】:Multiple clients for single Azure Service Bus queue单个 Azure 服务总线队列的多个客户端
【发布时间】:2016-04-07 22:00:20
【问题描述】:

我有几个客户端应用程序等待从 Azure 服务总线队列中取出消息作业。

一旦客户有工作,我不希望任何其他客户端应用程序接收工作。

如果所有客户端都实现了 Queue.OnMessage() 以收到消息到达的通知,我如何确保 2 个或更多客户端不接收消息?

【问题讨论】:

  • 你能说清楚吗?您是否要求 1 个消费者应该只收到一种类型的消息,而其他人不应该,或者当一个消费者收到其他人不应该收到的任何消息时?如果你说清楚并举个例子就更好了。

标签: azure servicebus


【解决方案1】:

我的理解是,一旦你的一个工作人员从队列中得到一个项目,它就会在一定的可配置时间(租约)内对其他人不可见。如果工作人员成功完成了作业,它会通知队列可以删除该项目。如果工作人员失败,它可以通知队列将项目移动到死信队列,如果工作人员死亡,则项目在其他工作人员的租用时间后变得可见。项目中应该有一个属性(由 ServiceBus 设置)指示项目被传递了多少次。还有一个 TTL(生存时间),在此之后项目将自动移动到死信队列。

【讨论】:

    【解决方案2】:

    为了避免这种使用队列的情况,您可以使用Azure Service Bus 的会话功能。

    您需要先创建一个会话感知队列,然后再执行任何其他操作,可以按如下方式完成。

    // Create a queue with duplicate detection
    // with a detection history window of one hour,
    // and requires sessions.
    
    QueueDescription rfidCheckoutQueueDescription = new QueueDescription("rfidcheckout")
    {
    
        RequiresSession = true,
    
        RequiresDuplicateDetection = true,
    
        DuplicateDetectionHistoryTimeWindow = new TimeSpan(0, 1, 0)
    
    };
    
    // Create a queue that supports duplicate detection.
    namespaceMgr.CreateQueue(rfidCheckoutQueueDescription);
    

    设置会话感知队列后,您必须为消息设置SessionId 属性并使用MessageSession 而不是QueueClient 接收消息。

    为此可以找到一些代码示例: Sending Messages, Receiving Messages.

    【讨论】:

    • 如果您想将特定消息路由到特定消费者,会话很有用。如果一个人想简单地分配负载并确保一个项目只被处理一次你不应该需要会话
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2016-02-25
    相关资源
    最近更新 更多