【问题标题】:how to receive N number of messages at time from azure service bus topic subscription如何从 Azure 服务总线主题订阅一次接收 N 条消息
【发布时间】:2020-12-30 03:28:54
【问题描述】:

我有一个 Azure 服务总线主题订阅,其中消息不断增加。

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

我尝试设置 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 });

【问题讨论】:

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


    【解决方案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);
    

    预取应大于或等于您希望从 ReceiveBatch 接收的消息数。

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

    【讨论】:

    • 感谢@Athanasios Kataras。任何关于此的代码示例或教程链接都会对我有所帮助。你能分享一下吗。我没有看到类似_subscriptionClient.ReceiveBatch
    • 谢谢。如果我这样做 _subscriptionClient = new SubscriptionClient(connectionString, topicName, subscriptionName); ,那么我不会得到像 _subscriptionClient .ReceiveBatch(100) 这样的任何方法。当我在做SubscriptionClient client = SubscriptionClient.CreateFromConnectionString(connectionString, topicName, subscriptionName); 时,我收到错误'SubscriptionClient' does not contain a definition for 'CreateFromConnectionString'。同时使用 nuget WindowsAzure.ServiceBusMicrosoft.Azure.ServiceBus
    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多