当前位置: 首页 > 知识库问答 >
问题:

Azure服务总线有毒消息处理的最佳实践主题

范飞翰
2023-03-14

在重试次数达到主题订阅的maxDeliveryCount设置之前,处理来自Azure Service Bus的有毒消息(在使用时引发异常)可能导致循环。

  1. Azure Service bus添加的消息的SequenceNumber是否在每次失败尝试时持续增加,直到达到MaxDeliveryCount
  2. MaxDeliveryCount设置为1是处理有毒消息最佳实践,这样使用者就不会在消息失败时尝试两次处理

共有1个答案

韶和璧
2023-03-14

最佳实践取决于您的应用程序和重试方法。

大多数时候我注意到消息失败了

>

  • 从属服务不可用(Redis,SQL连接问题)

    internal class Program
        {
            private static string connectionString = ConfigurationSettings.AppSettings["GroupAssetConnection"];
            private static string topicName = ConfigurationSettings.AppSettings["GroupAssetTopic"];
            private static string subscriptionName = ConfigurationSettings.AppSettings["GroupAssetSubscription"];
            private static string databaseEndPoint = ConfigurationSettings.AppSettings["DatabaseEndPoint"];
            private static string databaseKey = ConfigurationSettings.AppSettings["DatabaseKey"];
            private static string deadLetterQueuePath = "/$DeadLetterQueue";
    
            private static void Main(string[] args)
            {
    
                try
                {
                    ReadDLQMessages(groupAssetSyncService, log);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }
                finally
                {
                    documentClient.Dispose();
                }
                Console.WriteLine("All message read successfully from Deadletter queue");
                Console.ReadLine();
            }
    
            public static void ReadDLQMessages(IGroupAssetSyncService groupSyncService, ILog log)
            {
                int counter = 1;
                SubscriptionClient subscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, topicName, subscriptionName + deadLetterQueuePath);
                while (true)
                {
                    BrokeredMessage bmessgage = subscriptionClient.Receive(TimeSpan.FromMilliseconds(500));
                    if (bmessgage != null)
                    {
                        string message = new StreamReader(bmessgage.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();
                        syncService.UpdateDataAsync(message).GetAwaiter().GetResult();
                        Console.WriteLine($"{counter} message Received");
                        counter++;
                        bmessgage.Complete();
                    }
                    else
                    {
                        break;
                    }
                }
    
                subscriptionClient.Close();
            }
        }
    

    我不会推荐maxDeliveryCount=1。如果发生某些网络/连接问题,内置重试将处理并从队列中清除。当我在一个金融应用程序中工作时,我保留了maxDeliveryCount=5,而我的IoT应用程序中保留了maxDeliveryCount=3

    如果您正在批量读取消息,则在任何消息中发生错误时,一个完整的批处理将重新处理。

    SequenceNumber序列号作为唯一标识符可以信任,因为它是由中央和中立机构而不是由客户端分配的。它还表示真实的到达顺序,并且比作为顺序标准的时间戳更精确,因为时间戳在极端的消息速率下可能没有足够高的分辨率,并且在代理所有权在节点之间转换的情况下可能受到(尽管最小的)时钟偏斜。

  •  类似资料:
    • 我们目前正在利用Azure服务总线来处理来自应用程序的各种消息。 我想知道实时处理这些消息的最佳方式是什么? 有没有一种方法可以在消息放入队列时自动执行脚本? 我只是在想,一定有比让一个单独的应用程序每分钟/30秒检查一次队列更好的方法。 谢谢各位

    • 参考https://github.com/Azure/azure-service-bus/tree/master/samples/dotnet/gettingstart/microsoft.Azure.servicebus/basicsendreceiveusingtopicsubscriptionclient,我了解Azure服务总线主题的一般工作方式,我的问题更多地是关于它实际上是如何工作的。

    • 我在Azure Service Bus中使用代理消息传递(主题/订阅),我很好奇如何(或者是否)使用SSL保护通信。

    • 我正在尝试在Azure中构建一个简单的WebAPI REST服务,后端有一个服务总线队列工作器。我可以从Web API向工作人员发送一条消息。然而,我试图发送更多的信息,只是为了看看一切是如何运作的。因此,我创建了一个简单的控制器,如下所示: 当我呼叫控制器时,我只收到工作人员接收到的大约1/2的消息。其余的似乎都被放弃了。

    • 我正在使用Azure服务总线主题机制。此外,我已经将消息发送到主题,并希望通过编程方式检查是否将消息发送到主题。 代码: 有没有办法获得响应或状态代码?