Оболочка MessageSender служебной шины Azure - PullRequest
0 голосов
/ 05 марта 2019

У меня был вопрос о вашем опыте разработки оболочек для класса MessageSender.Я не мог найти настоящих корпоративных примеров.У меня есть компонент, который имеет единственную цель отправлять сообщения в очередь.Моя пропускная способность довольно ручная, ~ 25 000 в день.Сообщения не чувствительны ко времени, так как они запускают фоновый процесс, который будет завершен после его завершения.

Мне интересно посмотреть диалог по этому вопросу.Мне кажется, что я переживаю из-за арахиса, но хочу убедиться, что ничего не забываю, учитывая отсутствие у меня опыта Azure.

  1. Я реализовал объект MessageSenderкак синглтон, который не нужно воссоздавать.Мне действительно не нужно, чтобы несколько объектов MessageSender слонялись без дела, и я не вижу причины продолжать распоряжаться / инициализировать новый объект каждый раз, когда он мне нужен.(Он будет использоваться довольно часто, даже если это не большое количество сообщений).Я использовал Lazy вместо чисто статического инициализатора только из-за запеченной в Thread безопасной природы Lazy.

  2. Следует ли мне беспокоиться о нескольких экземплярах моего класса-оболочки, ссылающихся на один и тот же объект MessageSender?

    /// <summary>
    /// Lazy Loading MessageSender object used to send messages to the queue.
    /// </summary>
    private static Lazy<MessageSender> _MessageSender = new Lazy<MessageSender>(() =>
    {
        string _AzureServiceBusConnectionString = "redacted";
        string _AzureServiceBusQueue ="redacted";
    
        MessagingFactory factory = MessagingFactory.CreateFromConnectionString(_AzureServiceBusConnectionString);
    
        factory.RetryPolicy = new RetryExponential(minBackoff: ServiceBusClient._MinBackOff,
                                                    maxBackoff: ServiceBusClient._MaxBackOff,
                                                    maxRetryCount: ServiceBusClient._MaxRetryCount);
    
        return factory.CreateMessageSender(_AzureServiceBusQueue);
    });
    
    /// <summary>
    /// Lazy loading QueueDescription object used to get queue availability.
    /// </summary>
    private static Lazy<QueueDescription> _QueueDescription = new Lazy<QueueDescription>(() =>
    {
        string _AzureServiceBusConnectionString = "redacted";
        string _AzureServiceBusQueue ="redacted";
    
        return NamespaceManager.CreateFromConnectionString(_AzureServiceBusConnectionString).GetQueue(_AzureServiceBusQueue);
    });
    
    /// <summary>
    /// Gets the MessageSender, and instantiates it if not initialized.
    /// </summary>
    /// <value>
    /// Azure Service Bus Queue MessageSender.
    /// </value>
    private MessageSender Sender
    {
        get
        {
            return ServiceBusClient._MessageSender.Value;
        }
    }
    
    /// <summary>
    /// Sends a single message to the Service Bus.
    /// </summary>
    /// <param name="searchMessageDTO">The search message dto.</param>
    public void SendMessage(ISearchMessageDTO searchMessageDTO)
    {
        if (ServiceBusClient.IsServiceBusAvailable())
        {
            try
            {
                BrokeredMessage bm = this.ConvertDTOToBrokeredMessage(searchMessageDTO);
    
                this.Sender.SendAsync(bm);
            }
            catch (Exception ex)
            {
                //Log Error Redacted
            }
        }
    }
    
    /// <summary>
    /// Sends a batch of messages to the Service Bus.
    /// </summary>
    /// <param name="searchMessageDTOs">List of search messages to send.</param>
    public void SendMessageBatch(List<ISearchMessageDTO> searchMessageDTOs)
    {
        if (ServiceBusClient.IsServiceBusAvailable())
        {
            try
            {
                List<BrokeredMessage> bms = new List<BrokeredMessage>();
    
                foreach (ISearchMessageDTO dto in searchMessageDTOs)
                {
                    bms.Add(this.ConvertDTOToBrokeredMessage(dto));
                }
    
                this.Sender.SendBatchAsync(bms);
            }
            catch (Exception ex)
            {
                //Log Error Redacted
            }
        }
    }
    
    /// <summary>
    /// Converts the dto implementation to a brokered message.
    /// </summary>
    /// <param name="searchMessageDTO">The search message dto.</param>
    /// <returns></returns>
    /// <exception cref="ArgumentNullException">searchMessageDTO</exception>
    private BrokeredMessage ConvertDTOToBrokeredMessage(ISearchMessageDTO searchMessageDTO)
    {
        if (searchMessageDTO == null)
        {
            throw new ArgumentNullException("searchMessageDTO");
        }
    
        BrokeredMessage bm = new BrokeredMessage(JsonConvert.SerializeObject(searchMessageDTO));
    
        return bm;
    }
    
    /// <summary>
    /// Determines whether the Service Bus Queue is available by checking availability status of queue.
    /// </summary>
    /// <returns>
    ///   True if EntityAvailabilityStatus.Available otherwise False.
    /// </returns>
    public static bool IsServiceBusAvailable()
    {
        EntityAvailabilityStatus eas = ServiceBusClient._QueueDescription.Value.AvailabilityStatus;
    
        if (eas == EntityAvailabilityStatus.Available)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    

    }

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...