Mostrando postagens com marcador Azure. Mostrar todas as postagens
Mostrando postagens com marcador Azure. Mostrar todas as postagens

terça-feira, 5 de maio de 2015

Material do GAB 2015 - Azure DocumentDB

No dia 25 de Abril eu tive a oportunidade de palestrar em mais um evento, o Global Azure Bootcamp 2015 Brasília (http://gwab2015-brasilia.azurewebsites.net/).
Aproveitei minha corrente de estudos "beyond relational" e fiz minha primeira apresentação sobre o Azure DocumentDB. A sessão tinha duração de 50 minutos, mas me empolguei e falei por 1:15h. :-)



Você também pode fazer o download da apresentação.
Agora é achar uma brecha na agenda para fazer novamente a apresentação, dessa vez para o SQLServerDF.

Abraços

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

quinta-feira, 26 de julho de 2012

Cloud Computing != HA e DR

Atualmente na Sr. Nimbus estamos trabalhando junto a um cliente na implementação do SQL Server nA Amazon Web Services (AWS), usando a infraestrutura como serviço (IaaS). Durante o serviço eu mencionei no twitter que estávamos testando o database mirroring e seu impacto no AWS, foi aí que recebi uma pergunta muito interessante: A proposta da computação na nuvem não é ter isso (redundância)? Ou seja, você nunca teria problema com redundância?
Tudo vai depender do tipo de serviço que você está consumindo, mas computação na nuvem não é sinônimo de alta disponibilidade (High Availability ou HA) ou recuperação de desastre (Disaster Recovery ou DR)!
Então não existe redundância na nuvem? Pelo contrário, lá está cheio de redundâncias e temos que saber aproveitar, mas não é fechar o olho e fazer o deploy da sua solução. Portanto quando estamos trabalhando na arquitetura da nossa solução na nuvem, temos que pensar em termos de HA e DR sim!
Um exemplo de redundância que podemos nos beneficiar é o Elastic Block Storage (EBS) na Amazon, que é um armazenamento binário e pode ser apresentado para uma máquina como um disco, onde são mantidas 3 cópias do dado. Então optamos por não configurar RAID por software no Windows (melhor assim, não é?!) e deixarmos a redundância trabalhar.
Porém outras dúvidas aparecem... Mas como você dá manutenção sem causar downtime? E se um datacenter inteiro (onde está a redundância mais barata) ficar fora do ar? Ou se um datacenter sumir do mapa depois de um terremoto? Acredita que isso nunca vai acontecer?
Melhor ver as notícias que uma rápida pesquisa trouxe...

Ainda está confiante de que nunca vai ter problema? Quer dizer que cloud computing é ruim? Não, só estou dizendo que você não pode ser inocente, da mesma foram que vejo muitas reclamações dos hostings no Brasil a solução não é apenas ir lá para o Azure ou AWS. Mas acredito que seja uma excelente alternativa...
Então para isso nós desenhamos uma solução arquitetural que pode ser generalizada para uso de todos:

