如何从azure服务总线主题订阅同时接收N条消息

问题描述

我有一个Azure Service Bus主题订阅,消息不断增加

下面的代码基本上是一次接收一条消息并将其处理并将相关结果存储到数据库中。

我尝试设置MaxConcurrentCalls to 10,但是由于数据库的工作设计,它耗尽了我的数据库连接池。

因此,我想一次从订阅获取10条消息(以N条消息的批次接收),并希望通过一个数据库调用进行处理。

我没有看到任何批处理api选项,这可能吗?

我正在使用Microsoft.Azure.ServiceBus nuget版本4.1.1

 _subscriptionClient = new SubscriptionClient(connectionString,topicName,subscriptionName);

            // Register the callback method that will be invoked a message of interest is received
            _subscriptionClient.RegisterMessageHandler(
                async (message,token) =>
                {
                    if (await ProcessMessage(message,token))
                    {
                        await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
                    }
                },new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 1,AutoComplete = false });

解决方法

有预取的概念:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements?tabs=net-framework-sdk#prefetching

通过预取,队列或订阅客户端可以在执行接收操作时从服务中加载其他消息。

在此处检查收货批次:https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.subscriptionclient.receivebatch?view=azure-dotnet

示例:

SubscriptionClient client = SubscriptionClient.CreateFromConnectionString(connectionString,topic,subName);
client.PrefetchCount = 10;
IEnumerable<BrokeredMessage> messageList = client.ReceiveBatch(5);

Prefetch应该大于或等于您期望从ReceiveBatch接收的消息数。

Prefetch最多可以是每秒处理的消息数的n / 3倍,其中n是默认锁定持续时间。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...