Wiederverwenden von Verbindungen in Azure Service Bus

Wir haben eine auf Windows Azure gehostete API in einer Webrolle mit 2 Instanzen, die Anforderungen entgegennimmt, validiert und anschließend einer Azure Service Bus-Warteschlange hinzufügt.

Kürzlich haben wir begonnen, dies zu testen und festgestellt, dass unser aktueller Code die folgende Ausnahme auslöst:

Befehl konnte nicht zur Befehlswarteschlange hinzugefügt werden Ausnahme: Microsoft.ServiceBus.Messaging.QuotaExceededException: Die Anzahl der maximal zulässigen Verbindungen wurde für die Warteschlange erreicht oder überschritten. Anzahl der aktiven Verbindungen: 100, Maximal zulässige Verbindungen: 100.

Würde der folgende Client-Code eine einzelne Verbindung offen halten, vorausgesetzt, wir hätten eine einzelne Instanz der Klasse beibehalten? Ich versuche festzustellen, ob es sich um ein Problem mit dem ServiceBusClient-Code oder unserer Abhängigkeitsregistrierung handelt, mit der für jede Anforderung ein neuer Client initialisiert wird.

public class ServiceBusClient : IDisposable
{
    #region Constants and Fields

    protected readonly NamespaceManager NamespaceManager;

    private const int DEFAULT_LOCK_DURATION_IN_SECONDS = 300; // 5 minutes 

    private const string SERVICE_BUS_CONNECTION_STRING_KEY 
                            = "service.bus.connection.string";

    private readonly IMessageBodySerializer _messageBodySerializer;

    private readonly MessagingFactory _messagingFactory;

    private readonly QueueClient _queueClient;

    private readonly string _queueName;

    private readonly ISettingsManager _settingsManager;

    #endregion

    #region Constructors and Destructors

    public ServiceBusClient(
        ISettingsManager settingsManager, 
        IMessageBodySerializer messageBodySerializer, s
        tring queueName)
    {
        _settingsManager = settingsManager;
        _messageBodySerializer = messageBodySerializer;

        var connectionString = _settingsManager.GetSetting<string>(
            SERVICE_BUS_CONNECTION_STRING_KEY);

        NamespaceManager = 
            NamespaceManager.CreateFromConnectionString(connectionString);

        _messagingFactory = 
            MessagingFactory.CreateFromConnectionString(connectionString);

        _queueName = queueName;
        _queueClient = GetOrCreateQueue();
    }

    #endregion

    #region Public Methods and Operators

    public virtual void SendMessage(object bodyObject)
    {
        var brokeredMessage = 
            _messageBodySerializer.SerializeMessageBody(bodyObject);

        _queueClient.Send(brokeredMessage);
    }

    public void Dispose()
    {
        _messagingFactory.Close();
    }

    #endregion

    #region Methods

    private QueueClient GetOrCreateQueue()
    {
        QueueDescription queue;

        if (!NamespaceManager.QueueExists(_queueName))
        {
            var queueToCreate = new QueueDescription(_queueName)
            {
                LockDuration = TimeSpan.FromSeconds(
                    DEFAULT_LOCK_DURATION_IN_SECONDS)
            };

            queue = NamespaceManager.CreateQueue(queueToCreate);
        }
        else
        {
            queue = NamespaceManager.GetQueue(_queueName);
        }

        return _messagingFactory.CreateQueueClient(
                        queue.Path, 
                        ReceiveMode.PeekLock);
    }

    #endregion
}

Als Erweiterung dazu; wenn der obige Code eine aktive Verbindung offen hält; Wäre die Verwendung des Singleton-Musters zum Speichern einer Instanz des ServiceBusClient für jede Instanz der API gefährlich? Oder verarbeitet das Azure SDK geschlossene Verbindungen intern?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage