我们有一个分布式架构,并且有一个需要调用的原生系统。挑战在于系统的容量不可扩展,并且无法同时承担更多的请求负载。我们已经实现了服务总线队列,其中有一个消息处理程序监听该队列并对 native 系统进行调用。当前的挑战是每当队列中发布消息时,消息处理程序就会立即处理该请求。但是,我们希望有一个场景一次只处理两个请求。选择其中两个,进行处理,然后继续处理下两个。服务总线队列是否提供内置选项来控制它,还是我们只能使用自定义逻辑?
var options = new MessageHandlerOptions()
{
MaxConcurrentCalls = 1,
AutoComplete = false
};
client.RegisterMessageHandler(
async (message, cancellationToken) =>
{
try
{
//Handler to process
await client.CompleteAsync(message.SystemProperties.LockToken);
}
catch
{
await client.AbandonAsync(message.SystemProperties.LockToken);
}
}, options);
最佳答案
消息处理程序 API 专为并发性而设计。如果您想在任何给定时间点处理两条消息,那么最大并发数为 2 的 Handler API 将是您的答案。如果您需要在任何给定时间点处理一批两条消息,则不需要此 API。相反,请使用 Mikolaj 提供的答案中概述的较低级别 API 来构建您自己的消息泵。
不过要小心重新锁定消息。这不是一个有保证的操作,因为它是客户端操作,如果有通信网络,当前,代理将重置锁,并且如果横向扩展,消息将由另一个竞争的消费者再次处理。这就是为什么在您的场景中进行扩展可能会成为一个挑战。
另外一点是关于接收多条消息时 MessageReceiver
的较低级别 API - ReceiveAsync(n)
确实不 保证 n
条消息会被检索到。如果您绝对必须有 n
条消息,则需要循环以确保有 n
条消息且不少于。
关于管理客户端和获取队列消息计数的最后一点 - 强烈建议不要这样做。管理客户端不适合在运行时频繁使用。相反,它用于偶尔的调用,因为这些调用非常慢。鉴于您最终可能会得到一个处理端点一次只能处理两条消息(甚至不是每秒)的结果,这些调用将增加总的处理时间。
关于azure - 控制 Azure 服务总线队列消息接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63171548/