如何防止重复消息在 WebJob 处理时不插入到服务总线队列中?

Posted

技术标签:

【中文标题】如何防止重复消息在 WebJob 处理时不插入到服务总线队列中?【英文标题】:How do I prevent duplicate message not to be inserted in Service Bus Queue while WebJob processing? 【发布时间】:2015-04-25 17:36:58 【问题描述】:

我想确定如果队列中已经存在相同的消息,那么在 webjob 正在处理第一条消息时,应该忽略第二条消息(不插入队列)。

我尝试了以下代码:

 var namespaceManager =
                NamespaceManager.CreateFromConnectionString(connectionString);

            if (!namespaceManager.QueueExists(queueName))
            
                namespaceManager.CreateQueue(new QueueDescription(queueName)  RequiresDuplicateDetection = true );
            

属性RequiresDuplicateDetection 应确保消息重复。

 // Get messageFactory for runtime operation
            MessagingFactory messagingFactory = MessagingFactory.CreateFromConnectionString(connectionString);

            QueueClient queueClient = messagingFactory.CreateQueueClient("TestQueue");

            BrokeredMessage message = new BrokeredMessage();
            message.MessageId = "Localization";
            queueClient.Send(message);

但是webjob 会为每个 messageId 触发。我给了睡眠时间 150000 毫秒,但在此之前我尝试将相同的消息插入到同一个队列中,由于重复的消息,不应该插入。

我尝试了MSDN,但它在 Azure Webjob 中不起作用。

WebJob 代码:

public static void ProcessQueueMessage([ServiceBusTrigger("TestQueue")] BrokeredMessage message, TextWriter log)
        
 log.WriteLine("Webjob Start" + message.MessageId + DateTime.Now);
            Thread.Sleep(150000);
            log.WriteLine("Webjob End" + message.MessageId + DateTime.Now);
        

【问题讨论】:

【参考方案1】:

重复消息检测基于MessageIdBrokeredMessage。 Azure 产品团队有一个示例说明此功能here。

【讨论】:

不幸的是,这不起作用:(重复检测检查 SB 在过去 x 秒/分钟内是否收到了相同 ID 的消息,并且不检查该消息是否存在于队列中。跨度> 正确:“启用重复检测有助于跟踪在指定时间窗口内发送到队列或主题的所有消息的应用程序控制的 MessageId。” docs.microsoft.com/en-us/azure/service-bus-messaging/…

以上是关于如何防止重复消息在 WebJob 处理时不插入到服务总线队列中?的主要内容,如果未能解决你的问题,请参考以下文章

连续 WebJob 自动停止

WebJob 一次处理来自队列的多条消息

如何基于 Azure 中的服务总线队列自动缩放 Python webjob?

触发插入 - 防止插入重复 ID

如何在没有“始终开启”的情况下保持 Azure WebJob 运行

kafka重复消费的原因