Cloud Computing

17 nov, 2016

Aprendendo sobre Microsoft Azure – WebJobs – Service Bus

Publicidade

Vamos dar continuidade ao assunto relacionado ao Microsoft Azure – WebJobs. No artigo anterior, estão as configurações básicas e necessárias para o funcionamento do WebJob; neste, faremos apenas um complemento ao anterior. Vamos utilizar um WebJob para realizar o processamento de uma fila do Service Bus; antes disso, vamos ver um pouco sobre o Service Bus.

Service Bus

O Service Bus é considerado um MaaS (Message as a service – Mensagem como serviço); através dele, você pode utilizar a nuvem de forma confiável e com integração híbrida entre sistemas, o que significa que você pode conectar um App Mobile com um App Service (Web) sem que essas aplicações se comuniquem de forma direta.

Neste artigo, abordaremos a utilização das mensagem em fila (Queue) do Service Bus, deixaremos a parte de Topic para um outro momento.

  • Crie aplicativos na nuvem confiáveis e flexíveis com sistema de mensagens;
  • Proteja seu aplicativo contra picos temporários;
  • Desconecte seus aplicativos uns dos outros;
  • Conecte seus sistemas locais existentes a soluções de nuvem;
  • Distribua mensagens a diversos sistemas de back-end independentes (Topic);
  • Escale horizontalmente sistemas de mensagens ordenados a diversos leitores (Topic)

O Service Bus é pago, mas os valores são bem em conta. Os planos são divididos em Básico, Padrão e Premium.

Configuração

Durante a configuração do Service Bus dentro do Microsoft Azure, você vai perceber que ele automaticamente cria permissões de gerenciamento, leitura e escrita através de policies utilizando o Clain, muito comum para quem utiliza Identity nas aplicações.

Após a criação do Service Bus, procure pela string de conexão e a configure no App.config do WebJob conforme exibido abaixo.

cod e xml?

Inicialização

Através do NuGet, adicione o pacote “Microsoft.Azure.WebJobs.ServiceBus” às referências do WebJob.
Após a criação do projeto, dentro do arquivo “Programa.cs”, precisamos ajustar o código conforme abaixo.
Como este artigo é um complemento do anterior, a configuração exibida é um adicional para manter a sequência das informações.

using Microsoft.Azure.WebJobs;  
using Microsoft.Azure.WebJobs.ServiceBus;  
using SimpleInjector;  
using System;  
using System.Configuration;

namespace Mass.Infra.Azure.WebJob.Queues  
{
    class Program
    {
        static void Main()
        {
            var webJobsDashboard = ConfigurationManager.ConnectionStrings["AzureWebJobsDashboard"].ConnectionString;
            var webJobsStorage = ConfigurationManager.ConnectionStrings["AzureWebJobsStorage"].ConnectionString;
            var webJobsServiceBus = ConfigurationManager.ConnectionStrings["AzureWebJobsServiceBus"].ConnectionString;

            if (string.IsNullOrWhiteSpace(webJobsDashboard) || string.IsNullOrWhiteSpace(webJobsStorage) || string.IsNullOrEmpty(webJobsServiceBus))
            {
                Console.WriteLine("Please add the Azure Storage account credentials and Service Bus connection in App.config");
                return;
            }

            var container = new Container();
            container = ContainerRegister.Entries(container);

            var config = new JobHostConfiguration
            {
                StorageConnectionString = webJobsStorage,
                DashboardConnectionString = webJobsDashboard
            };

            var serviceBusConfig = new ServiceBusConfiguration
            {
                ConnectionString = webJobsServiceBus
            };

            config.UseServiceBus(serviceBusConfig);

            using (JobHost host = new JobHost(config))
            {
                // The following code ensures that the WebJob will be running continuously
                host.RunAndBlock();
            }
        }
    }
}

Codificação

Assim como as filas (Queue) do Azure Storage, no Service Bus também podemos criar as nossas filas (Queue). Dessa mesma forma, o WebJob possui gatilhos (triggers) específicos para uma determinada fila do Service Bus. Isso significa que a partir do momento em que uma mensagem chega na fila, automaticamente o método recebe essa mensagem e fica a seu critério a interpretação – a mensagem deve ser uma “string”, se for um json, por exemplo, você pode serializá-lo para um objeto específico e trabalhar 100% com OO (Orientação a Objeto). Para que isso se concretize, insira o código abaixo dentro do arquivo “Functions.cs”.

using System;  
using System.Collections.Generic;  
using System.IO;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using Microsoft.Azure.WebJobs;  
using Newtonsoft.Json;  
using Microsoft.ServiceBus.Messaging;

public void ProcessServiceBusQueue([ServiceBusTrigger("queuename")] BrokeredMessage pBrokeredMessage, TextWriter logger)  
{
    //Retrieve the message body regardless of the content as a stream
    var stream = pBrokeredMessage.GetBody<Stream>();

Dicas

Faça download da ferramenta Service Bus Explorer, ela vai ajudar bastante na visualização das informações do Service Bus. Por padrão, as filas do Service Bus são criadas com nome em minúsculo, por mais que você tenha dado o nome de outra forma.

É importante lembrar que, uma vez que a mensagem foi lida da fila, ela é removida e deixa de existir, então tome muito cuidado na interpretação para não perder nenhuma informação. O Service Bus possui uma string de conexão primária e secundária, então você pode fornecer a string de conexão secundária para um cliente ou aplicações externas e, caso você precise bloquear o acesso, basta regenerar essa chave.

Caso mais de uma mensagem chegue a uma determinada fila do Service Bus de forma simultânea, o método do gatilho no WebJob (que “ouve” a fila) vai ser acionado simultaneamente para cada mensagem como se ele fosse async, ou seja, o gatilho não aguarda o término do processamento de uma mensagem para processar a próxima.

Conclusão

O Service Bus é um serviço de mensagens na nuvem que está sempre disponível e é possível escalar o seu uso conforme a necessidade (isso de fato é importante). O maior benefício é permitir que aplicações distintas possam conversar sem que uma conheça o domínio da outra (domínio no termo do DDD mesmo).

O processamento das informações através do WebJob já com a característica de gatilho é muito rápido e de fácil utilização.

Utilize para trocar dados entre um app mobile e um app service (web) ou até mesmo trocar informações de integração entre seu cliente e você.