Acima um exemplo de solução para o SQL Server 2008 R2 Standard, então nosso mirroring é síncrono e dentro de um datacenter, enquanto nós mantemos os dados replicados em outro datacenter através de log shipping.
Dessa forma temos uma replicação geográfica e na pior das hipóteses temos pouca perda de dados se o datacenter USA explodir, e para não ficar parada a máquina na Europa, é utilizada como ambiente para relatórios.
Mas e o database mirror? Ele auxilia demais o negócio, vamos supor que precisamos fazer alguma manutenção ou aplicar um service pack, conseguimos fazer o failover enquanto configuramos as máquinas, sem downtime para a aplicação. Outra coisa que testamos foi mudar o tipo de instância, suponha que o Natal está chegando e suas vendas aumentam demais, com o mirror nós fazemos o failover, mudamos o tipo de instância (subindo uma com mais poder computacional) e quando a máquina volta o mirror é sincronizado. Downtime é zero e durante o ano o cliente não precisou pagar por uma máquina super dimensionada enquanto espera pelo Natal.
Quando pensamos em nuvem sempre consideramos redundância de hardware, mas esquecemos de que o software pode nos dar muita dor de cabeça, imagina a dor de cabeça que a symantech causou recentemente (http://idgnow.uol.com.br/internet/2012/07/16/symantec-confirma-ter-causado-tela-azul-da-morte-em-pcs-com-windows-xp/). Vai que você instalou um software de monitoramento e por um problema pontual no agente a tela azul da morte apareceu no servidor... No nosso caso o nó secundário do espelhamento iria assumir e somente perderíamos as transações in-flight.
Conclusão: ainda não vi uma tecnologia mágica que vai resolver todos os nossos potenciais problemas, acredito que com a computação na nuvem e sua vasta gama de possibilidades está deixando mais simples compor uma solução, mas você ainda tem muito trabalho pela frente, ok?
PS: Durante este artigo eu sempre escrevi mais sobre os recursos de cloud computing da Amazon que é o utilizado pelo cliente, mas ressalto que normalmente conseguirmos traçar um paralelo com o Azure, da Microsoft. Blob Storage, Virtual Machines, etc.
Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

sexta-feira, 29 de junho de 2012

Artigo comparativo - desempenho de I/O

Outro dia já falei um pouco sobre SQL Server e computação na nuvem.
Em paralelo estamos trabalhando com um cliente para validar o SQL Server rodando no AWS e também conduzindo uma série de testes de desempenho, começando pelo I/O.

Eu e o Ivan Lima preparamos, configuramos e executamos a avaliação, que culminou com o belo artigo publicado agora: 
SQL Server na nuvem! Azure vs Amazon. Round I: desempenho de I/O

Imperdível a leitura do artigo. Deixe lá seus comentários.


[]s

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

sexta-feira, 22 de junho de 2012

SQL Server e a nuvem

Sempre acreditei no potencial e benefícios que a computação na nuvem pode trazer para as empresas, a economia de escala é fantástica, a facilidade pode apoiar equipes multidisciplinares e suportar grandes ideias de pequenos, e não é a toa que em 2009 fundamos a Nimbus e nosso logo é uma bela nuvenzinha.  
Porém como esperado o ciclo de adoção aqui no Brasil é mais lento que nos EUA, e outras apostas ainda não aconteceram: eu torcia para aparecer um datacenter da Microsoft por aqui, o que não aconteceu até agora e acredito, facilitaria demais as coisas. Mas quando falamos em cloud computing não nos podemos restringir só a Microsoft, hoje temos muitos players brigando forte nessa competição, como a Amazon, o que sempre é muito saudável para o consumidor final.
Falando em serviço temos: software as a services (SaaS), plataform as a service (SaaS), infrastructure as a services (IaaS), entre outras tantas letrinhas mais. Sendo fora do escopo deste post o detalhamento do que é cada um (já existem muitos artigos cobrindo o assunto) e a discussão sobre o SQL Azure – ou SQL Databases - (onde você consome o SQL Server como um serviço), uma frente que recentemente ganhou mais atenção do pessoal de SQL Server foi o IaaS, onde a infra-estrutura (hardware) é oferecida para nós montarmos nossas máquinas virtuais e colocarmos o SO, SQL Server ou qualquer outro serviço.

IaaS + SQL Server


A pergunta do momento é: vale a pena colocar o SQL Server rodando na nuvem em uma infra-estrutura disponibilizada pela Microsoft ou Amazon? Obviamente que a resposta para essa pergunta é um grande DEPENDE, o potencial é bem promissor, porém existem muitos pontos que precisam ser analisados com cuidado, não é só levar a coisa “as it is” para a nuvem que você está numa boa.
Antes de entrarmos no detalhamento das principais dúvidas, primeiramente precisamos de uma visão geral de como fica estruturada as máquinas no Azure ou AWS (figura 01). Em seguida mostro superficialmente a interface de gerenciamento das máquinas virtuais no Azure e a máquina criada.
Você vai criar uma máquina virtual no seu serviço da nuvem (os recursos de hardware variam de acordo com sua escolha) que conta com um ou mais discos locais, para receber o sistema operacional e outra área volátil (Azure), utilizada para o arquivo de paginação, por exemplo.
Depois o próximo passo é criar blocos em um armazenamento binário (tamanho à sua escolha: 30GB, 100GB, 150GB, etc.) que serão apresentados para a máquina, e com os discos presentes estes podem ser formatados e configurados da forma que desejar (básicos ou dinâmicos, RAID 1, RAID 5, etc.).

(Figura 01 – Modelo básico de arquitetura na nuvem)
O que é interessante para quem está começando com o IaaS é a simplicidade para criar essa estrutura, em 15 minutos você consegue subir uma máquina, criar os discos e acessar seu Windows através do terminal services. Mesmo você que não possui muito conhecimento de infra-estrutura, a configuração é muito fácil.
A figura 02 mostra a tela de gerenciamento de uma máquina virtual que eu criei no Azure ( confesso que achei muito bacana a interface nova do portal), lá temos uma visão geral da utilização dos recursos, nome e IP do host, discos (blobs) que foram apresentados para o SO, tipo da máquina (extra large) e onde está localizada. Depois disso foi só utilizar o disk management para criar meu RAID 5 controlado por software (figura 03).
(Figura 02 – Máquina no Azure)

(Figura 03 – Discos configurados)

A partir de agora você pode configurar o seu SQL Server e trabalhar com o seu workload para a nuvem! Agora se você vai ser feliz é outra história...

Perguntas e oportunidades


Se você chegou até aqui e achou que já ia encontrar todas as respostas, me desculpe! Ainda estamos fazendo muitos testes e validações de qual a melhor configuração e como podemos usar os recursos da nuvem sem risco para seu negócio, mas algumas perguntas que ouvimos são:
1.       O subsistema de I/O consegue atender as minhas demandas?
2.       Como devo configurar tempdb, dados e log na nuvem?
3.       Colocando o SQL Server na nuvem não preciso de alta disponibilidade?
4.       Colocando o SQL Server na nuvem não preciso de redundância ou backups?
5.       Checagens de consistência ainda são necessárias ou o banco será incorruptível?
6.       Consigo colocar minha aplicação deve ficar local acessando o SQL Server na nuvem?
7.       Com o aumento de requisições o SQL Server vai fazer um scale-in automático?
Tentando responder algumas das perguntas, abaixo vou colocar outras ideias para uso da computação na nuvem, neste momento sob a ótica do IaaS.
·         Nos testes preliminares de I/O parece que para uma boa quantidade de workloads sem grande estresse, a nuvem vai conseguir suportar a demanda.
·         Distribuição dos arquivos e configuração de RAID (controlada por software) deve ser diferente. Dependendo da forma como os armazenamentos binários são tratados, um único arquivo grande (sem RAID) pode ser a melhor abordagem.
o   É comum muitas empresas colocarem diferentes T-Logs em um único RAID 1 achando que estavam só com escrita sequencial. Não, sempre comento no Internals, o que vocês acabam por ter são escritas sequenciais randômicas.
o   Com a nuvem é simples adicionar novos discos (blocos binários) e ter para cada um efetivamente a escrita sequencial.
·         Os recursos são redundantes, o que não significa que você não pode ter downtime ou problemas operacionais, então sim, você ainda têm que pensar em alta disponibilidade e o mirroring (também o AlwaysOn) fica cada vez mais atrativo.
·         Todo armazenamento dos blocos binários possuem redundância, então se onde um bloco está temos uma falha, outro bloco em algum lugar do datacenter assume. Porém antes dessa falha parar uma unidade, você pode ter uma operação de I/O problemática que corrompeu sua página de dados.
·         Então backups ainda são necessários, checagens de consistência também. Agora se você tira o backup para um disco e ainda copia-o para outro local (ou utiliza o S3 da Amazon, por exemplo) você têm diversas redundâncias do arquivo de backup, e dependendo da configuração, até fora do datacenter (geográfica).
·         A latência não é algo que pode ser desconsiderada, ainda mais com o datacenter fora do país, então para a maioria dos cenários é natural que sua aplicação vá para a nuvem junto com o banco.
·         Para o IaaS não acontece o scale-in automático, mas é possível e simples, porém você deve se planejar para isso e fazer acontecer.
o   Suponha que você tenha picos de utilização durante o ano, o que fazer com recurso on-premise? Você super dimensiona a máquina para suportar essas semanas.
o   Um de nossos clientes têm 4 semanas de pico no ano, o que estamos planejando? Eles vão ficar 48 semanas rodando com uma instância menor (e mais barata) e antes das semanas pesadas vamos ter um pequeno downtime para desligar as máquinas, mudar o tipo de instância (dobrando os recursos de hardware) e subir o ambiente para atender o negócio. Limpo, mais barato e simples.
·         Outras ideias que podemos utilizar recursos da nuvem...
o   Escalabilidade horizontal: talvez não seja tão simples para banco de dados, mas para servidores web ou uma arquitetura de barramento, bem prático.
o   Cache distribuído
o   Ambientes de teste, homologação, reporting e hotfix: como nunca foi tão fácil alocar novas máquinas, ficou rotineiro separar os ambiente, começar a promover build automáticos, fazer testes de desempenho em ambiente paralelos, testar hotfixes, etc.
§  Um novo cliente quer testar seu software? Subo rápido uma imagem de máquina, aponto para alguns blocos de backup ou faço um restore do banco de dados e disponibilizo para teste enquanto for necessário (burocracia zero e custo baixo).
Encontrar a máquina com o balanceamento correto é sempre simples? Claro que não, hoje no Azure a maior VM têm 14GB de RAM, o que é muito pouco se eu colocar um SQL Server Standard que têm 64GB como limite (espero ver mudar logo isso, ainda estamos com preview). Já na Amazon nós temos VMs com 64GB de RAM e a licença do software é diluída no pagamento mensal, deixando a conta mais leve.
Paramos por aqui? Claro que não! Estamos listando uma série de outros detalhes e fazendo os testes necessários para garantir que o negócio funcione bem a um custo mais baixo. Em breve já vamos soltar um post comparando algumas configurações, throughput e tempo de resposta dos subsistemas de I/O, validando as diferenças entre Azure VMs e o EC2 da AWS (Amazon Web Services).
Revisando o post, achei que ele ficou com muitas ideias jogadas, mas como ele era quase um brainstorm do que estamos vendo e trabalhando com nossos clientes, espero que sirva para você pensar um pouco mais sobre cloud computing. E não, não acredito que 100% dos negócios vão para a nuvem, mas existe uma boa parcela que pode se beneficiar dessa economia de escala e facilidades oferecias.
Abraços,
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

quinta-feira, 4 de agosto de 2011

Oportunidade: Desenvolvedor SQL Server e Azure

Oi pessoal.
Estamos com duas vagas na Nimbus, ambas com perfil de desenvolvedor .NET, uma para se aventurar no Azure e outra com o SQL Server.

Mais detalhes de cada uma das vagas estão aqui:

Desenvolvedor SQL Server
Desenvolvedor Windows Azure

Para quem já havia me enviado currículos anteriormente, eles também serão considerados.

[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

terça-feira, 17 de novembro de 2009

Microsoft PDC 2009

Bom dia pessoal, para quem não sabe hoje começou o PDC 09, evento que a Microsoft faz em anos aleatórios quando ela têm boas novidades para contar. Tivemos o PDC em 2008 onde foi anunciado o Windows Azure e temos novamente nesse ano. Teremos novidades saindo de lá, acho que a coisa será mais contida que em 2008, mas nada que tire o brilho do evento e que não mereça atenção.
Quer saber mais sobre o evento? Acesse http://microsoftpdc.com/. Hoje o keynote foi transmitido e amanhã teremos no palco o ScottGu, que sempre trás coisas bacanas e hoje prometeram muita novidade para o Silverlight.

Também vale a pena ficar ligado no Channel9 http://channel9.msdn.com/, que normalmente é o veículo de publicação das sessões e no ano passado disponibilizou TODAS para assitirmos, tomara que nesse ano seja igual. Acessei agora e já temos novidades, como o projeto Dallas.

Outra novidade para mim nesse ano é o acompanhamento através do twitter, basta colocar a hashtag #PDC09 como palavra de busca e vai chover de novidades pelo TweetDeck (ou software que você usa), colocados por diversos anônimos e também pelos muitos brasileiros que estão por lá!

Post rápido, pois está na hora de começar mais uma aula de SQL Server 2008 Internals!


[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

segunda-feira, 16 de novembro de 2009

CTP de novembro - Azure SDK e outros

Post rápido para os Azurianos...
Saiu o CTP de novembro do:


Alguns pontos que merecem destaque:

  • Um worker role pode definir endpoint externo: HTTP, HTTPS e TCP.
  • Tabelas podem ser criadas dinamicamente no Azure Storage. Lá se vai o batch que criamos para o devtablegen...
  • Suporte para o Visual Studio 2010 Beta 2 - como foi anunciado.
  • O exemplo do Storage client foi trocado por uma nova biblioteca com qualidade de produção! Isso foi legal, mesmo com o Steve Marx falando isso no fórum sempre ficava um sentimento ruim quando referenciávamos Microsoft.Samples em nosso produto... Ainda não vi a nova API, mas nessas horas eu agradeço pelos testes de unidade.

Conforme prometido, foi um post rápido.

[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

quarta-feira, 21 de outubro de 2009

Visual Studio 2010 e .NET Framework 4 - Beta 2

Bom, para quem assina RSSs, o dia de segunda foi repleto de posts sobre o lançamento do Visual Studio 2010 e .NET Framework 4.0, ambos beta 2. Depois de dar uma olhada nos posts e iniciar o download através da assinatura do MSDN, tive que controlar minha ansiedade e deixar para instalar ambos posteriormente. Explico os motivos:

- Não consegui uma informação clara sobre o Entity Framewok. Tenho instalado o VS2010 Beta 1 e o Entity Framework feature pack CTP1, que me trás algumas novidades que espero ver na versão final do EF (e não em um SP1, tomara!), mas o anúncio do time de produto não deixa claro se esses recursos estão todos disponíveis no beta 2. Pelo comentário do Fredrik Knutson, parece que a resposta é negativa.
Veja o anúncio formal e se o roadmap te interessa, deixe um comentário em: http://blogs.msdn.com/adonet/archive/2009/10/19/vs2010-and-net-framework-beta-2-announced.aspx

- Azure Tools for Visual Studio. Se você está desenvolvendo com o Azure, sabe que instala o SDK e o Azure Tools for Visual Studio. Mas se você desinstalar o beta 1 e colocar o beta 2, mesmo reinstalando as ferramentas do Azure, elas não deverão funcionar. O jeito é esperar pelo CTP de novembro: http://beta.blogs.msdn.com/jnak/archive/2009/10/18/windows-azure-tools-and-visual-studio-2010.aspx
Se você está apenas utilizando o StorageClient, a coisa toda deve funcionar sem problema.
Tomara que nesse CTP eles compilem o development storage com o 4.0 e não com o 3.5, facilitando a vida de quem está gerando a DLL com o TableStorageDataServiceContext através do VS2010, mas isso é assunto para um outro post.

- Integração entre o Visual Studio 2010 beta 2 e o Team Foundation Beta 1. Em um primeiro momento, eu não quero colocar o TFS Beta 2, pois exige uma preparação cuidadosa e tenho que garantir que os artefatos que eu tenho armazenados não serão perdidos em um erro de operação. O problema é que não existe garantia do VS beta 2 funcionar com o TFS beta 1, segundo o Brian Keller: http://social.msdn.microsoft.com/Forums/en/tfsprerelease/thread/e8185f70-aa69-4ddd-80f9-2508115916b7

De qualquer forma, se você está preparando uma instalação do TFS Beta 2, aconselho dar uma olhada neste guia que está sendo preparado - TFS 2010 Beta 2 Deployment Checklist:
http://geekswithblogs.net/aaronsblog/archive/2009/10/04/135297.aspx

Uma excelente notícia sobre o beta 2 é a licença "Go-Live", que significa que nós podemos utilizar os produtos para projetos em produção. Lembro de ver em um post que, se não me engano, você precisa se cadastrar para ter esse suporte. Vou ver como funciona e depois retorno para vocês.

Agora, se você não possui nenhum desses requisitos, eu aconselho correr no site e começar a fazer download do seu Visual Studio 2010 beta 2, que aparentemente já está disponível para todo mundo, não só assinantes do MSDN. Para mim o jeito vai ser voltar para as VPCs e brincar com o distinto fora da máquina física...

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
Atualizado em 27/10/2009

O time do EF anuncionou que eles estão trabalhando no Feature CTP para o Visual Studio 2010 Beta 2. E esperar para ver... http://blogs.msdn.com/adonet/archive/2009/10/26/upcoming-ado-net-entity-framework-feature-community-technology-preview-for-visual-studio-2010-beta-2.aspx

Seja paciente! :-)

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=

[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

quinta-feira, 23 de julho de 2009

CTPs Julho para o Azure

Nossa, instalei ontem, sem necessidade, o CTP de junho do Azure SDK na minha nova máquina, pois já havia saído o CTP de Julho das ferramentas. Está acompanhando os CTPs? Então baixe aqui:

Windows Azure Software Development Kit (July 2009 CTP)
Ref.: http://www.microsoft.com/downloads/details.aspx?familyid=AA40F3E2-AFC5-484D-B4E9-6A5227E73590&displaylang=en

Windows Azure Tools for Microsoft Visual Studio July 2009 CTP
Ref.: http://www.microsoft.com/downloads/details.aspx?FamilyID=8d75d4f7-77a4-4adf-bce8-1b10608574bb&displaylang=en

Microsoft .NET Services SDK (July 2009 CTP)
Ref.: http://www.microsoft.com/downloads/details.aspx?FamilyID=38d8cf79-fc39-4aef-b3fd-ef280f2e9fa6&displaylang=en


[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Ltda
E-mail: luciano.moreira@srnimbus.com.br

quarta-feira, 29 de abril de 2009

Testes de unidade, Azure e confiabilidade

Eu sou um grande fã dos testes de unidade, e mesmo não sendo um profundo estudioso do assunto testes, minha vida como desenvolvedor passou por uma transformação depois que eu comecei a trabalhar com eles, hoje eu não vivo sem.

Para ilustrar como os testes me ajudam, vou descrever um pouco do que eu fiz recentemente e, quem sabe, você também vai se sentir compelido a adotar essa boa prática de programação.

Primeiro eu codifiquei um wrapper para uma classe do projeto StorageClient que vem junto com o SDK do Azure e depois, para garantir que tudo irá funcionar corretamente, eu escrevi um teste que tentava criar uma série de containers passando com parâmetros os nomes mais esdrúxulos, conforme vocês podem ver abaixo:

Assert.IsTrue(ger.CriaContainer(@"ML:K()*_%^%$#@!@$#%^GBDF HGDSFKhf hdf kjh"));
Assert.IsTrue(ger.CriaContainer(@"~!#anjnd_)(* 8923849790>""?><>MarshalByRefObjectAssert.IsTrue(ger.CriaContainer(@"|{})_(*()*&h12h8934njkhf1"));
Assert.IsTrue(ger.CriaContainer(@"~!#anjnd_)(* 8923849790>"<>MarshalByRefObjectAssert.IsTrue(ger.CriaContainer(@"[]@#$|\\\skj382oflkuy"));
Assert.IsTrue(ger.CriaContainer(@"~s 092k3 jk3098 \\[hshsh"));

O método CriaContainer tenta limpar os nomes informados, deixando somente caracteres válidos. Porém eu somente comecei a escrever o método de limpeza do nome depois que meu teste estava pronto. O que eu fazia então...

while (ExecutaTeste() != tudoOk){
Luti_EscreveDireitoFuncaoLimpeza();
}

Enquanto o meu teste não passava todinho (o local storage do Azure gerava uma Exceção), eu continuava melhorando o método de limpeza. Depois de algumas iterações desse loop, o teste mostrou aquele check verdinho, tudo 100%.

Feito esse e mais outros testes, todos executando com sucesso, resolvi testar meu código diretamente contra a nuvem. Alterei o App.Config do meu projeto de testes para usar minha conta do Azure e executei a bateria com 10 testes: Verde, Verde, Verde, Verde, VERMELHO!

Uai, estava tudo certo?! Olha daqui, olha dali, vejo o problema. O armazenamento local permite que eu crie um container com o nome parecido com "empresa---xxx". O problema é que se olharmos a documentação, veremos "Every dash (-) character must be immediately preceded and followed by a letter or number".Ugh.

Resultado: o ambiente de desenvolvimento local não checa essa regra.
Sabe quando eu acho que iria encontrar um erro desse tipo se não fossem pelos testes, provavelmente em produção!!!

Depois disso alterei meu código para refletir os requisitos do Azure, re-executei os testes de unidade e tudo verde. Lindo.

Mas a coisa não termina por aí não. Depois de concluído os testes, resolvi baixar e instalar o CTP de Março (ainda estava com o de Janeiro). Instalei tudinho e adivinha qual foi a primeira coisa que eu fiz? Executei novamente minha bateria de testes... Tudo certo, então até que me provem o contrário, a instalação foi um sucesso.

Qual o meu sentimento no fim das contas? Eu estou confiando bastante no meu código e, toda vez que houver alguma alteração eu não vou precisar ficar 45 minutos para testar se houve alguma mudança que me prejudica, basta eu executar meus testes novamente que em alguns segundos eu saberei a resposta.

Gostou?

[]s
Luciano Caixeta Moreira
luciano.moreira@srnimbus.com.br
luticm79@hotmail.com

sexta-feira, 3 de abril de 2009

Troubleshooting - Development Storage e Azure Tables (a solução)

Esse artigo é continuação da primeira parte da minha saga com as tabelas no Azure (http://luticm.blogspot.com/2009/04/troubleshooting-development-storage-e.html)
Depois de analisar muito código e estudar a estrutura do cabeçalho e outras coisinhas relacionadas com o Lite Shared Key, eu saí do computador, respirei um pouco e iniciei outro projeto do zero, onde reconstruí a aplicação, copiando e colando o código do meu artigo de referência.

Depois de tudo montado, fui executar e ... funcionou! Mas que droga, que besteira eu estou fazendo? Code Review, lá vamos nós.

Opa! Eu tinha optado por não herdar minha entidade da classe TableStorageEntity e durante o CTRL+C / CTRL+V eu não levei o campo Timestamp. Será que é isso? Coloquei o campo, usei o DevTableGen, chequei o gerenciamento dos serviços no development storage, executei minha aplicação e ... erro! Mas agora um erro diferente.

Vou poupá-los dos detalhes sórdidos da hora que se seguiu, mas quero alertá-los sobre algumas coisas que eu aprendi, e quem sabe ajudá-los a poupar um pouco de tempo e paciência.

1 – Apesar de não listado neste documento http://msdn.microsoft.com/en-us/library/dd320275.aspx, o Azure na nuvem se vira automaticamente com a coluna timestamp, enquanto é necessário criar a coluna para o ambiente de desenvolvimento local. A documentação do SDK fala sobre a necessidade de existência dos campos, mas não especifica esse detalhe “These system properties are automatically included for every entity in a table. The names of these properties are reserved and cannot be changed. The developer is responsible for inserting and updating the values of PartitionKey and RowKey. The server manages the value of Timestamp, which cannot be modified.”.

O que me fez gastar um tempão foi a mensagem do warning registrado no log, que me colocou na trilha errada.

2 – Recriar a estrutura da tabela e metadados.

Outro detalhe que pode te ajudar durante o desenvolvimento é a configuração da tabela no SQL Server. Veja os passos que eu executei para realizar outros testes:

2.1) Depois que eu deixei o código funcionando, alterei o nome dos campos da entidade de Address e Name para CampoA e CampoB.
2.2) Apaguei o banco de dados no SQL Server e recompilei minha solução, para atualizar a ddl com os novos nomes.
2.3) Executei novamente o comando DevTableGen para gerar o banco de dados e a tabela com os novos campos. Verifiquei no Management Studio, tudo criado corretamente.
2.4) Chequei o status dos serviços no development storage. Todos os serviços rodando e apontando para o local correto (vide figura abaixo).

clip_image002
2.5) Executei a aplicação e ... Mais um erro!

clip_image004

Muito estranho, o código está atualizado, a estrutura da tabela no SQL Server também já reflete o CampoA, mas porque estou recebendo esse erro?

Depois de analisar um pouco o que estava acontecendo, supus a causa raiz. O problema está com os metadados armazenados pelo serviço do development storage, que os manteve em cache e mostra corretamente o status de running, pois o banco de dados e a tabela existem, mas sem nenhum refresh do esquema.

Quando tentamos recuperar a propriedade CampoA, o serviço não consegue fazer o mapeamento com os seus metadados e retorna um erro, mesmo com a estrutura correta criada no banco de dados. Um simples restart do serviço de tabela trás os novos metadados e deixa a aplicação funcionando corretamente.

Então fica a dica: quando estiver desenvolvendo em seu ambiente local, depois de usar o DevTableGen, não esqueça de reiniciar o serviço de armazenamento das tabelas, para que os metadados sejam atualizados.

Depois que os problemas estão resolvidos você olha para trás e pensa: putz, quanta besteira, eu devia ter conseguido resolver isso em 10 minutos. Mas desenvolvimento é assim, ainda mais quando estamos com CTPs.

Espero que esse post ajude algum desenvolvedor desamparado. :-)

Até o próximo post.

[]s
Luciano Caixeta Moreira
luticm79@hotmail.com
luciano.moreira@srnimbus.com.br

Troubleshooting - Development Storage e Azure Tables (o problema)

Hoje gastei um bom tempo fazendo troubleshooting de um bug que eu introduzi no meu código, enquanto tentava manipular tabelas no Azure. A coisa começou obscura, através das mensagens de erro eu fui para um caminho ruim e somente depois de muitos testes consegui resolver meu problema e entender melhor alguns detalhes das ferramentas do Azure SDK para desenvolvimento local.

Para me orientar na criação de tabelas no Azure, utilizei o artigo http://blogs.msdn.com/jnak/archive/2008/10/28/walkthrough-simple-table-storage.aspx, de onde fui pegando algumas idéias e montando meu próprio exemplo.

Montei meu exemplo com uma tabela entidade simples e dois botões, responsáveis por inseriam um registro e fazer uma consulta nos registros. Rodei o aplicativo e bang! Apareceu aquela mensagem excelente “The Server encountered na error processing the request. See Server logs for more details”.

clip_image002

Fui então procurar onde ficam os logs do Development Storage e usando o .NET Reflector descobri que ficam no AppData local do usuário. Tarefa que seria mais rápida se eu tivesse lido o comentário do arquivo DevelopmentStorage.exe.Config. “The logs go to LOCALAPPDATA%\DevelopmentStorage\Logs and are named after the date/time when the development storage was started.” :-)

Analisando o diretório, adivinha? Vazio! Então alterei a configuração para trabalhar com o nível de logging detalhado (verbose).

  <system.diagnostics>
<sources>
<source name="System.Net.HttpListener" switchName="detalhado" >
<listeners>
<add name="defaultListener"/>
</listeners>
</source>
</sources>
<switches>
<!-- <add name="default" value="Critical"/> -->
<add name="detalhado" value="Verbose"/>
</switches> (continua...)

Agora sim, reiniciei o development storage para ele utilizar a nova configuração e após reproduzir o erro consegui ver o seguinte (extraí um pedaço do log):

System.Net.HttpListener Information: 0 : [5156] HttpListenerContext#64537591::.ctor(httpListener#6503226 requestBlob=35055504)
System.Net.HttpListener Information: 0 : [5156] HttpListenerRequest#3338611::.ctor(httpContext#64537591 memoryBlob# 35055504)
System.Net.HttpListener Information: 0 : [5156] Associating HttpListenerRequest#3338611 with HttpListenerContext#64537591
System.Net.HttpListener Information: 0 : [5156] HttpListenerRequest#3338611::.ctor(httpContext#64537591 RequestUri:http://127.0.0.1:10002/devstoreaccount1/Tabela() Content-Length:0 HTTP Method:GET)
System.Net.HttpListener Information: 0 : [5156] HttpListenerRequest#3338611::.ctor(HttpListenerRequest Headers: x-ms-date : Fri, 03 Apr 2009 14:30:15 GMT
DataServiceVersion : 1.0;NetFx
MaxDataServiceVersion : 1.0;NetFx
Accept : application/atom+xml,application/xml
Accept-Charset : UTF-8
Authorization : SharedKeyLite devstoreaccount1:5YEL7oTeEAsOtPyqxwBN9P8OBR4cw/DelOyy1Nk9+1M=
Host : 127.0.0.1:10002)

System.Net.HttpListener Warning: 0 : [5156] HttpListener#6503226::HandleAuthentication() - Recebida uma solicitação com um esquema de autenticação sem correspondência ou sem nenhum esquema desse tipo. AuthenticationSchemes:Anonymous, Authorization:SharedKeyLite devstoreaccount1:5YEL7oTeEAsOtPyqxwBN9P8OBR4cw/DelOyy1Nk9+1M=.

System.Net.HttpListener Verbose: 0 : [5156] HttpListener#6503226::EndGetContext(IAsyncResult#26998456)
System.Net.HttpListener Verbose: 0 : [5156] HttpListener#6503226::EndGetContext(HttpListenerContext#64537591 RequestTraceIdentifier#00000000-0000-0000-0500-0080010000f2)

Nota: estou tentando vencer meu preconceito e trabalhar com um SO em português, mas acho que vou acabar vencido nessa disputa...

Pelo log não encontrei nenhum erro, apenas um aviso – em negrito que aponta para um problema de autenticação, no meu entender, claro. Dado que existe uma série de diferenças entre o armazenamento de tabela no Azure e no desenvolvimento local (ref.: http://msdn.microsoft.com/en-us/library/dd320275.aspx), sendo uma delas “The local Table service supports only Shared Key Lite authentication. It does not support Shared Key authentication.”, tudo indicava um problema com o Shared Key Lite.

Com o intuito de confirmar minhas suspeitas, fiz um teste usando o serviço de armazenamento da minha conta no Azure. Diferente do local, onde tenho que usar a ferramenta DevTableGen, adicionei mais um botão à minha aplicação, responsável por criar uma tabela em tempo de execução:

StorageAccountInfo account = StorageAccountInfo.GetDefaultTableStorageAccountFromConfiguration();
TableStorage.CreateTablesFromModel(typeof(ContextoServico), account);
Resultado: tudo funcionando perfeitamente com o armazenamento na nuvem.

Pensei comigo “estou no caminho certo, vamos ver onde está o problema com os mecanismos de segurança do meu armazenamento local”...

Será?

[]s
Luciano Caixeta Moreira
luticm79@hotmail.com