DevSecOps

1 set, 2017

Soluções Azure: Redis – Interface Genérica e Computacional – Web Jobs

Publicidade

O Redis é um cache em memória que faz mais do que um cache normal (como o memcached) e menos que um banco de dados NoSql (como o MongoDB). Ele preenche esse campo intermediário e funciona muito bem como um armazenamento chave-valor, mas também aceita outras estruturas de dados, como Lists, Sets, Sorted Sets, Hashes e Bitmap. Além disso, também tem outras funcionalidades como transações e pubsub.

Mas apesar de ter tudo disso, ainda é um cache em memória, ou seja, se o serviço parar, todos os dados são perdidos*. É importante saber que Redis é otimizado para ter uma latência baixíssima e pode não estar sempre consistente. É o que se chama de consistência eventual.

O Redis consegue persistir os dados de memória de diversas maneiras, mas isso ainda não é suportado pelo cache Redis do Azure. Já existe um pedido no uservoice para habilitar isso.

Leia: http://desenvolvedor.ninja/redis-o-que-e-e-para-que-serve/

Requisitos:

  • Pacote StackExchage.Redis e .Net 4.0 ou superior
  • Install-Package StackExchange.Redis
  • Habilitar o modo de desenvolvedor no Win10

Código da aplicação:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StackExchange.Redis;

// É necessário instalar um pacote via Nuget do Redis:
// Install-Package StackExchange.Redis 
// Logo em seguida é necessário refêrencia-la no projeto.

namespace RedisCacheClientApp
{
  // Aplicação Teste de como se utilizar o conceito de Redis no Azure
  // Desenvolvido por: Guilherme Seabra

  // Os dados são armazenados na forma de chave-valor como mostra na aplicação a
  // seguir.
    class Program
    {
        static void Main(string[] args)
        {
            // variavel de conexao composta por nome do host , autenticacao , 
            // chave primaria de acesso. Todas essas informações foram extraídas 
            // do Azure Cache Redis.
            var conexao = @"empresa.redis.cache.windows.net, ssl=true,  
                          password=C4PFztzag9bkmdfnkdfklI0Xd4GUVMuueCX0eF1g=";

            // criando a conexão com o banco utilizando a classe 
            // ConnectionMultiplexer
            using (var connection = ConnectionMultiplexer.Connect(conexao))
            {
                var cache = connection.GetDatabase();

                // salva o valor
                cache.StringSet("chave", "valor");
                cache.StringSet("outra-chave", 10);

                // ler o valor
                var chave = cache.StringGet("chave");
                var outraChave = (int)cache.StringGet("outra-chave");

                // exibe o valor na tela
                Console.WriteLine("chave: {0}", chave);
                Console.WriteLine("outra-chave: {0}", outraChave);

                Console.ReadKey();

                // Para acompanhar o monitoriamento é necessário logar no
                // portal do Azure pelo endereço de conexão, porém essa tarefa 
                // será destinada a equipe de infra.
            }
        }
    }
}

Resultado do monitoramento no Azure:

Já o WebJobs é hospedado no Azure como parte de seu site web, com todos os benefícios que PaaS (Platform as a Service) pode oferecer. O SDK do Azure WebJobs simplifica a tarefa de criar e monitorar processamento em segundo plano. Ele ainda oferece uma integração com o armazenamento do Azure (blobs, filas, tabelas) ou com o Service Bus.

As funções Azure permitem que você escreva código em resposta a eventos no Azure e outros serviços, por meio de disparadores e ligações.

Para transformar um trabalho web sob demanda em um trabalho web agendado, basta incluir um arquivo settings.job na raiz do arquivo .zip do trabalho web. Esse arquivo JSON deve incluir uma propriedade schedule com uma expressão CRON, como mostrado no exemplo abaixo.

A expressão CRON é composta por 6 campos: {segundos} {minutos} {horas} {dias} {meses} {dias da semana}.

Por exemplo, para disparar o WebJob a cada 15 minutos, o settings.job teria:

JSON:

{
    "schedule": "0 */15 * * * *"
}

Observação: ao implantar um trabalho web do Visual Studio, certifique-se de marcar as propriedades do arquivo settings.job como “Copiar se mais recente”.

Código da aplicação:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WebJobConsole.Domínio;

namespace WebJobConsole.Persistência
{
    // Criação de uma classe ClienteDAO
    public class ClienteDAO
    {
        // Criando uma nova conexão
        private ConexaoDAO _minhaConexao;

        // Criação de um novo método que retorna um objeto do banco
        public void GetClientes()
        {
            // Instanciando a conexão 
            _minhaConexao = new ConexaoDAO();

            // Instanciando um novo objeto para manipulação
            ClienteBO clienteBo = new ClienteBO();
            
            // Condição se está ativo
            int StatusId = 1;

            try
            {
                // Query a ser rodada
                string StrCommand = @"Select ClienteId, Nome, Sobrenome, 
                            Documento   
                            FROM Cliente  
                            WHERE StatusId= '" + StatusId + "'";

                using (SqlCommand command = new SqlCommand(StrCommand, _minhaConexao._conexao))
                
                // Preenchendo os atributos do objeto com os dados da tabela
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        clienteBo.ClienteId = Convert.ToInt32(reader[0]);
                        clienteBo.Nome = reader[1].ToString();
                        clienteBo.Sobrenome = reader[2].ToString();
                        clienteBo.Documento = Convert.ToInt32(reader[3]);
                    }
                }

                // Fecha conexão
                _minhaConexao.Dispose();
            }

            // Trata excessão
            catch (Exception e)
            {
                Console.WriteLine("Não foi possível recuperar as informações. " + e.Message);            


  Console.ReadKey();             
            }
    
            // Imprime resultados na tela
            Console.WriteLine("Informações Recuperadas com Sucesso.");
            Console.WriteLine("");
            Console.WriteLine("ClientID: " + clienteBo.ClienteId);
            Console.WriteLine("Nome: " + clienteBo.Nome);
            Console.WriteLine("Sobrenome: " + clienteBo.Sobrenome);
            Console.WriteLine("Documento: " + clienteBo.Documento);


            // Congela Resultado
            Console.ReadKey();
        }
    }
}

Resultado do monitoramento no Azure:

Publicação do WebJob

Para publicar, clique com o botão direto sobre o projeto do WebJob e escolha a opção “Publish as Azure WebJob”, conforme exibido na imagem a seguir:

Em seguida, será exibida a tela de configuração da execução do WebJob (conforme imagem a seguir). Você poderá escolher a forma de execução do WebJob, contínuo, sob demanda ou programado. Após a confirmação, será criado o arquivo “webjob-publish-settings.json” dentro das properties do projeto do WebJob com a configuração desejada.

webjob-publish-settings.json

Quando você configura um Aplicativo de Console para implantação de trabalhos web, o Visual Studio instala o pacote NuGet Microsoft.Web.WebJobs.Publish e armazena informações de agendamento em um arquivo webjob-publish-settings.json na pasta Propriedades do projeto dos trabalhos web.

Resultado do WebJob disparado a cada 15 minutos: