Безопасен ли класс Azure ServiceBus MessageSender для запуска как одноэлементный в долговременном процессе?

#c# #azure #.net-core #azureservicebus

#c# #azure #.net-core #azureservicebus

Вопрос:

У меня есть длительный процесс, который просыпается, выполняет некоторую задачу и может нуждаться или не нуждаться в публикации сообщения через MessageSender служебную шину Azure. Если я смогу создать MessageSender одноэлементный, это немного упростит мой код, поэтому я хотел бы, чтобы он был жизнеспособным.

Чтобы уточнить, я ожидаю, что этот процесс может продолжаться в течение очень длительных периодов времени (по крайней мере, часов, возможно, дней) без отправки каких-либо сообщений на служебную шину.

Супер-упрощенный пример:

 public async Task WorkLoop(CancellationToken token)
{
    while (!token.IsCancellationRequested)
    {
        var result = DoWork();
        if (result.shouldPublish)
        {
            var message = buildMessage(result);
            await _messageSender.SendAsync(message);
        }
        await Task.Delay(sleepDuration, token);
    }
}
  

Есть ли какие-либо последствия для поддержания MessageSender экземпляра в рабочем состоянии в течение длительного времени (по крайней мере, дней, возможно, недель или месяцев)?

Ответ №1:

В соответствии с рекомендациями по повышению производительности с использованием обмена сообщениями служебной шины:

Не рекомендуется закрывать фабрики обмена сообщениями или клиенты очередей, тем и подписок после отправки сообщения, а затем повторно создавать их при отправке следующего сообщения. […] Вы можете безопасно использовать эти клиентские объекты для одновременных асинхронных операций и из нескольких потоков.

Комментарии:

1. Это полезно, но не дает точного ответа на вопрос. Я ищу любые потенциальные недостатки использования одного MessageSender экземпляра в течение длительного периода времени. Я также добавил уточнение, что я ожидаю, что в моем процессе будут длительные промежутки между отправкой сообщений, если это имеет значение.