У меня был вопрос о вашем опыте разработки оболочек для класса MessageSender.Я не мог найти настоящих корпоративных примеров.У меня есть компонент, который имеет единственную цель отправлять сообщения в очередь.Моя пропускная способность довольно ручная, ~ 25 000 в день.Сообщения не чувствительны ко времени, так как они запускают фоновый процесс, который будет завершен после его завершения.
Мне интересно посмотреть диалог по этому вопросу.Мне кажется, что я переживаю из-за арахиса, но хочу убедиться, что ничего не забываю, учитывая отсутствие у меня опыта Azure.
Я реализовал объект MessageSenderкак синглтон, который не нужно воссоздавать.Мне действительно не нужно, чтобы несколько объектов MessageSender слонялись без дела, и я не вижу причины продолжать распоряжаться / инициализировать новый объект каждый раз, когда он мне нужен.(Он будет использоваться довольно часто, даже если это не большое количество сообщений).Я использовал Lazy вместо чисто статического инициализатора только из-за запеченной в Thread безопасной природы Lazy.
Следует ли мне беспокоиться о нескольких экземплярах моего класса-оболочки, ссылающихся на один и тот же объект 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;
}
}
}
Спасибо!