Livro – Microsoft Azure por Thiago Custódio (eu mesmo)

Olá, tudo bem?

livro-windows-azure

Fazia um tempo que eu não postava nenhum conteúdo por aqui e havia um motivo para isso: finalmente meu primeiro livro de Azure foi publicado pela editora Casa do Código. Neste post, vou descrever um pouco sobre esta jornada.

O início:
Eu já havia decidido escrever um livro de Azure desde o ano passado, no entanto, já havia um em andamento na editora pelo também MVP de Azure @Fabricio Sanchez. Por motivos pessoais, ele não conseguiu terminar o livro e eu assumi o projeto.

Processo de escrita:
Escrever um livro técnico é uma tarefa extremamente complexa. Digo isso pelo fato de não ter feedback em relação ao conhecimento do leitor, isto é, quais assuntos valem a pena aprofundar (ou não). Tirando isto, é extremamente prazeroso submeter um push ao repositório da Casa do Código e em poucos minutos ver aquele texto formatado e em PDF.

Tópicos abordados:
Esta parte foi bem difícil. São tantas as possibilidades no Azure, que fica difícil escolher qual assunto abordar. Acabei escolhendo temas que de certa forma estão relacionados e um pouco de teoria sobre computação em nuvem.

Prefácio:
Inicialmente eu havia convidado o amigo e ex-patrão @Evilázaro para a escrita do prefácio, mas por motivos profissionais, ele não conseguiu entregar o texto à tempo. Convidei então o Giovanni Bassi, que não só aceitou o meu convite, mas também enriqueceu o livro com seus pontos de vista e em pouquíssimo tempo. Só para contextualizá-los, quando eu ainda estava iniciando em .NET, o Giovanni já escrevia excelentes artigos e posts no seu blog pessoal. Depois, criou o grupo de arquitetura .NET Architects entre muitas outras contribuições que ajudaram não só a mim, mas a muitos outros a serem melhores desenvolvedores. Por fim, fiz meus primeiros contatos com o Azure em um treinamento que ele fez em 2011 quando plataforma ainda engatinhava.

Revisão:
O processo de revisão foi feito pela Vivian Matsui, revisora oficial dos livros da Casa do Código. Quem acompanha a editora, sabe que constantemente novos livros são publicados. Sendo assim, ela acabou ficando sobrecarregada com as revisões e acabou atrasando um pouco o lançamento do livro. Eu também preciso deixar registrado o meu muito obrigado pelo excelente trabalho de revisão que ela fez. Acredito que este processo é similar ao de um desenvolvedor testar o próprio código, isto é, muitas vezes os erros passam despercebidos.

Resultado:
O livro foi publicado em 21/10/2015. Comecei a divulgação em redes sociais, e os posts foram compartilhados por diversos amigos que também me parabenizaram pelo trabalho. Também já tive novos followers e gente me contactando depois de adquirir a versão digital. Confesso que fiquei espantado e animado com a repercussão, quem sabe não inicio a escrita de um novo livro com um material mais aprofundado e com foco em outros serviços do Azure. Tudo depende da aceitação do público, se for positiva, é possível que a própria editora faça o convite para a parte II.

Para conferir o trabalho adquira a versão online ou impressa do livro no site da casa do código:

Adquira agora mesmo a versão impressa ou digital do livro

Até o próximo post pessoal :D

8  

[Solução] Could not load file or assembly Microsoft.Data.OData Version=5.6.2.0 error

Olá, tudo bem?

Hoje me deparei com um erro em tempo de execução ao tentar armazenar entidades em um Table Service. Instalei via Nuget o pacote “Windows Azure Storage”, e este por sua vez instalou os pacotes dependentes.

Após informar o nome da conta de armazenamento e a chave de acesso, executei a aplicação. No momento em que tento obter uma referência à tabela, recebo o seguinte erro:

“Could not load file or assembly Microsoft.Data.OData Version=5.6.2.0…”

Alguns blogs me colocaram na direção correta, isto é, devemos redirecionar para a versão 5.6.4.0 da dll. No entanto, apenas este redirect não corrige o problema. Após efetuar a publicação da aplicação, me deparei com a seguinte mensagem na Output Window:

