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

时间:2020-09-11 15:19:01

标签: c# asp.net-core azure-servicebus-topics azure-servicebus-subscriptions

我有一个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 });

1 个答案:

答案 0 :(得分:1)

有预取的概念: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是默认锁定持续时间。

相关问题