Desenvolvimento

8 set, 2017

Soluções Azure – Service BUS: envio de dados lote

Publicidade

O Enterprise Service Bus (ESB) se refere à arquitetura de construção de software tipicamente implementado em tecnologias encontradas na categoria de produtos de infraestrutura de middleware. Normalmente, baseado no reconhecimento de padrões, que fornecem uma base de serviços para arquiteturas mais complexas via um driver de evento e padrões baseados em mensagens (BUS).

Um ESB, geralmente, fornece uma abstração de camadas na implementação de um sistema empresarial de mensagens, que permita integração da arquitetura para explorar o valor das mensagens sem escrever código. Contrariando a clássica integração de aplicações comerciais (EAI). A base de um enterprise service bus é construída da quebra de funções básicas em partes, que são distribuídas onde for preciso.

O ESB não implementa uma arquitetura orientada a serviço (SOA), mas fornece as características para que possa ser implementada. Ele não, necessariamente, precisa ser implementado usando web services e devem ser baseados em padrões flexíveis, suportando vários meios de transporte. Baseado no EAI melhor que padrões SOA, ele tenta remover o acoplamento entre o serviço chamado e o meio de transporte.

Requisitos: Pacote Windows.Azure.ServiceBus

Install-Package ServiceBus

Código da aplicação:

// Projeto referência de uso de ServiceBus em Lotes
namespace IterativeSeviceBusLoteApp1
{
    using System;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Azure.ServiceBus;
    // Referência do Azure ServiceBus no escopo do projeto

    public class Program
    {
        private static IQueueClient queueClient;
        // váriavel contendo a string de conexão do servicebus
        private const string ServiceBusConnectionString = "Endpoint=sb://iterativephoenix1.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=GcVBojfFiWK/bZ+mvXFA1Mc6wp25QW2k2eT8c7w4EDs=";
        // variável recebendo o nome da fila 
        private const string QueueName = "nsqueuetest1";


        public static void Main(string[] args)
        {
            MainAsync(args).GetAwaiter().GetResult();
        }

        private static async Task MainAsync(string[] args)
        {
            queueClient = new QueueClient(ServiceBusConnectionString, QueueName, ReceiveMode.PeekLock);

            await SendMessagesToQueue(1000);

            // Fecha o cliente depois que o método ReceiveMessages foi encerrado.
            await queueClient.CloseAsync();

            Console.WriteLine("Aperte qualquer tecla para sair.");
            Console.ReadLine();
        }

        // Cria um cliente da fila e envia 10 mensagens para a fila.
        private static async Task SendMessagesToQueue(int numMessagesToSend)
        {
            for (var i = 0; i < numMessagesToSend; i++)
            {
                try
                {
                    // Crie uma nova mensagem intermediada para enviar para a fila
                    var message = new Message(Encoding.UTF8.GetBytes(quot;Mensagem {i}"));

                    // Imprime o corpo da mensagem no console
                    Console.WriteLine(quot;Enviando mensagem: {Encoding.UTF8.GetString(message.Body)}");

                    // Envie uma mensagem para fila
                    await queueClient.SendAsync(message);
                }
                





catch (Exception exception)
                {
                  
Console.WriteLine(quot;{DateTime.Now} > Excessão: {exception.Message}");
                }

                // Atrasar por 0 milissegundos para que o console possa continuar
                await Task.Delay(0);
            }

            Console.WriteLine(quot;{numMessagesToSend} mensagens enviadas.");
        }
    }
}

Resultado do ServiceBus:

Código da aplicação(Criando uma fila no C#):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
// É necessário instalar as referências do Azure Storage e ServiceBus

namespace ItearativeManipularQueue
{
    public class Program
    {
        // Chave
       



 const string StorageAccontName = "azureviacharp";
        // Valor : key
        const string StorageAccontKey = "mNJHID5W2DtWRtVqrRt5PI8mq8foTtndMhFh34k/wnEXkLvB2atFCCHwf7WZbARIQuIVMveHlOGrljDNUV5usw==";

        static void Main(string[] args)
        {
            var storageAccount = new CloudStorageAccount(new StorageCredentials(StorageAccontName, StorageAccontKey), true);

            // o contéudo da variavel nova_fila pode ser vindo via algum componente
            var nova_fila = "minha-queue";

            // Create a custom queue description.
            QueueDescription customDescription = new QueueDescription("minha-queue ")
            {
                DefaultMessageTimeToLive = TimeSpan.FromHours(1),
                EnableDeadLetteringOnMessageExpiration = true,
                RequiresDuplicateDetection = true,
                DuplicateDetectionHistoryTimeWindow = TimeSpan.FromMinutes(5),
                LockDuration = TimeSpan.FromMinutes(2),
                RequiresSession = true
            };

            var client = storageAccount.CreateCloudQueueClient();
            var queue = client.GetQueueReference(nova_fila) ;
            // Cria nova Queue se não existe
            queue.CreateIfNotExists();

            for (int i = 0; i < 5; i++)
            {
                queue.AddMessage(new Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage(i.ToString()));
            }

            Console.WriteLine("Mensagens salvas com sucesso.");
            Console.ReadKey();
        }
    }
}

Resultado performance do servicebus por mensagem/segundos com envio em lotes:

Envio de 1000 mensagens, média de 3.3 segundos:

Envio de 2000 mensagens, média de 7.1 segundos:

Envio de 4000 mensagens, média de 13.8 segundos:

Envio de 10.000 mensagens, média de 33.7 segundos.