C# Azure服务总线队列客户端性能

C# Azure服务总线队列客户端性能,c#,azure,azureservicebus,C#,Azure,Azureservicebus,在这个问题上,我很难从谷歌获得好的点击率。我有一个web应用程序,它利用QueueClient在用户创建记录时对消息进行排队。我想要的是一种“点燃并遗忘,但理智中信任”的方式。也就是说: 我希望能够向总线发送消息并立即返回(这样用户就不必等待) 我希望消息在本地汇集(缓冲?批处理?),以便系统在给定的时间段内一次发送1,5,50条消息。因此,“当缓冲时间超过10秒或5秒时发送” 缓冲区被分页到磁盘,这样,如果系统重新启动或其他什么,它将再次尝试传递 如果其他一切都失败了,那好吧 我觉得我已经

在这个问题上,我很难从谷歌获得好的点击率。我有一个web应用程序,它利用QueueClient在用户创建记录时对消息进行排队。我想要的是一种“点燃并遗忘,但理智中信任”的方式。也就是说:

  • 我希望能够向总线发送消息并立即返回(这样用户就不必等待)
  • 我希望消息在本地汇集(缓冲?批处理?),以便系统在给定的时间段内一次发送1,5,50条消息。因此,“当缓冲时间超过10秒或5秒时发送”
  • 缓冲区被分页到磁盘,这样,如果系统重新启动或其他什么,它将再次尝试传递
  • 如果其他一切都失败了,那好吧
我觉得我已经读过QueueClient中的缓冲/批处理,但现在我找不到任何相关内容。在web应用程序中跨线程(请求)重复使用QueueClient安全吗

是否有人提出了实现上述目标的模式或框架

目前,我正在静态变量(_client)中缓存共享QueueClient—这可能不正确。我应该缓存并重用客户端还是工厂

private static QueueClient GetQueueClient()
    {
        if (_client == null || _client.IsClosed)
        {
            // Create management credentials
            TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(
                Settings.ServiceBusIssuer, 
                Settings.ServiceBusIssuerKey);

            //create the client object for the queue
            MessagingFactory factory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", "Magic", string.Empty), credentials);

            string queueName = Crelate.Properties.Settings.Default.ServiceBusQueueName;
            QueueClient client = factory.CreateQueueClient(queueName);
            _client = client;

            return client;
        }

        return _client;
    }
然后我就这么做了,这显然不是我想要的:

QueueClient client = GetQueueClient();
BrokeredMessage msg = new BrokeredMessage(opInfo);
msg.MessageId = "SomeUsefulId";
await Task.Factory.FromAsync(client.BeginSend, client.EndSend, msg, null);
谢谢你的时间和想法

当然,在写了所有这些之后,我发现了以下几点:


(其中提到了客户端批处理和重试逻辑)

客户端批处理确实将是我的答案。很好,我仍然希望有一种真正可靠的方式来信任客户端批处理。理想情况下,我希望fire和forget。