gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:58:30 25 4
gpt4 key购买 nike

处理来自 Azure 服务总线的有害消息(使用时抛出异常)可能会导致循环,直到重试次数达到主题订阅的 maxDeliveryCount 设置。

  1. Azure 服务总线添加的消息的 SequenceNumber 是否在每次尝试失败时不断增加,直至达到 maxDeliveryCount
  2. 设置 maxDeliveryCount = 1 是处理有害消息的最佳实践,这样消费者一旦失败就不会尝试两次处理消息

最佳答案

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

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

  1. 依赖服务不可用(Redis、SQL 连接问题)

  2. 错误消息(消息没有强制参数或某些值不正确)

  3. 处理代码问题(消息处理代码中的错误)

对于第一个和第三个场景,我创建了 C# Web 作业来运行和重新处理死信消息。

下面是我的代码

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

对于第二种情况,我们手动验证死信消息(自定义 UI/服务总线探索),有时我们更正消息数据,有时我们清除消息并清除队列。

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

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

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

关于azure - Azure 服务总线主题的有害消息处理最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61168891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com