1>------ Build started: Project: XXX, Configuration: Release Any CPU ------
1>  Consider app.config remapping of assembly "Microsoft.Data.Edm, Culture=neutral, PublicKeyToken=31bf3856ad364e35" from Version "5.6.2.0" [] to Version "5.6.4.0" [C:\Users\br.thiago.custodio\documents\visual studio 2013\Projects\XXX\packages\Microsoft.Data.Edm.5.6.4\lib\net40\Microsoft.Data.Edm.dll] to solve conflict and get rid of warning.
1>  Consider app.config remapping of assembly "Microsoft.Data.Services.Client, Culture=neutral, PublicKeyToken=31bf3856ad364e35" from Version "5.6.2.0" [] to Version "5.6.4.0" [C:\Users\br.thiago.custodio\documents\visual studio 2013\Projects\XXX\packages\Microsoft.Data.Services.Client.5.6.4\lib\net40\Microsoft.Data.Services.Client.dll] to solve conflict and get rid of warning.
1>  Consider app.config remapping of assembly "Microsoft.Data.OData, Culture=neutral, PublicKeyToken=31bf3856ad364e35" from Version "5.6.2.0" [] to Version "5.6.4.0" [C:\Users\br.thiago.custodio\documents\visual studio 2013\Projects\XXX\packages\Microsoft.Data.OData.5.6.4\lib\net40\Microsoft.Data.OData.dll] to solve conflict and get rid of warning.
1>  Consider app.config remapping of assembly "Newtonsoft.Json, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" from Version "4.5.0.0" [C:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend\Newtonsoft.Json.dll] to Version "6.0.0.0" [C:\Users\br.thiago.custodio\documents\visual studio 2013\Projects\XXX\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll] to solve conflict and get rid of warning.
Sendo assim, basta configurar os redirects no seu web.config:
 
<runtime>
	<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
	
		<dependentAssembly>
			<assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
			<bindingRedirect oldVersion="5.6.2.0" newVersion="5.6.4.0" />
		</dependentAssembly>
		<dependentAssembly>
			<assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
			<bindingRedirect oldVersion="5.6.2.0" newVersion="5.6.4.0" />
		</dependentAssembly>
		<dependentAssembly>
			<assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
			<bindingRedirect oldVersion="5.6.2.0" newVersion="5.6.4.0" />
		</dependentAssembly>
		<dependentAssembly>
			<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="31bf3856ad364e35" culture="neutral" />
			<bindingRedirect oldVersion="4.5.0.0" newVersion="6.0.0.0" />
		</dependentAssembly>
	  
	</assemblyBinding>
</runtime>

Até o próximo post pessoal :D

267  

MVP Award

Olá tudo bem?

Hoje tive a imensa alegria de ser nomeado MVP de Microsoft Azure. Este prêmio, é um reconhecimento da Microsoft em relação as minhas contribuições junto à comunidade. Este é só o começo, estou preparando uma grande novidade, que pretendo anunciar nos próximos dias.

Até o próximo post pessoal :D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D

10  

Cloud Design Patterns: Circuit Breaker Pattern

Olá tudo bem? Continuando a série sobre cloud patterns, hoje vamos estudar o padrão Circuit Breaker (Circuit Breaker Pattern).

Contexto:

Já vimos no Retry Pattern que em sistemas distribuídos (cloud) algumas operações podem falhar. O que acontece se implementarmos o Retry Pattern para invocar um determinado serviço, e o mesmo estiver indisponível? A aplicação ficará em loop, correto? Pensando em uma aplicação com muitos acessos, o overhead gerado pelas exceções pode afetar outros pontos da aplicação.

Para contornar esta situação, é recomendada a adoção do padrão Circuit Breaker. Assim como um circuito em eletrônica, se o mesmo estiver com o estado “Fechado”, concluímos que o mesmo está funcionando.

O pattern trabalha com outros dois estados:

-“Aberto”: significa que há uma falha no circuito e a operação não deve ser chamada.

-“Parcialmente Aberto”: um número limitado de chamadas é realizado para validar se a falha ainda persiste. Caso estas chamadas sejam bem sucedidas, assume-se que o circuito voltou ao estado “fechado”, em caso negativo, o circuito volta ao estado “aberto”.

