c# - ReceiveAsync 和 OnMessageAsync 之间的差异

标签 c# azure azureservicebus azure-servicebus-queues

服务工作线程有两种方法处理来自 Azure 服务总线队列的消息:

while (!ExitRequested)
{
    try
    {
        var message = await _queueClient.ReceiveAsync(TimeSpan.FromSeconds(1));

        if (message != null)
            ProcessIt(message);
    }
    catch (Exception ex)
    {
        HandleIt(ex);
    }
}

或使用EAP:

var onMessageOptions = new OnMessageOptions();

onMessageOptions.ExceptionReceived += (sender, args) => HandleIt(args.Exception);

_queueClient.OnMessageAsync(ProcessIt, onMessageOptions);

WaitFor(ExitRequested);

这两种方法各有什么优缺点?在哪种特定场景下应该选择哪一个?

最佳答案

ReceiveAsync 是 ASB .NET 客户端 API 的一部分。 OnMessage API 是 native ASB 客户端提供的一种简化并发消息泵创建的方法,允许您使用一些“开箱即用”的功能,这样您就不必手动处理这些功能。其中包括:

  1. 轻松将消息泵注册为回调
  2. 消息自动完成
  3. 自动续订超时以简化锁定 token 续订
  4. 处理并发泵/回调

当您需要灵 active 和严格控制事物时,这些优点也可以被视为缺点。例如,如果您需要控制消息完成的执行方式,您可以关闭自动完成功能并自行完成。但是,当您需要在回调中一次处理多条传入消息时,OnMessage API 不会让您这样做,因为它一次提供一条消息,您最好使用 [ReceiveBatchAsync][1] 。我有一个 post about OnMessage API您可以查看的好处。

Which one should be picked in which particular scenario?

这是您需要根据您的需求和架构自行回答的问题。如果您不需要对事物进行严格控制并且不需要一次处理一条消息(假设您可以同时执行多个消息处理),OnMessage API 是一个简单的开始路径,并且 ASB 客户端做得很好。如果您需要处理批处理并控制许多较低级别的方面,请使用 MessageSender/MessageReceiver方法。

关于c# - ReceiveAsync 和 OnMessageAsync 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40307723/

相关文章:

Azure.Messaging.ServiceBus 使用系统分配的托管标识创建 ServiceBusClient

c# - 调整 WPF TreeView 的下拉箭头边距

使用 SAML 和 azure Active Directory 的 Azure 自定义应用程序 SSO

Azure CLI - 如何使用特定的 "Description"创建新的客户端 key

azure - Azure.Messaging.ServiceBus 7.8.0 中不存在 ServiceBusClient

azure - Bicep - 将数组与循环配对

c# - 如何根据 C# 中单元格的特定值对矩形数组进行排序

c# - 通过读取 web.config 更改 Web 服务的 URL

c# - 在 asp.net 中创建日期时间选择器

xml - 资源所有者密码凭据流程在 Azure AD B2C 中不起作用