azure - 控制 Azure 服务总线队列消息接收

标签 azure azure-servicebus-queues

我们有一个分布式架构,并且有一个需要调用的原生系统。挑战在于系统的容量不可扩展,并且无法同时承担更多的请求负载。我们已经实现了服务总线队列,其中有一个消息处理程序监听该队列并对 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/

相关文章:

azure - Microsoft Azure 设置服务器防火墙?

Azure B2C自定义策略,在输出声明中添加自定义用户属性

Azure 服务总线队列消息被卡住

azure - 监听队列(事件驱动,无轮询)服务总线/存储队列

c# - 如何删除 Azure 服务总线队列中的死信?

tomcat - Wicket URL with::在 MS Azure 下的 Tomcat 上失败

azure - 使用 SSH 连接 Azure CentOS VM 时,要求其他人无法访问您的私钥文件

ubuntu linux 上的 python : json.解码器.JSONDecodeError:期望值:第2行第6列

c# - Azure 服务总线队列在 NodeJs 中向 .NET 客户端发送消息

c# - ReceiveAsync 和 OnMessageAsync 之间的差异