circuit breaker pattern

circuit breaker pattern

Implementação:

using System;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CircuitBreaker
{
    class Program
    {
        static void Main(string[] args)
        {
            var breaker = new CircuitBreaker();

            while (true)
            {
                try
                {

                    breaker.ExecutarAcao(() =>
                    {
                        var request = WebRequest.Create("http://thiagocustodio.azurewebsites.net/");
                        var stream = (HttpWebResponse)request.GetResponse();
                        using(stream)
                        {
                            Console.WriteLine(stream.StatusCode);
                        }

                    });
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                }
            }
        }
    }

    public enum CircuitBreakerState
    {
        Fechado,
        Aberto,
        ParcialmenteAberto        
    }

    public interface CircuitBreakerPattern
    {
        CircuitBreakerState EstadoAtual { get; }

        Exception UltimaExcecao { get; }

        DateTime DataUltimaAlteracaoEstado { get; }

        bool CircuitoFechado { get; }

        void Trip(Exception ex);

        void Reset();

        void ExecutarAcao(Action acao);
    }

    public class CircuitBreaker : CircuitBreakerPattern
    {

        static CircuitBreakerState estadoAtual;
        static DateTime dataUltimaAlteracaoEstado;
        static Exception ultimaExcecao;
        static int numeroExcecoes;
        static int numeroSucessos;

        private readonly object lockObj = new object();

        public CircuitBreakerState EstadoAtual
        {
            get 
            {
                return CircuitBreaker.estadoAtual;
            }
        }

        public Exception UltimaExcecao
        {
            get 
            {
                return ultimaExcecao;
            }
        }

        public DateTime DataUltimaAlteracaoEstado
        {
            get
            {
                return dataUltimaAlteracaoEstado;
            }
        }

        public bool CircuitoFechado
        {
            get 
            {
                return CircuitBreaker.estadoAtual == CircuitBreakerState.Fechado;
            }
        }

        public void Trip(Exception ex)
        {
            //logar em algum repositório ou notificar via email (por exemplo)
            
            
            bool lockTaken = false;
            Monitor.TryEnter(lockObj, ref lockTaken);

            if (lockTaken)
            {
                CircuitBreaker.numeroExcecoes += 1;
                CircuitBreaker.ultimaExcecao = ex;

                if(CircuitBreaker.numeroExcecoes > 10)
                {
                    AlterarEstado(CircuitBreakerState.Aberto);
                }

                Monitor.Exit(lockObj);
            }
        }

        protected void AlterarEstado(CircuitBreakerState estado)
        {
            CircuitBreaker.estadoAtual = estado;
            CircuitBreaker.dataUltimaAlteracaoEstado = DateTime.Now;
        }

        public void Reset()
        {
            bool lockTaken = false;
            Monitor.TryEnter(lockObj, ref lockTaken);

            if (lockTaken)
            {
                CircuitBreaker.numeroExcecoes = 0;
                AlterarEstado(CircuitBreakerState.Fechado);

                Monitor.Exit(lockObj);
            }
        }

        public void ExecutarAcao(Action acao)
        {
            bool lockTaken = false;

            try
            {
                if (CircuitoFechado)
                {
                    acao();
                }
                else
                {
                    if(CircuitBreaker.estadoAtual == CircuitBreakerState.Aberto)
                    {
                        //aguarda por um período (neste caso 2 minutos) antes de alterar para parcialmente ativo e tentar novamente
                        if(CircuitBreaker.dataUltimaAlteracaoEstado.AddMinutes(2) >= DateTime.Now)
                        {
                            return;
                        }
                    }
                    
                    Monitor.TryEnter(lockObj, ref lockTaken);

                    if (lockTaken)
                    {
                        AlterarEstado(CircuitBreakerState.ParcialmenteAberto);

                        acao();

                        CircuitBreaker.numeroSucessos += 1;

                        if (CircuitBreaker.numeroSucessos > 5)
                        {
                            Reset();
                        }

                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                Trip(ex);
                throw ex;
            }
            finally
            {
                if (lockTaken)
                {
                    Monitor.Exit(lockObj);
                }
            }
        }
    }
}

Observações:

Vale lembrar que os contadores e os status foram declarados como static. Sendo assim, requisições concorrentes vão compartilhar os estados / contadores. Existem outras implementações do padrão mas a essência é a mesma.

Até o próximo post pessoal :D

 

 

 

1  

Cloud Design Patterns: Retry Pattern

Olá, tudo bem?

Esta semana estou participando de um evento da Microsoft, o Azure Apps Practice Building. No primeiro dia do evento vimos diversos design patterns que podem ser aplicados à nuvem. Nesta série, vamos abordar alguns destes padrões começando com o Retry Pattern.

Contexto:

Uma aplicação hospedada na nuvem deve ser sensível à transient faults que podem ocorrer neste ambiente. Por exemplo:

– perda momentânea de conectividade de rede;
– indisponibilidade temporária de um serviço;
– timeout de uma operação.

Este tipo de falha, geralmente não requer nenhuma ação manual para que a aplicação volte a operar, isto é, elas podem ocorrer por algum pico de acessos ou durante uma operação de scaling. Sendo assim, repetir a operação desejada após um pequeno tempo, pode ser a solução.

retry pattern

retry pattern

Exemplo de implementação:

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

	namespace RetryPattern
	{
		class Program
		{
			static int _retry = 0;
			static int _numeroTentativas = 3;


			static void Main(string[] args)
			{
				do
				{
					try
					{
						Foo();
						break;
					}
					catch (Exception ex)
					{
						_retry++;
						Console.WriteLine(ex.Message);
					}
					finally
					{
						Thread.Sleep(1000 * _retry);
					}
				} while (_retry &lt; _numeroTentativas);

				Console.WriteLine("fim");
				Console.Read();
			}

			public static void Foo()
			{
				if (_retry &lt; 2)
					throw new Exception("serviço indisponível");

				Console.WriteLine("Processando...");
				Console.WriteLine("Sucesso!");
			}
		}
	}

Basicamente após um erro, a aplicação espera por um determinado tempo e faz uma nova tentativa. Caso um novo erro ocorra, a aplicação aguarda um período ainda maior. O ciclo se repete até que o número de tentativas configuradas seja atingido.

Observação: O retry pattern pode ser implementado usando o The Transient Fault Handling Application Block

Até o próximo post pessoal :D

34  

Guia de estudos para as provas de certificação em Microsoft Azure

Olá, tudo bem?

Em setembro de 2014, a Microsoft lançou duas novas provas de certificação relacionados à Microsoft Azure: 70-532 (Developing Microsoft Azure Solutions) e 70-533 (Implementing Microsoft Azure Infrastructure Solutions).

Existe uma outra prova 70-534 (Architecting Microsoft Azure Solutions) que ainda está em versão beta.

Vale lembrar que até 31/05/2015, a promoção second shot é válida, isto é, caso você não passe na primeira vez, pode tentar novamente sem pagar nada a mais por isto.

Guia de Estudos para as provas:

70-532

https://anderseideblog.wordpress.com/reading-lists/ms-exam-70-532-developing-microsoft-azure-solutions/

Exam Ref 70-532 Developing Microsoft Azure Solutions

70-533

http://www.azureman.com/certification/azure-infrastructure-exam-70-533-study-guide/

https://anderseideblog.wordpress.com/reading-lists/ms-exam-70-533-implementing-microsoft-azure-infrastructure-solutions/

Exam Ref 70-533 Implementing Microsoft Azure Infrastructure Solutions

70-34:

https://anderseideblog.wordpress.com/reading-lists/ms-exam-70-534-architecting-microsoft-azure-solutions/

MVA

70-532:

Developing Microsoft Azure Solutions

70-533:

Establish Microsoft Azure IaaS Technical Fundamentals

Microsoft Azure IaaS Deep Dive Jump Start

Second Shot

Second Shot.

Até o próximo post pessoal :D

8  

Azure DocumentDB

Olá, tudo bem?

Havia um tempo que eu estava querendo postar sobre DocumentDB, o NoSQL baseado em documentos da Microsoft. Eu estudei sobre o conteúdo e fiz uma apresentação no maior e principal evento de Azure do Brasil, o Azure Summit Brasil. Os fontes da minha demo encontram-se no meu github, e você pode acessá-lo através do link.

 

Os vídeos das palestras já estão disponíveis no canal da BR Soluções Integradas, o BR Channel.

Até o próximo post pessoal :D

7  

Evento Azure Summit Brasil 2014

Olá, tudo bem?

Dias 10 e 11/10/2014, ocorreu o evento Azure Summit Brasil 2014. O dia 10, foi com um foco em business, onde tivemos excelentes palestras. Abaixo um breve resumo das palestras entregues dia 10 (business):

– Key Note (Evilázaro Alves). Em sua palestra, Evilázaro explicou a visão unificada de Cloud da Microsoft com o Cloud OS.

– JORNADA PARA A NUVEM – Um método para a seleção de cenários de negócio para IAAS, PAAS e SAAS (Waldemir Cambiucci). Em sua palestra, Waldemir (diretor do MTC São Paulo) apresentou um roadmap para adoção da nuvem por empresas.

– O papel da nuvem no controle de acesso e proteção da informação num mundo móvel (Rodrigo de Carvalho). Em sua palestra, Rodrigo apresentou como a nuvem pode ajudar na entrega de sistemas principalmente devido crescente de dispositivos móveis.

– Por que adotar Microsoft Azure (competição) (Roberto Prado). Além de arrancar diversas risadas do público, Prado apresentou as vantagens da Nuvem e como o Microsoft Azure pode ajudar no dia a dia da TI.

– Transformando o Datacenter através da visão de Cloud OS da Microsoft. (André Vital). André apresentou alguns cases onde a nuvem Microsoft Azure foi adotada e ajudou na economia de custos.

– ASK The Experts – Fizemos um Round Table permitindo aos presentes que fizessem perguntas relacionadas à Azure / Nuvem. Acabei participando desta round table respondendo algumas perguntas relacionadas à Storage, Integração e desenvolvimento.

No dia 11 (dev), tivemos um excelente Keynote entregue por Danilo Bordini, Especialista Técnico das Ferramentas de Desenvolvimento & ALM na Microsoft Brasil.

Após o Keynote, entreguei uma palestra na sala de How To sobre Puppet e Azure. Por estar ajudando na organização, não consegui ver nenhuma outra palestra, mas recebi excelentes feedbacks do público que saiu muito satisfeito do evento.

Na parte da tarde também entreguei uma palestra no Auditório 3, sobre Azure DocumentDB, feature ainda em preview mas muito promissora. Disponibilizei os slides da minha palestra aqui e os fontes aqui.

Todas as palestras dos auditórios foram gravadas e em breve iremos disponibilizar os vídeos no canal da BR Soluções Integradas no youtube. No momento, os mesmos estão sendo editados.

Por fim, eu gostaria de agradecer novamente à todos os palestrantes que nos ajudaram a entregar este excelente evento.

azure summit

Até o próximo post pessoal :D

8  

DevOps com Puppet

Olá, tudo bem?

Ontem dia 08/10/14, realizei um webcast no Mvp Show Cast sobre Puppet e Chef. Resolvi gravar um video explicando e detalhando um pouco mais a utilização do Puppet em conjunto com o Microsoft Azure.

O resultado você pode conferir no vídeo abaixo.

Até o próximo post pessoal :D

29  

Hotfix – Chef no Azure + MVP Show Cast

Olá, tudo bem?

Esta semana farei minha apresentação no MVP Show Cast sobre Puppet e Chef no Azure (dia 08/10/14).

Durante meus testes, identifiquei um problema onde o script falhava após a criação de uma máquina virtual. A máquina em si era criada com sucesso, no entanto, não era possível configurar o servidor remotamente através do script.

Após algumas trocas de e-mails com o pessoal do time, e alguns bugs reportados no github, acabo de receber um e-mail formalizando a correção do problema:

https://github.com/opscode/knife-windows/blob/0.8.0/RELEASE_NOTES.md

Quer conhecer mais sobre Puppet e Chef? Não perca minha palestra no MVP Show Cast! Inscreva-se gratuitamente através do link (imagem) abaixo:

7