Azure 服务总线重试策略的 minbackoff 不起作用?
Azure Service Bus Retry Policy's minbackoff doesn't work?
我正在尝试使队列的重试逻辑正常工作,但我遇到了问题。 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,使其立即显示。
您可以选择以下几个选项:
- 克隆一条消息,将
ScheduledEnqueueTimeUtc
设置为您想要的延迟,发送它,然后完成原始消息。
- 延迟您的消息,但您只能在
SequenceNumber
之前收到它。在这种情况下,您可以创建一条包含原始消息序列号作为有效负载的新消息,安排新消息并发送它。这样您就可以准确计算原始邮件的送达次数。
理想情况下,放弃具有时间跨度的消息会很好,但对于当前 API。
这是不可能的
我正在尝试使队列的重试逻辑正常工作,但我遇到了问题。 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,使其立即显示。
您可以选择以下几个选项:
- 克隆一条消息,将
ScheduledEnqueueTimeUtc
设置为您想要的延迟,发送它,然后完成原始消息。 - 延迟您的消息,但您只能在
SequenceNumber
之前收到它。在这种情况下,您可以创建一条包含原始消息序列号作为有效负载的新消息,安排新消息并发送它。这样您就可以准确计算原始邮件的送达次数。
理想情况下,放弃具有时间跨度的消息会很好,但对于当前 API。
这是不可能的