Azure服务总线客户端连接持久性

本文关键字:连接 持久性 客户端 总线 服务 Azure | 更新日期: 2023-09-27 18:22:00

我在下面有一个关于Azure服务总线代码的基本包装,我们将在工作角色中使用该代码。每次运行工作者角色时,都会实例化此ServiceBusClient;然后用于访问队列,直到没有剩余的项目可以枚举为止。

public class ServiceBusClient : IDisposable, IServiceBusClient
{
    private const int DEFAULT_WAIT_TIME_IN_SECONDS = 120;
    private const string SERVICE_BUS_CONNECTION_STRING_KEY = "service.bus.connection.string";
    private readonly MessagingFactory _messagingFactory;
    private readonly NamespaceManager _namespaceManager;
    private readonly QueueClient _queueClient;
    private readonly ISettingsManager _settingsManager;
    public ServiceBusClient(ISettingsManager settingsManager, string queueName)
    {
        _settingsManager = settingsManager;
        var connectionString = _settingsManager.GetSetting<string>(SERVICE_BUS_CONNECTION_STRING_KEY);
        _namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
        _messagingFactory = MessagingFactory.CreateFromConnectionString(connectionString);
        _queueClient = GetOrCreateQueue(queueName);
    }
    public void Dispose()
    {
        _messagingFactory.Close();
    }
    public BrokeredMessage ReceiveTopMessage()
    {
        return _queueClient.Receive(TimeSpan.FromSeconds(DEFAULT_WAIT_TIME_IN_SECONDS));
    }
    public void SendMessage(object bodyObject)
    {
        var message = new BrokeredMessage(bodyObject);
        _queueClient.Send(message);
    }
    private QueueClient GetOrCreateQueue(string queueName)
    {
        var queue = !_namespaceManager.QueueExists(queueName)
                        ? _namespaceManager.CreateQueue(queueName)
                        : _namespaceManager.GetQueue(queueName);
        return _messagingFactory.CreateQueueClient(queue.Path, ReceiveMode.PeekLock);
    }
}

正如您所看到的,我在构造函数中初始化了NamespaceManagerMessagingFactoryQueueClient:然后在使用Dispose()方法关闭连接的情况下调用SendMessage()ReceiveTopMessage()时重用它们。

我的问题是我使用的方法是否安全;当工作角色枚举队列上的所有消息时,保持QueueClient的单个实例打开(一个可以在调用ReceiveTopMessage()之间长时间等待的过程中保持连接打开)是否能在没有暂时问题的情况下持续工作,或者每次打开和关闭连接是否谨慎?

作为旁白;Microsoft服务总线代码中的瞬态故障处理是如何进行的?它是默认进行的,还是我们需要实施瞬态故障处理框架?

Azure服务总线客户端连接持久性

QueueClient类使用由用于创建它的MessagingFactory对象管理的连接。建议对多个请求重用同一客户端对象。如使用服务总线代理消息的性能改进最佳实践:中所述

服务总线使客户端能够通过两个协议:服务总线客户端协议和HTTP。服务总线客户端协议更高效,因为它维护连接到服务总线服务,只要消息工厂存在。它还实现了批处理和预取。服务总线客户端协议可用于使用.NET托管的.NET应用程序API(…)服务总线客户端对象,如QueueClient或MessageSender,是通过MessagingFactory对象创建,该对象还提供连接的内部管理。您不应该关闭消息工厂或队列、主题和订阅客户端消息,然后在发送下一条消息时重新创建它们。关闭消息工厂将删除与服务总线的连接服务,并且在重新创建工厂建立连接是一项昂贵的操作,可能可以通过重新使用相同的工厂和客户端对象来避免多重操作。(…)由同一工厂共享一个TCP连接。

关于瞬态故障处理,QueueClient具有RetryPolicy属性,用于确定是否应重试请求。还有瞬态故障处理应用程序块,它取代了瞬态故障处理框架。

关于消息接收循环,有关于实现可靠消息接收循环的指导。微软已经认识到,很难实现一个写得好、有弹性的消息接收循环,因此他们引入了事件驱动的消息编程模型作为替代方案。