gpt4 book ai didi

Azure 服务总线重试策略的 minbackoff 不起作用?

转载 作者:行者123 更新时间:2023-12-03 05:06:42 24 4
gpt4 key购买 nike

我正在尝试让队列的重试逻辑正常工作,但遇到了问题。 minBackoff 变量似乎实际上不起作用。我在日志中看到,收到一条消息然后失败,然后几乎立即重试。我的 minBackoff 设置为 600 秒。

这是设置查询的代码:

 NamespaceManager nsManager = NamespaceManager.CreateFromConnectionString(connectionString);
nsManager.Settings.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(5),
maxBackoff: TimeSpan.FromSeconds(30),
maxRetryCount: 3);

if (!nsManager.QueueExists(queueName))
{
nsManager.CreateQueue(queueName);
}
else
{
nsManager.DeleteQueue(queueName);
nsManager.CreateQueue(queueName);
}

QueueClient client = QueueClient.CreateFromConnectionString(connectionString, queueName);


client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15),
maxBackoff: TimeSpan.FromSeconds(600),
maxRetryCount: 3);
for (int i = 0; i < 2000; i++)
{
UserCreationSubmitted creationMessage = new UserCreationSubmitted()
{
CreationStatus = "Step 1",
Id = Guid.NewGuid(),
UserName = "user number " + i,
Userid = Guid.NewGuid()
};

BrokeredMessage message = new BrokeredMessage(creationMessage);
client.Send(message);

}

这里的代码没有按照我认为应该的方式工作......

client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15),
maxBackoff: TimeSpan.FromSeconds(600),
maxRetryCount: 3);

client.OnMessage(message =>
{

UserCreationSubmitted msg = message.GetBody<UserCreationSubmitted>();
Console.WriteLine("------------------------------");
Console.WriteLine($"Body {msg.UserName}");

Random rnd = new Random();
int ranNum = rnd.Next(0, 9);
if (msg.UserName.Contains(ranNum.ToString()))
{
Console.WriteLine("!!!Error!!!");
Console.WriteLine("------------------------------");
throw new Exception();
}
});

有谁知道为什么 minbackoff 和 maxbackoff 似乎在这里不起作用?奇怪的是 maxRetryCount 像士兵一样工作,所以我想这肯定是我的实现中的某些东西导致其他人无法工作。

最佳答案

RetryExponential 由 ASB 客户端在接收消息失败时使用进行重试。在您的代码中,收到消息后,在 OnMessage API 回调中进行处理期间会引发异常。 OnMessage API 将abandon the message ,使其立即显示。

您可以采取以下几种选择:

  1. 克隆一条消息,将 ScheduledEnqueueTimeUtc 设置为您想要的延迟,发送该消息,然后完成原始消息。
  2. 推迟您的消息,但您只能通过SequenceNumber接收它。在这种情况下,您可以创建一条新消息,其中包含原始消息序列号作为有效负载,安排新消息并发送它。这样您就可以对原始邮件的递送计数进行准确计数。

理想情况下,放弃带有时间跨度的消息会很好,但当前的 API 无法做到这一点。

关于Azure 服务总线重试策略的 minbackoff 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40642350/

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