<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.caelum.com.br &#187; Arquitetura</title>
	<atom:link href="http://blog.caelum.com.br/tag/arquitetura/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Rodando sua aplicação na Amazon do Brasil</title>
		<link>http://blog.caelum.com.br/rodando-sua-aplicacao-na-amazon-do-brasil/</link>
		<comments>http://blog.caelum.com.br/rodando-sua-aplicacao-na-amazon-do-brasil/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 13:20:17 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[fj-91]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[infraestrutura]]></category>
		<category><![CDATA[openshift]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4670</guid>
		<description><![CDATA[Desde o início de nosso trabalho com o cloud em 2009 temos investido tempo e pesquisa na utilização do cloud como plataforma para diminuir custos (e trabalho!) e potencializar produtos, através de diversos vendors. Com a Amazon não é diferente: nosso sistema de ensino online está deployado lá. Com o lançamento de grande parte da <a href="http://blog.caelum.com.br/rodando-sua-aplicacao-na-amazon-do-brasil/#more-4670'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/maquina_amazon_rodando_2.png" width="240" />
		</p><p>Desde o <a href="http://blog.caelum.com.br/o-cloud-computing-e-inevitavel/">início de nosso trabalho com o cloud em 2009</a> temos <a href="http://blog.caelum.com.br/vivendo-no-cloud-a-infraestrutura-externa-da-caelum-em-11-solucoes/">investido tempo e pesquisa</a> na utilização do cloud como plataforma para diminuir custos (e trabalho!) e potencializar produtos, através de <a href="http://blog.caelum.com.br/screencast-sua-app-no-cloud-com-openshift/">diversos vendors</a>.</p>
<p>Com a Amazon não é diferente: <a href="http://blog.caelum.com.br/ha-bom-aprendizado-em-cursos-online/">nosso sistema de ensino online </a>está deployado lá. <a href="http://aws.amazon.com/about-aws/whats-new/2011/12/14/announcing-the-south-america-sao-paulo-region/">Com o lançamento de grande parte da sua plataforma no Brasil</a>, a Amazon se torna uma opção ainda mais interessante de onde ter sua aplicação. Vamos ver passo a passo como fazer um deploy e aproveitar das novas vantagens da Amazon por aqui.</p>
<p>Primeiro nos <a href="http://aws.amazon.com/console/">logamos no painel AWS Manager</a>, e escolhemos a região da América do Sul:</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen7.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen7.png" alt="" title="screen7" width="550" height="216" class="aligncenter size-full wp-image-4686" /></a></p>
<p>Depois escolhemos a imagem que usaremos para a máquina, no nosso caso <a href="http://aws.amazon.com/amis/4157">uma instalação linux limpa</a>, mantida pela própria Amazon. <a href="http://aws.amazon.com/amis">Existem centenas de instalações possíveis</a> (de linux e windows) que podem ser buscadas no market da amazon.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen8.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen8.png" alt="" title="screen8" width="550" height="188" class="aligncenter size-full wp-image-4687" /></a></p>
<p>Escolhemos então a potência da máquina e em qual <em>availability zone</em> ela ficará. Comecemos com &#8220;<code>sa-east-1a</code>&#8220;, que indica América do Sul:</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen9.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen9.png" alt="" title="screen9" width="550" height="377" class="aligncenter size-full wp-image-4688" /></a></p>
<p>Vale lembrar que uma aplicação realmente com alta disponibilidade precisaria ser deploiada em duas ou mais avaliability zones, <a href="http://www.infoq.com/news/2011/04/Amazon-EC2-Outage-Explained">mesmo sendo pequena a  chance de uma zona cair</a>.</p>
<p>Nas duas próximas telas escolhemos detalhes do Kernel e do RAM, além de possíveis tags que queremos dar para a máquina (em geral para trabalhar através dos web services). No nosso caso deixaremos os defaults.</p>
<p>Quando uma nova máquina é criada, precisamos nos logar nela e, para isso, precisamos de uma chave privada de acesso. A amazon pergunta qual o nome que devemos dar a chave, criando e permitindo que baixemos o arquivo. Note que a chave contida nesse arquivo é importantíssima e qualquer um de sua posse poderá ter acesso a máquina.</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen13.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen13.png" alt="" title="screen13" width="550" height="237" class="aligncenter size-full wp-image-4692" /></a></p>
<p>Por fim, escolhemos quais portas desejamos deixar abertas. No caso de uma aplicação Java com Jetty ou Tomcat, adicionamos a porta padrão 8080:</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen21.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen21.png" alt="" title="screen21" width="550" height="147" class="aligncenter size-full wp-image-4700" /></a></p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen22.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen22.png" alt="" title="screen22" width="550" height="147" class="aligncenter size-full wp-image-4700" /></a></p>
<p>Isso mesmo, nada de complicados usuários e senhas. Nada de gerenciá-los através de ferramentas de webadmin desatualizadas. Nada de complicadas regras e configuração de firewalls. A Amazon então permite confirmar todas as opções, e o resultado é a máquina rodando: </p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/maquina_amazon_rodando_2.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/maquina_amazon_rodando_2.png" alt="" title="maquina_amazon_rodando_2" width="556" height="87" class="aligncenter size-full wp-image-4721" /></a></p>
<p>A máquina possui um IP interno (para ser acessado de dentro da Amazon) e um DNS público, através do qual acessaremos a mesma de fora da Amazon. O DNS público pode ser visto ao clicar no nome da máquina:</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen20.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen20.png" alt="" title="screen20" width="551" height="310" class="aligncenter size-full wp-image-4699" /></a></p>
<p>Vamos acessar a máquina via ssh:</p>
<pre class="brush: plain; title: ; notranslate">
chmod 700 caelum-exemplo.pem
ssh -i caelum-exemplo.pem ec2-user@ec2-177-71-153-49.sa-east-1.compute.amazonaws.com
</pre>
<p>Resultando em:</p>
<pre class="brush: plain; title: ; notranslate">
The authenticity of host 'ec2-177-71-153-49.sa-east-1.compute.amazonaws.com (177.71.153.49)' can't be established.
RSA key fingerprint is 34:a6:de:34:88:fd:a1:73:ae:c5:03:f1:ed:8e:2f:96.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-177-71-153-49.sa-east-1.compute.amazonaws.com,177.71.153.49' (RSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

See /usr/share/doc/system-release/ for latest release notes.
There are 16 security update(s) out of 24 total update(s) available
</pre>
<p>Agora fazemos download do jetty, descompactamos e rodamos o servidor (se preferir, utilize o Tomcat):</p>
<pre class="brush: plain; title: ; notranslate">
wget http://download.eclipse.org/jetty/8.1.0.RC1/dist/jetty-distribution-8.1.0.RC1.tar.gz
tar zxf jetty-distribution-8.1.0.RC1.tar.gz
jetty-distribution-8.1.0.RC1/bin/jetty.sh start
</pre>
<p>O servidor irá inicializar e você logo receberá a mensagem de que ele está ouvindo a porta 8080.</p>
<pre class="brush: plain; title: ; notranslate">
2011-12-15 17:54:27.682:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080 STARTING
</pre>
<p>Pronto, acesse seu jetty:</p>
<p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen23.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/screen23.png" alt="" title="screen23" width="550" height="142" class="aligncenter size-full wp-image-4702" /></a></p>
<p>E se desejarmos atualizar a imagem da máquina, com atualizações de seguranca? Se sua máquina não armazena o banco, mas sim somente arquivos voláteis (de fácil reinstalação), basta terminá-la e criar uma nova. Sistema operacional atualizado! Para manter dados voláteis, você pode usar o <a href="http://aws.amazon.com/rds/">RDS da Amazon</a> para seu banco Mysql ou Oracle (ou outras máquinas para bancos não relacionais) e manter um script de configuração (usar técnicas de configuration management).</p>
<p>Mais: com apenas alguns cliques é muito fácil de <a href="http://aws.amazon.com/pt/elasticloadbalancing/">adicionar um load balancer através de sticky sessions</a>, configurar ips fixos, etc.</p>
<p>O que você está esperando para fazer seu primeiro deploy por lá?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/rodando-sua-aplicacao-na-amazon-do-brasil/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Lançamento do livro Introdução à Arquitetura e Design de Software</title>
		<link>http://blog.caelum.com.br/lancamento-do-livro-introducao-a-arquitetura-e-design-de-software/</link>
		<comments>http://blog.caelum.com.br/lancamento-do-livro-introducao-a-arquitetura-e-design-de-software/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 18:07:39 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Caelum]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[fj-16]]></category>
		<category><![CDATA[fj-91]]></category>
		<category><![CDATA[fj-95]]></category>
		<category><![CDATA[livro]]></category>
		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4662</guid>
		<description><![CDATA[Depois de uma longa espera, temos o tão aguardado lançamento. O livro está sendo distribuído para as livrarias, e já é bem fácil encontrá-lo nas lojas online, como na Saraiva. Foi bastante tempo e trabalho para criar uma introdução abrangente, e ao mesmo tempo com uma necessária profundidade, de alguns dos principais tópicos da plataforma <a href="http://blog.caelum.com.br/lancamento-do-livro-introducao-a-arquitetura-e-design-de-software/#more-4662'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/capa_Arquitetura-e-Design-de-Software.jpg" width="240" />
		</p><p><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/capa_Arquitetura-e-Design-de-Software.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/12/capa_Arquitetura-e-Design-de-Software-211x300.jpg" alt="" title="capa_Arquitetura e Design de Software" width="211" height="300" class="alignleft size-medium wp-image-4678" /></a> Depois de uma longa espera, temos o tão aguardado lançamento. O livro está sendo distribuído para as livrarias, e já é bem fácil encontrá-lo nas lojas online, <a href="http://www.livrariasaraiva.com.br/produto/3705598/introducao-a-arquitetura-e-design-de-software-uma-visao-sobre-a-plataforma-java/">como na Saraiva</a>.</p>
<p>Foi bastante tempo e trabalho para criar uma introdução abrangente, e ao mesmo tempo com uma necessária profundidade, de alguns dos principais tópicos da plataforma Java. Em vez de apresentar respostas e fórmulas prontas, procuramos colocar questões para que os trade-offs tornem-se bem visíveis. Passamos por detalhes da JVM e design de classes até uso de frameworks, serviços, testes e automação.</p>
<p>Você pode encontrar detalhes do livro, conteúdo, além de algumas seções para ler no <a href="http://www.arquiteturajava.com.br/">site oficial</a>.</p>
<p>Haverá uma confraternização em São Paulo, dia 26 de janeiro, às 19h00, na Saraiva do Shopping Paulista, comemorando o lançamento do livro. Você está convidado!</p>
<p>Esperamos que aproveite nosso trabalho, e agradecemos a todos alunos, desenvolvedores e instrutores que possibilitaram essa realização.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/lancamento-do-livro-introducao-a-arquitetura-e-design-de-software/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>NoSQL &#8211; Do teorema CAP para P?(A&#124;C):(C&#124;L)</title>
		<link>http://blog.caelum.com.br/nosql-do-teorema-cap-para-paccl/</link>
		<comments>http://blog.caelum.com.br/nosql-do-teorema-cap-para-paccl/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 17:09:55 +0000</pubDate>
		<dc:creator>Nico Steppat</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[cap]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[fj-91]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=4627</guid>
		<description><![CDATA[Existem muitas motivações para os bancos NoSQL, como por exemplo usar um modelo mais adequado para os seu dados ou facilitar alterações de schema; ou ainda além, melhorar o desempenho e simplificar a replicação para ter a tão sonhada escalabilidade linear. O teorema CAP Claro que todos os benefícios não vem sem custo, comparado com os <a href="http://blog.caelum.com.br/nosql-do-teorema-cap-para-paccl/#more-4627'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2011/11/Partiçãonarede.png" width="240" />
		</p><p><a href="http://highscalability.com/blog/2010/12/6/what-the-heck-are-you-actually-using-nosql-for.html">Existem muitas</a> <a href="http://highscalability.com/blog/2011/6/15/101-questions-to-ask-when-considering-a-nosql-database.html">motivações</a> para <a href="http://nosql-database.org/">os bancos NoSQL</a>, como por exemplo usar um <a href="http://www.thoughtworks.com/articles/nosql-comparison#Types-of-NoSQL-datastores">modelo</a> <a href="http://blog.caelum.com.br/trabalhando-com-relacionamentos-bancos-de-dados-baseados-em-grafos-e-o-neo4j/">mais adequado</a> para os seu dados ou <a href="http://stackoverflow.com/questions/2117372/what-are-the-advantages-of-using-a-schema-free-database-like-mongodb-compared-to">facilitar alterações de schema</a>; ou ainda além, melhorar o desempenho e simplificar a replicação para ter a <a href="http://blog.caelum.com.br/bancos-de-dados-nao-relacionais-e-o-movimento-nosql/">tão sonhada</a> <a href="http://blog.caelum.com.br/quando-muitos-dados-passam-a-atrapalhar-replicacao-e-sharding/">escalabilidade linear</a>.</p>
<p><strong>O teorema CAP</strong></p>
<p>Claro que todos os benefícios não vem sem custo, comparado com os bancos de dados tradicionais vamos perder alguma funcionalidade/garantia para ganhar outra. O tradeoff arquitetural é <a href="http://www.julianbrowne.com/article/viewer/brewers-cap-theorem">descrito</a> no <a href="http://en.wikipedia.org/wiki/CAP_theorem">bem conhecido</a> <a href="http://blog.nahurst.com/visual-guide-to-nosql-systems">CAP theorem</a>.</p>
<p><center><img class="alignleft" title="CAP Theorem" src="http://3.bp.blogspot.com/-jt3tZEGkvaw/TbzFI6DZjMI/AAAAAAAAAAw/RyvAOEpqBWo/s640/CAP_Diagram_dist+copy.jpg" alt="" width="300" height="300" /></center>A <a href="http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf">palestra famosa do Dr. Eric Brewer</a> introduz o teorema e explica que em qualquer sistema distribuído <em>stateful</em> é preciso escolher entre <strong>consistência forte (C &#8211; Consistency)</strong>, <strong>alta disponibilidade (A &#8211; availability)</strong> e <strong> tolerância a particionamento dos dados na rede(P &#8211; Network Partition Tolerance)</strong>. Segundo o teorema CAP, entre as três propriedades<strong>, somente duas</strong> podem ser garantidas ao mesmo tempo:</p>
<p><strong>Partition-Tolerance</strong></p>
<p>Poder particionar nossos dados em diferentes nós de um cluster é um dos recursos que aparecem com frequência nos bancos NoSQL. e são conhecidos como <em>Partition-Tolerant.</em> No entanto, segundo o teorema CAP, em troca eles irão sacrificar a consistência forte <em>ou</em>  a alta disponibilidade. Isso é diferente dos bancos tradicionais, que não possuem essa característica no design do sistema ou delegam isso para o filesystem.</p>
<p><strong>NoSQL 1: Sistemas CP</strong></p>
<p>Para sistemas que precisam da <strong>consistência</strong> forte e <strong>tolerância a</strong> <strong>particionamento</strong> <strong>(CP)</strong> é necessário abrir a mão da disponibilidade (<em>um pouco</em>). Pode acontecer, caso haja particionamento e o sistema não entre em consenso, que uma escrita seja rejeitada. Claro que os sistemas tentam evitar isso ao máximo, tanto que não costuma existir, por exemplo, uma transação distribuída e sim um <a href="http://en.wikipedia.org/wiki/Paxos_(computer_science)">protocolo de consensos </a> para garantir a consistência forte. Exemplos desses sistemas CP são <a href="http://labs.google.com/papers/bigtable.html">BigTable</a>, <a href="http://hbase.apache.org/">HBase</a> ou <a href="http://www.mongodb.org/">MongoDB</a> entre vários outros.</p>
<p><strong>NoSQL 2: Sistemas AP</strong></p>
<p>Por outro lado existem sistemas que jamais podem ficar offline (24/7), portanto não desejam sacrificar a disponibilidade. Para ter alta <strong>disponibilidade</strong> mesmo com um <strong>tolerância a</strong> <strong>particionamento</strong> <strong>(PA)</strong> é preciso prejudicar a consistência (<a href="http://www.allthingsdistributed.com/2007/12/eventually_consistent.html">eventual-consistency</a>). A ideia aqui é que os sistemas aceitam escritas sempre e tentam sincronizar os dados em algum momento depois (<em><a href="http://aws.amazon.com/simpledb/faqs/#What_read_consistency_options_does_Amazon_SimpleDB_provide">read-consistency</a></em>). Então pode ter uma <em>janela de inconsistência</em>. Exemplos aqui são <a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html">Amazon Dynamo</a>, <a href="http://cassandra.apache.org/">Cassandra</a> ou <a href="http://wiki.basho.com/">Riak</a>.</p>
<p><strong>Sistemas CA</strong></p>
<p>Os sistemas com <strong>consistência</strong> forte e alta <strong>disponibilidade</strong> <strong>(CA)</strong> (alta disponibilidade de um nó apenas) não sabem lidar com a possível falha de uma partição. Caso ocorra, sistema inteiro pode ficar indisponível até o membro do cluster voltar. Exemplos disso são algumas configurações clássicas de  bancos relacionais.</p>
<p><strong>Qual é a diferença entra CA e CP?</strong></p>
<p>Vimos brevemente o teorema CAP e a escolha que os sistemas NoSQL fazem (CP ou AP) comparado com os bancos tradicionais (CA). É importante mencionar que para o desenvolvedor não haverá tantas diferenças entre CA ou CP. <strong>SEMPRE teremos consistência forte</strong>, no entanto, um sistema fica <em>indisponível</em> (CA) quando há particionamento &#8211; pois tem apenas alta disponibilidade por nó &#8211; e o outro sistema (CP) tente chegar a um consenso se aceita uma escrita ou não, que no pior dos casos também pode significar a <em>indisponibilidade</em> para uma parte dos dados. Seguindo desse raciocínio podemos perceber que a <strong>consistência e disponibilidade são extremos quando há particionamento</strong>. <a href="http://pl.atyp.us/wordpress/index.php/2009/11/availability-and-partition-tolerance/">Isso foi uma dúvida</a> que me incomodou bastante antes da <a href="http://www.slideshare.net/steppat/nosql-caelum-day-2009">minha palestra no Caelumday 2009</a>. <em>Podemos concluir que quando há particionamento (P) terá alta disponibilidade (A) ou consistência (C) forte: P?(A|C)</em></p>
<p><strong>Mas o que acontece se NĀO há particionamento?</strong></p>
<p>É uma pergunta que o CAP não responde. A primeira resposta poderia ser: claro que vai ser consistente já que ninguém gosta de lidar com dados desatualizados. Mas olhando para os sistemas NoSQL nem sempre isso é verdade. Existem sistemas que <strong>SEMPRE são eventually-consistent</strong>. <em>Mas porque</em>?</p>
<p><strong>Consistência ou Latência</strong></p>
<p>Há mais um motivo porque poderia fazer sentido sacrificar a consistência: O tempo da resposta ou a <strong>latência</strong>. Da mesma maneira que um sistema offline pode custar caro, <a href="http://blog.caelum.com.br/por-uma-web-mais-rapida-26-tecnicas-de-otimizacao-de-sites/">um sistema lento também</a> pode. Por isso pode fazer sentido abrir a mão da consistência para diminuir a latência.</p>
<p><strong>De CAP para PAC/CL</strong></p>
<p>O <a href="http://dbmsmusings.blogspot.com/2010/04/problems-with-cap-and-yahoos-little.html">artigo do blog</a> do Prof. <a href="http://www.twitter.com/daniel_abadi">Daniel Abadi</a> explica o tradeoff com partições e sem. Ele sugere substituir a sigla CAP com <strong>PAC/CL</strong> (ou P?(A|C):(C|L)), traduzindo levemente modificado do artigo dele:</p>
<blockquote><p><abbr title="“... if there is a partition (P) how does the system tradeoff between availability and consistency (A and C); else (e) when the system is running as normal in the absence of partitions, how does the system tradeoff between latency (L) and consistency (C)?”">“&#8230; se há particionamento (P), o sistema pode valorizar a disponibilidade (A) ou a consistência (C), senão, quando o sistema roda sem partições, o sistema pode favorecer o tempo da resposta/latência (L) ou a consistência (C).”</abbr></p></blockquote>
<p><strong>Exemplos de PAC/CL</strong></p>
<p>Seguindo dessa linha PC/C significa que o sistema valoriza a consistência sempre, com ou sem partições. Banco de dados tradicionais são sempre fortemente consistentes, ou seja PC/C. Amazon Dynamo ou Cassandra são sempre fracamente consistente, favorecendo a alta disponibilidade e o tempo da resposta (latência), ou seja PA/L. Mas existem misturas como o <a href="http://www.geniedb.com/wp-content/uploads/2011/04/beating-the-cap-theorem-revised.pdf">GenieDB</a> (PA/C), que só trabalha consistente em caso de nenhuma partições. Quando há partições valoriza a alta disponibilidade. Exemplo contrário disso é o <a href="http://en.wikipedia.org/wiki/Yahoo_Sherpa">Yahoo Sherpa</a>, que usa PC/L, ou seja com partições favorece consistência, sem partições diminuir a latência.</p>
<p>Durante o curso <a href="http://www.caelum.com.br/curso/fj-91-arquitetura-design-projetos-java/" target="_blank">FJ-91</a>, diversas questões e decisões arquiteturais são abordadas e discutidas, sendo que uma delas envolve o teorema CAP e os bancos de dados NoSQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/nosql-do-teorema-cap-para-paccl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Quando muitos dados passam a atrapalhar: replicação e sharding</title>
		<link>http://blog.caelum.com.br/quando-muitos-dados-passam-a-atrapalhar-replicacao-e-sharding/</link>
		<comments>http://blog.caelum.com.br/quando-muitos-dados-passam-a-atrapalhar-replicacao-e-sharding/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 16:30:33 +0000</pubDate>
		<dc:creator>Adriano Almeida</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[fj-91]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[servidores]]></category>
		<category><![CDATA[Sharding]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=3496</guid>
		<description><![CDATA[Quando pensamos na arquitetura de sistemas com grande volume de dados a primeira palavra que vem a mente é escalar. Além de desejar que cada uma das pesquisas em nosso sistema execute o mais rápido possível, precisamos criar meios para que, quando necessário, seja fácil adicionar mais recursos (como memória ou novos servidores) e o <a href="http://blog.caelum.com.br/quando-muitos-dados-passam-a-atrapalhar-replicacao-e-sharding/#more-3496'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/master_slave_slav_falho.png" width="240" />
		</p><p>Quando pensamos na arquitetura de sistemas com grande volume de dados a primeira palavra que vem a mente é  <a href="http://escalabilidade.com/2010/01/31/o-que-e-escalabilidade/">escalar</a>. Além de desejar que cada uma das pesquisas em nosso sistema execute o mais rápido possível, precisamos criar meios para que, quando necessário, seja fácil adicionar mais recursos (como memória ou novos servidores) e o sistema consiga tirar proveito deles. Para isso muitas vezes precisamos ir além das diversas otimizações de performance e escalabilidade, como por exemplo <a href="http://www.interspire.com/content/2006/02/15/introduction-to-database-indexes/">a criação de um índice para buscas</a>, o <a href="http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/">uso de caches</a> e de <a href="http://blog.caelum.com.br/javaee-6-contexto-assincrono-das-servlets-para-o-ajax-push/">chamadas assíncronas</a>.</p>
<p>Outras duas abordagens importantes são a replicação e o particionamento horizontal (sharding). A simples ideia por trás da replicação é armazenar cópias dos dados em mais de um lugar. Em bancos de dados ela é tradicionalmente implementada através da criação de uma estrutura <a href="http://en.wikipedia.org/wiki/Database_replication#Database_replication">master-slave</a>. O banco master é aquele onde são efetuados as alterações, que são então replicadas para o slave.</p>
<div id="attachment_3551" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/master_slave.png"><img class="size-medium wp-image-3551" title="Master Slave" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/master_slave-300x186.png" alt="" width="300" height="186" /></a><p class="wp-caption-text">Clientes realizando a leitura de dados em diferentes fontes e o master replicando as escritas para o slave</p></div>
<p>Com isso as queries podem ser executadas agora não só em um, mas em dois nós. Quando as máquinas se sobrecarregarem de queries, criamos um novo nó slave que permite aliviar o trabalho das primeiras.</p>
<div id="attachment_3553" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/master_slave_slave.png"><img class="size-medium wp-image-3553" title="Master Slave Slave" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/master_slave_slave-300x137.png" alt="" width="300" height="137" /></a><p class="wp-caption-text">Com vários slaves, é possível aliviar a carga das máquinas. Nesse caso, o master não está recebendo leitura.</p></div>
<p>Em uma arquitetura comum onde o banco funciona no esquema master-slaves baseado em replicação, todos os dados estão contidos em todos os nós: a consistência é mantida.</p>
<p>Se um nó de leitura parar de funcionar, não tem problema para as queries pois, todos os outros nós são capazes de responder as mesmas. Mas se o master falhar, as atualizações não funcionam.</p>
<div id="attachment_3558" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/master_slave_slav_falho.png"><img class="size-medium wp-image-3558" title="Master-Slave-Slave Falho" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/master_slave_slav_falho-300x137.png" alt="" width="300" height="137" /></a><p class="wp-caption-text">Quando um dos nós para de responder, os outros nós podem substituí-lo normalmente</p></div>
<p>Permitir escalar a leitura não aumenta necessariamente a <a href="http://blog.caelum.com.br/escalando-sistemas-com-solucoes-nosql/">performance percebida pela API</a>: a query pode continuar lenta, mas mais queries podem rodar concorrentemente. Por outro lado, precisamos tomar cuidado na escrita: se a mensagem de atualização do master para os slaves for síncrona para garantir a consistência, o tempo de resposta para uma atualização fica maior.</p>
<p>Nesses casos podemos utilizar uma abordagem onde a replicação de uma atualização ocorre de maneira assíncrona e a<a href="http://ccsl.ime.usp.br/wiki/images/2/20/NoSQL_Vantagens_Desvantagens_e_Compromissos.pdf"> consistência passa a ser em momentos indeterminados</a>, mesmo que em banco de dados relacionais.</p>
<blockquote><p>A replicação de dados nos permite garantir consistência através da redundância deles.</p></blockquote>
<p>Em outra variação de replicação, qualquer nó pode responder por uma atualização e propagar tal mensagem para os outros: esse cenário é chamado de multi master. <a href="http://en.wikipedia.org/wiki/Gossip_protocol#Gossip_communication">Outras variações como baseadas em Gossip</a> podem ajudar a reparar dados que estão inconsistentes em determinado momento.</p>
<div id="attachment_3531" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/multi_master1.png"><img class="size-medium wp-image-3531" title="Multi Master" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/multi_master1-300x82.png" alt="" width="300" height="82" /></a><p class="wp-caption-text">Em uma abordagem multi master, todos os nós trocam informações entre si</p></div>
<p>Mas a query ainda pode estar lenta, por exemplo, no caso de um full table scan &#8211; um sinal forte de que algo está errado no design do armazenamento de seus dados. Nesses casos tentamos dividir a localização física dos dados, despedaçando os mesmos e colocando pedaços deles em nós distintos. Essa prática é conhecida como <a href="http://en.wikipedia.org/wiki/Shard_(database_architecture)">Sharding (decomposição)</a>.</p>
<div id="attachment_3528" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/sharding_simples.png"><img class="size-medium wp-image-3528" title="Sharding Simples" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/sharding_simples-300x154.png" alt="" width="300" height="154" /></a><p class="wp-caption-text">Dados de uma mesma tabela distribuídos entre vários nós através de sharding</p></div>
<p>A escolha de como dividir esses dados é dada através de um <a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b32024/partition.htm#i460833">algoritmo de Sharding</a>, que podemos escolher. O diagrama a seguir mostra duas opções para a distribuição dos dados em diversas máquinas:</p>
<div id="attachment_3523" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/diagramas_sharding.png"><img class="size-medium wp-image-3523 " title="Algoritmos de Sharding" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/diagramas_sharding-300x106.png" alt="" width="300" height="106" /></a><p class="wp-caption-text">Dados distribuídos de maneiras diferentes de acordo com o algoritmo de sharding</p></div>
<p>Dessa maneira podemos facilmente distribuir a execução de uma query em diversós nós, tornando um full table scan diversos scans a rodarem em paralelo. O sharding pode resolver o problema das queries lentas, no entanto, pode criar outros problemas. Imagine que um dos servidores utilizados nesse Sharding fique momentaneamente fora do ar. <a href="http://www.julianbrowne.com/article/viewer/brewers-cap-theorem">Consequência: tais dados ficarão indisponíveis</a>.</p>
<p>Outro problema ocorre quando uma query busca dados em um nó e esse resultado envolve executar queries em outros nós distintos de acordo com cada resultado original, causando lentidão. Por isso, decidir o algoritmo de Sharding depende das queries a serem executadas a fim de fazer essa distribuição da melhor forma possível. Por exemplo, <a href="http://www.slideshare.net/nkallen/q-con-3770885">como o Twitter apresentou</a> e o <a href="http://www.qconsp.com/palestra/randy-shoup/best-practices-for-large-scale-web-sites-lessons-from-ebay">e-bay discutiu</a> sobre tais escolhas em seus ambientes durantes palestras no QCon 2010 em São Paulo.</p>
<p>Para resolver tais problemas, uma solução é misturar o sharding com replicação, ganhando maior disponibilidade, deixando ao algoritmo a decisão de quais nós conterão determinados dados. Esse é um cenário de alta complexidade e por isso mesmo todo cuidado deve ser tomado para só ser adotado quando realmente necessário. Tais situações podem ser suportadas por ferramentas noSQL <a href="http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf">baseadas no paper do Dynamo</a>, como Cassandra, Riak etc.<br />
Cada ferramenta aborda o problema de uma maneira diferente:</p>
<blockquote><p>
&#8220;Bayou, Coda and Ficus allow disconnected operations and are resilient<br />
to issues such as network partitions and outages.&#8221;<br />
&#8221; Dynamo allows read and write operations to continue even during<br />
network partitions and resolves updatedconflicts using different<br />
conflict resolution mechanisms. &#8221;
</p></blockquote>
<p>Arranhando como elas funcionam, quando um nó cai, os outros nos continuam trabalhando. Quando do momento de resolver o conflito, cada um utiliza uma estratégia diferente e permite diferentes abordagens para conciliar os dados conflitantes. Novamente, quanto mais escrita for feita para garantir a replicação, mais lento esse processo e as abordagens de atualização assíncrona podem fazer mais sentido novamente.</p>
<div id="attachment_3556" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/sharding_replicacao.png"><img class="size-medium wp-image-3556" title="Sharding Replicaçao" src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/11/sharding_replicacao-300x101.png" alt="" width="300" height="101" /></a><p class="wp-caption-text">Dados distribuídos em vários nós</p></div>
<p>Um nó não precisa necessariamente ser uma cópia de outro nó, bastando que o elemento apareça em no mínimo N nós.</p>
<p><strong>Conclusão</strong></p>
<p>Escalar os dados de uma aplicação é uma tarefa complicada e a solução varia de acordo com o caso.</p>
<p>Fica fácil visualizar como a consistência se mantem em nosso sistema distribuído (eventualmente ou sempre) e como a maneira de executar as queries é alterada de acordo com a nossa necessidade de escalabilidade e performance.</p>
<p>Em alguns casos, simplesmente a replicação pode ser suficiente enquanto em outros pode ser necessário o Sharding ou uma combinação de ambos. Perceber a necessidade, entender como funciona processamento distribuído de dados e encontrar a combinação ideal <a href="http://www.caelum.com.br/curso/fj-91-arquitetura-design-projetos-java/">é o grande desafio que o desenvolvedor ou arquiteto passa</a>.</p>
<p>Agradecimentos ao <a href="http://porcelli.com.br/">Alexandre Porcelli</a> pela revisão do artigo antes de sua publicação.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/quando-muitos-dados-passam-a-atrapalhar-replicacao-e-sharding/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Um produto para muitos clientes: implementando multitenancy</title>
		<link>http://blog.caelum.com.br/um-produto-para-muitos-clientes-implementando-multitenancy/</link>
		<comments>http://blog.caelum.com.br/um-produto-para-muitos-clientes-implementando-multitenancy/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 22:19:52 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[fj-91]]></category>
		<category><![CDATA[multitenancy]]></category>
		<category><![CDATA[segurança]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=3010</guid>
		<description><![CDATA[São diversos as aplicações web disponíveis, como quadros eletrônicos, sistemas de tracking, email e aplicações para empresas, ou até mesmo controle de clientes e vendas. Eles até ganharam um pomposo nome dentro do cloud computing: Software as a Service (SAAS). O que essas aplicações possuem em comum? Todas elas atendem diversos clientes sem que um <a href="http://blog.caelum.com.br/um-produto-para-muitos-clientes-implementando-multitenancy/#more-3010'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/um-um.png" width="240" />
		</p><p>São diversos as aplicações web disponíveis, como <a href="http://pivotaltracker.com">quadros eletrônicos</a>, <a href="http://lighthouse.com">sistemas de tracking</a>, <a href="http://www.google.com/enterprise/">email e aplicações para empresas</a>, ou até mesmo <a href="http://salesforce.com">controle de clientes e vendas</a>. Eles até ganharam um pomposo nome dentro do cloud computing: Software as a Service (SAAS).</p>
<p>O que essas aplicações possuem em comum? Todas elas atendem diversos clientes sem que um tenha conhecimento da existência dos outros. </p>
<p>Em <a href="http://www.tectura.com.br/topics/abordagens_de_multitenant">um post recente no Tectura.com.br</a> foram discutidas vantagens e desvantagens de diversas abordagens para produtos com a necessidade de suportar mais de um tenant.</p>
<p>A <a href="http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_topic2">Microsoft categoriza três tipos de abordagens</a> dependendo do nível de compartilhamento de recursos entre os clientes e apresente um relatório onde analisa os custos contra a segurança.</p>
<p>Em um extremo, nada é compartilhado entre cada cliente: para cada nova conta criada dentro de seu serviço, é criada uma nova máquina na cloud e uma instalação limpa é executada, com seu próprio banco.</p>
<p><center><div id="attachment_3057" class="wp-caption alignnone" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/dois-dois.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/dois-dois-300x152.png" alt="Dois servidores, dois bancos" title="Dois servidores, dois bancos" width="300" height="152" class="size-medium wp-image-3057" /></a><p class="wp-caption-text">Nessa abordagem o processo de autorização é automático, um cliente é criado através da instalação automática de uma nova máquina virtual e os recursos são compartilhados se o ambiente for uma cloud.</p></div></center></p>
<p>Na outra ponta, tudo é compartilhado: novos clientes são inseridos no mesmo conjunto de máquinas e a instalação é feita através de um simples insert no banco, adicionando um novo cliente. Qual abordagem escolher?</p>
<p><center><div id="attachment_3060" class="wp-caption alignnone" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/um-um.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/um-um-300x150.png" alt="Um servidor, um banco" title="Um servidor, um banco" width="300" height="150" class="size-medium wp-image-3060" /></a><p class="wp-caption-text">A autorização é feita programaticamente na aplicação, os recursos são compartilhados entre todas elas, escala-se tipicamente através do uso de load balancers e replicação master/slave e a cada novo cliente basta executar um insert no banco.</p></div></center></p>
<p>Em qualquer abordagem onde o banco seja compartilhado por diversas empresas, precisamos garantir a segurança dos dados de cada uma, para que nenhum acesso indevido ocorra, trazendo preocupações de autorização para dentro do código de nossa aplicação. Caso seja criado para cada cliente um banco em uma máquina no cloud, essa questão fica concentrada em um único ponto da arquitetura, a segurança está implícita.</p>
<p><center><div id="attachment_3058" class="wp-caption alignnone" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/dois-um.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/dois-um-300x149.png" alt="Dois servidores, um banco" title="Dois servidores, um banco" width="300" height="149" class="size-medium wp-image-3058" /></a><p class="wp-caption-text">Diversos servidores e um banco implica em clientes não afetarem uns aos outros, um controle programático de autorização e novos clientes são criados a partir da instalação de um novo contexto web.</p></div></center></p>
<p>Ao mesmo tempo, o processo de customização de seu serviço por cliente também é afetada de acordo com o nível de compartilhamento de dados entre eles. Na abordagem onde os clientes compartilham o mesmo servidor web, a customização é uma preocupação de nossa aplicação, enquanto ao utilizarmos aplicações web distintas para cada cliente, podemos facilmente separar customizações por instância, por deploy efetuado.</p>
<p>A escalabilidade é afetada pois compartilhar recursos em memória na camada web, <a href="http://blog.caelum.com.br/escalando-sistemas-com-solucoes-nosql/">entre eles dados cacheados do banco ou filas</a>, permitem diminuir o tempo de processamento ou de latência, aumentando o número de requisições suportados.</p>
<p>O processo de escalar também está diretamente ligado: quando uma máquina não aguentar mais as requisições, será levantada uma outra máquina que funcionará em cluster para um, n ou todos os clientes?</p>
<p>Outro fator importante é como limitar o uso do serviço de acordo com as regras contratadas pelo cliente e controlar o dano que um pode causar a outros. Em um pico de uso por parte dos usuários de um cliente, <a href="http://www.virtualizationconference.com/node/723565">ativamos o chargeback</a>, dependendo do tipo de serviço que é prestado. Implementações comuns de chargeback em cloud (<a href="http://www.vmware.com/virtualization/virtual-machine.html">baseados em virtualização</a>) permitem um pico de consumo temporário ou até mesmo mover a aplicação de uma máquina para outra sem que cliente algum perçeba o que está acontecendo.</p>
<p><center><div id="attachment_3058" class="wp-caption alignnone" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/dois-um.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/08/dois-um-300x149.png" alt="Dois servidores, um banco" title="Dois servidores, um banco" width="300" height="149" class="size-medium wp-image-3058" /></a><p class="wp-caption-text">Diversos servidores e um banco implica em clientes não afetarem uns aos outros, um controle programático de autorização e novos clientes são criados a partir da instalação de um novo contexto web.</p></div></center></p>
<p>Ao invés daqueles usuários atrapalharem a performance de outros clientes, é alocado memória e processador distintos dos atuais para ele.</p>
<p>A simplicidade do código é um dos fatores mais afetados pela escolha feita: um código que sabe da existência de múltiplos clientes está diretamente ligado a uma chave que identifica o cliente atual. E essa ligação se reflete por todos os lados do código, uma vez que o comportamento da aplicação em geral depende dele: uma chave estrangeira, um relacionamento, que vai permear toda a aplicação.</p>
<p>Caso a aplicação implemente o suporte a multi tenant através de instalções web distintas, com configurações para cada cliente apontando para um bancos distintos, o código fica mais simples e fácil de manter, uma vez que não é necessário se preocupar com a existência de outros clientes.</p>
<p>Por fim, uma preocupação que surge para a empresa provedora dos serviços é de como agrupar os dados existentes em todos os clientes e gerar relatórios de administração e estatísticas que permitam a melhora do serviço prestado. Quando possuimos um único banco, escalado através de master slave ou múltiplos nós, basta executarmos queries longas (sql ou não), mas se o sistema estiver distribuido entre diversos bancos sem ligação entre si, <a href="http://cloudcomputing.sys-con.com/node/1086696">um processo de batch deve rodar para agrupar os dados e permitir o consumo posterior pelas ferramentas de BI</a>.</p>
<p><a href="http://blog.caelum.com.br/entao-voce-quer-ser-um-arquiteto-java/">É importante analisar todos esses pontos antes de tomar a decisão</a> se o controle de espaço de aplicação por cliente será feito no nosso código, na camada web, no banco ou em algum outro ponto. Como discutimos bastante <a href="http://www.caelum.com.br/curso/fj-91-arquitetura-design-projetos-java/">no curso de arquitetura</a>, toda e qualquer decisão implica em um tradeoff: o importante é saber o que está sendo trocado e qual é o impacto disso.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/um-produto-para-muitos-clientes-implementando-multitenancy/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Então você quer ser um arquiteto Java?</title>
		<link>http://blog.caelum.com.br/entao-voce-quer-ser-um-arquiteto-java/</link>
		<comments>http://blog.caelum.com.br/entao-voce-quer-ser-um-arquiteto-java/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 23:40:32 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2808</guid>
		<description><![CDATA[Durante o atual processo de revisão do livro de Arquitetura e Design de Software, discussões apareceram sobre o termo arquiteto. Antes de definir o que faz um arquiteto, há o termo arquitetura. O que é a arquitetura de uma aplicação? Uma pergunta difícil de responder. Entre as definições mais antigas, Roy Fielding possui um bom <a href="http://blog.caelum.com.br/entao-voce-quer-ser-um-arquiteto-java/#more-2808'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/07/design.jpg" width="240" />
		</p><p>Durante o atual processo de revisão do livro de <a href="http://www.arquiteturajava.com.br">Arquitetura e Design de Software</a>, discussões apareceram sobre <a href="http://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf">o termo <strong>arquiteto</strong></a>. Antes de definir o que faz um arquiteto, há o termo <strong>arquitetura</strong>. </p>
<div id="attachment_2942" class="wp-caption aligncenter" style="width: 511px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/07/neo-architect.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/07/neo-architect.jpg" alt="" title="neo-architect" width="501" height="216" class="size-full wp-image-2942" /></a><p class="wp-caption-text">Quem é o arquiteto? Aquele que senta sozinho e toma todas as grandes decisões?</p></div>
<p><strong>O que é a arquitetura de uma aplicação?</strong><br />
Uma pergunta difícil de responder. Entre as definições mais antigas, Roy Fielding possui um bom texto no primeiro capítulo de sua <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/software_arch.htm">dissertação de doutorado</a>. O Instituto de Engenharia de Software da Universidade de Carnegie Mellon <a href="http://www.sei.cmu.edu/architecture/start/definitions.cfm">apresenta diferentes definições</a>, <a href="http://www.sei.cmu.edu/architecture/start/bibliographicdefs.cfm">algumas clássicas</a> e bastante conhecidas, como &#8220;<em>arquitetura é a estrutura do sistema, composta de componentes, as propriedades que são visíveis externamente desses componentes e o relacionamento entre eles</em>&#8220;. </p>
<p><a href="http://martinfowler.com/articles/designDead.html#id21865">Nas palavras de Martin Fowler</a>, &#8220;<em>o termo arquitetura envolve a noção dos principais elementos do sistema, <strong>as peças que são difíceis de mudar</strong>. Uma fundação na qual o resto precisa ser construído</em>&#8220;. Fowler <a href="http://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf">reformula sua definição de arquitetura</a> e a define como &#8220;<em>as peças que as pessoas acham que é difícil de mudar</em>&#8220;.  No mesmo artigo Ralph Johnson, do GoF, diz que arquitetura &#8220;<em>é o conjunto de decisões de design que gostaríamos de ter feito no começo do projeto</em>&#8221; e termina com uma definição mais abrangente: &#8220;<em>arquitetura é tudo aquilo que importa</em>&#8220;. Com tantas definições, talvez seja mais fácil diferenciarmos design de arquitetura.</p>
<p><strong>Qual é a diferença de design e arquitetura de software?</strong><br />
Aqui também temos uma resposta clássica na literatura: a arquitetura é responsável pelos requisitos não-funcionais, e o design pelos funcionais. Mas parece que essa distinção não é tão clara assim para muitos outros autores.</p>
<p><a href="http://www.ibm.com/developerworks/java/library/j-eaed10/index.html#distinguishing">Neal Ford apresenta uma distinção</a> simples, realçando que o design é feito em cima do que foi decidido pela arquitetura, e por isso o que faz parte da arquitetura é mais difícil de mudar. Devemos minimizar as peças que dificultam mudanças do nosso design, mas é impossível eliminar todas, além de que flexibilidade sempre vem a um custo de complexidade.</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/07/design.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/07/design-150x150.jpg" alt="" title="design" width="150" height="150" class="aligncenter size-thumbnail wp-image-2966" /></a></center></p>
<p>É difícil criar um distinção maior entre os dois. No livro Patterns of Enterprise Application Architecture, Fowler diz que &#8220;<em>alguns dos padrões nesse livro  podem ser chamados arquiteturais, já que representam decisões importantes sobre essas partes; outros são mais sobre design e te ajudam a implementar essa arquitetura. Eu não faço nenhuma tentativa forte de separar esses dois, já que é <strong>o que é arquitetural ou não é subjetivo</strong></em>&#8220;.</p>
<p><strong>O arquiteto deve saber programar na plataforma em questão?</strong><br />
Sem dúvida. Cada vez mais vemos que o <a href="http://www.slideshare.net/pcalcado/expressive-design-in-20-minutes">design e a implementação devem ser trabalhados juntos</a>. A imagem de um <a href="http://www.infoq.com/presentations/agilists-and-architects">arquiteto distante sem profundo conhecimento técnico que apenas toma as grandes decisões</a> ficou pra trás: conhecimento técnico e a capacidade de liderança são as características fundamentais. </p>
<p>Mais do que querer ser o poderoso arquiteto que apenas despacha ordens e toma todas as grandes decisões, cada vez mais enxergamos que o caminho é ser o líder que incentiva essa tomada de decisão, além de ser um exímio  programador. Parafraseando mais uma vez Martin Fowler, &#8220;<em>&#8230;o arquiteto deve ser como um guia&#8230; que é um experiente e capacitado membro da equipe que ensina aos outros a melhor se virarem, ainda assim ele está sempre lá para as partes mais complicadas</em>&#8220;. </p>
<p>Vale lembrar que <a href="http://norvig.com/21-days.html">precisamos de mais de 10 mil horas, ou 10 anos, para dominar uma linguagem</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/entao-voce-quer-ser-um-arquiteto-java/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>Escalando sistemas com soluções NoSQL</title>
		<link>http://blog.caelum.com.br/escalando-sistemas-com-solucoes-nosql/</link>
		<comments>http://blog.caelum.com.br/escalando-sistemas-com-solucoes-nosql/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 18:21:03 +0000</pubDate>
		<dc:creator>douglas.campos</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[resque]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2613</guid>
		<description><![CDATA[Um dos grandes desafios enfrentados no dia a dia do desenvolvedor eficaz é o de cumprir requisitos não-funcionais de uma aplicação, principalmente os relacionados a performance e escalabilidade. Uma das alternativas mais conhecidas para escalar horizontalmente é a de dividir as tarefas que não necessitam de retorno imediato ao cliente em processos batch. Para tanto, <a href="http://blog.caelum.com.br/escalando-sistemas-com-solucoes-nosql/#more-2613'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/06/resque-web-e1275918412140.jpg" width="240" />
		</p><p>Um dos grandes desafios enfrentados no dia a dia do desenvolvedor eficaz é o de cumprir requisitos não-funcionais de uma aplicação, principalmente os relacionados a <strong>performance</strong> e <strong>escalabilidade</strong>. Uma das alternativas mais conhecidas para escalar horizontalmente é a de dividir as tarefas que não necessitam de retorno imediato ao cliente em <strong>processos batch</strong>. Para tanto, podemos usar diversas ferramentas, desde soluções caseiras até diversos frameworks, tanto em ruby como em java.</p>
<p>Quando se trata de processos batch, é comum buscar um controle mais fino sobre o resultado da execução (sucesso, falha, pendente, etc). Normalmente, usaríamos bancos relacionais para isso, tanto pela sua popularidade como pela performance. Supondo que eu precise gerenciar 1000 pequenas tarefas simultâneas, pagaríamos um preço bem alto pela concorrência, visto que o banco começaria a demorar para obter o lock, fazer o insert, refazer o lock e atualizar o status da tarefa. Muitos consideram o uso de banco de dados relacionais um erro para casos como esse. Buscando eficiência, poderíamos usar uma <a href="http://blog.caelum.com.br/2009/10/30/bancos-de-dados-nao-relacionais-e-o-movimento-nosql/">solução NoSQL</a> para persistência e controle das tarefas, onde evitaríamos os locks, graças ao modelo de concorrência simplificado. </p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/06/resque-web.jpg"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/06/resque-web-e1275918412140-300x224.jpg" alt="" title="interface de administraçao resque-web" width="300" height="224" class="alignright size-medium wp-image-2628" /></a></center></p>
<p>Uma opção em ruby é o <strong><a href="http://github.com/defunkt/resque">resque</a></strong>, um framework de processamento batch criado pelo <a href="http://github.com">github</a> que utiliza o <a href="http://redis.io/">redis</a>, um banco de dados não-relacional, tanto para persistir as tarefas, como para coordenar os diversos processos executores de tarefas, mais conhecidos como <em>workers</em>.</p>
<p>Agendar um processo é bem simples &#8211; basta que eu tenha uma classe ruby com um método <code>perform</code>, com o processamento a ser executado e um atributo de instância <code>@queue</code> define em qual fila a tarefa será colocada:</p>
<pre class="brush: ruby; title: ; notranslate">
# uma classe qualquer, poderia ser um model
class Relatorio
    @queue = :relatorio_anual

    def self.perform(ano)
        gera_relatorio_anual(ano)
    end
end
</pre>
<p>e finalmente, faço o agendamento:</p>
<pre class="brush: ruby; title: ; notranslate">
#método recebe a classe da tarefa, e os argumentos
Resque.enqueue(Relatorio, 2009)
</pre>
<p>Essa chamada faz uso bem eficiente de metaprogramação, de maneira que um worker posteriormente executará um código semelhante a esse:</p>
<pre class="brush: ruby; title: ; notranslate">
classe, argumentos = Resque.reserve(:relatorio_anual)
classe.perform(*argumentos) if class.respond_to? :perform
</pre>
<p>posteriormente iniciamos um worker usando as tasks do rake que vem no próprio resque, indicando qual fila o worker que estamos criando vai atender</p>
<pre class="brush: bash; title: ; notranslate">
$ QUEUE=relatorio_anual rake resque:work
</pre>
<p>assim que o worker subir ele já irá executar <code>Resque.reserve</code>, que o colocará em espera por novos trabalhos. opcionalmente, poderíamos executar um worker para atender todas as filas:</p>
<pre class="brush: bash; title: ; notranslate">
$ QUEUE=* rake resque:work
</pre>
<p>O principal fator que contribui para que <em>resque</em> e <em>redis</em> funcionem como um relógio é o fato de ambos estarem focados em alta performance e, ao mesmo tempo, extrema simplicidade sem ser muito invasivo, já que permitem que você mantenha sua estrutura de persistência relacional inalterada. </p>
<p>Cada vez mais sistemas vem utilizando solucões NoSQL para algumas funcionalidades específicas, como foi o caso recente do <a href="http://blog.mongodb.org/post/660037122/holy-large-hadron-collider-batman">Large Hadron Collider com o Mongo DB</a>. Parece que a combinação de bancos relacionais e não-relacionais no mesmo sistema, cada um com seu propósito, tem sido a direção tomada pelo mercado.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/escalando-sistemas-com-solucoes-nosql/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Cloud Computing na Casa Branca e o PaaS</title>
		<link>http://blog.caelum.com.br/cloud-computing-na-casa-branca-e-o-paas/</link>
		<comments>http://blog.caelum.com.br/cloud-computing-na-casa-branca-e-o-paas/#comments</comments>
		<pubDate>Fri, 14 May 2010 13:39:49 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[opinião]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2450</guid>
		<description><![CDATA[Não é novidade empresas economizarem milhares de dólares ao adotarem o cloud, como foi o caso do New York Times. Agora, foi a vez do governo norte americano, que deve economizar mais de um milhão de dólares até 2011 através do Amazon EC2. O Amazon EC2 permite inúmeras configurações diferentes e você pode tomar diversas <a href="http://blog.caelum.com.br/cloud-computing-na-casa-branca-e-o-paas/#more-2450'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/05/whitehouse.png" width="240" />
		</p><p>Não é novidade empresas economizarem milhares de dólares ao adotarem o cloud, <a href="http://open.blogs.nytimes.com/2007/11/01/self-service-prorated-super-computing-fun/">como foi o caso do New York Times</a>. Agora, foi a vez do <strong>governo</strong> norte americano, que <a href="http://radar.oreilly.com/2010/05/white-house-moves-recoverygov.html">deve economizar mais de um milhão de dólares até 2011</a> através do Amazon EC2.</p>
<div id="attachment_2499" class="wp-caption aligncenter" style="width: 310px"><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/05/whitehouse.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/05/whitehouse-300x159.png" alt="" title="whitehouse cloud computing" width="300" height="159" class="size-medium wp-image-2499" /></a><p class="wp-caption-text">Governo americano começa a adotar o cloud.</p></div>
<p>O Amazon EC2 permite inúmeras configurações diferentes e você pode tomar diversas decisões: quantos servidores precisa, como fazer o balancing, quando colocar ou retirar um novo servidor, etc. Ele te serve com a infraestrutura que você definir, abstraindo o hardware, daí o termo <strong>I</strong>nfrastructure <strong>a</strong>s <strong>a</strong> <strong>S</strong>ervice (<em>IaaS</em>).</p>
<p>A outra opção é a <strong>P</strong>latform <strong>a</strong>s <strong>a</strong> <strong>S</strong>ervice (<em>PaaS</em>), que <strong>restringe</strong> suas opções: essa modalidade costuma definir frameworks, uso de threads, conexões, sistema de arquivos e até mesmo qual banco de dados você vai utilizar.</p>
<p>O Google App Engine (GAE) é hoje o líder em plataforma como serviço. Você tem uma série de restrições para utilizá-lo, e o único banco de dados que pode utilizar é um <a href="http://blog.caelum.com.br/bancos-de-dados-nao-relacionais-e-o-movimento-nosql/">não relacional</a>, o BigTable do Google. Nesse mesmo grupo, encaixam-se o SalesForce (<a href="http://www.force.com">Force.com</a>), o Heroku e o <a href="http://blogs.vmware.com/console/2010/04/vmforce-and-vmwares-open-paas-strategy.html">recentemente anunciado VMForce</a> (junto com a SpringSource).</p>
<p><strong>Por que então alguém utilizaria o <em>PaaS</em> em vez de <em>IaaS</em>, se teremos restrições? </strong></p>
<p>Como Krishnan Subramanian descreve <a href="http://www.cloudave.com/link/paas-is-the-future-and-heroku-wants-to-be-part-of-it-part-1">em</a> <a href="http://www.cloudave.com/link/paas-is-the-future-of-cloud-services-vmforce-a-marriage-of-convenience">três</a> <a href="http://www.cloudave.com/link/paas-is-the-future-of-the-cloud-services-heroku-is-ready-to-be-there">artigos</a>, o PaaS abstrai todo o ambiente e middleware para você, até mesmo as decisões operacionais e de configuração.  Ele vai além, e diz que o PaaS é quem vai ganhar grande parte do mercado, dado que cada vez mais as aplicações, mesmo as que não necessitam (ao menos por enquanto) de grande escalabilidade, vão migrando para o Cloud. Colocar sua aplicação no PaaS é muito mais simples que no IaaS, mas você tem de pagar o preço: suas restrições.</p>
<p>A <a href="http://blog.caelum.com.br/o-cloud-computing-e-inevitavel/">Caelum usa o Cloud do Google App Engine</a> há mais de 6 meses, e isso já nos salvou de picos de acesso ao sistema de reserva e acesso ao site, como quando <a href="http://info.abril.com.br/noticias/carreira/aprenda-java-de-graca-na-internet-24112009-9.shl">a Info Online noticiou nossas apostilas</a> ou quando enviamos <a href="http://www.caelum.com.br/newsletter/">nossa newsletter</a> para os milhares de usuários cadastrados. E, mesmo para um site pequeno como o da Caelum, sem grandes requisitos de escalabilidade, a tranquilidade de saber que ele não ficará indisponível por causa de picos momentâneos é o grande atrativo. Além, claro, da enorme redução de trabalho com infraestrutura e custo.</p>
<p>E você, planeja migrar sua aplicação para o Cloud e diminuir a dor de cabeça com escalabilidade? Ela está apta para enfrentar  bancos não relacionais ou restrição a threads e file system no PaaS, ou você vai direto para o IaaS, tendo total controle porém mais trabalho operacional?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/cloud-computing-na-casa-branca-e-o-paas/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

