terça-feira, 11 de setembro de 2007

Clustering de Jboss - Parte 1

Há algumas semanas atrás eu estava estudando a melhor arquitetura para uma nova aplicação que estamos fazendo. Esta aplicação a princípio deveria por obrigatoriedade rodar clusterizada e distribuida, sendo ela dividida em algumas partes distintas. OK, pensei comigo mesmo, a melhor maneira de fazer isso, é com EJB mesmo, não vai ter como fugir desta vez.

Embora, EJB tenha um certo overhead na parte de lookup e tudo mais, me pareceu a melhor saida no momento mesmo. E analisando melhor a aplicação, a melhor saida ainda, era usar JMS. Devido ao Assincronismo da aplicação. Enfim, para isso tive que estudar certinho como é que o jboss trabalha com o cluster dele, e como fazer funcionar, além de ter que verificar como fazer para que os MDBs e a Fila ficassem clusterizados também.

Então, resolvi postar aqui como fazer tudo isso funcionar, pois a documentação do JBoss não é lá grandes coisas, embora tenha ajudado muito, e o material na internet não é tão abundante assim.


Colocando o Jboss em Cluster


Bom, para utilizar o Jboss em cluster, primeiro é claro você precisa de 2 máquinas ligadas em rede. Da até pra utilizar na mesma para fazer testes, mas da muito empenho, vai por mim, mas se você precisa mesmo utilizar, você precisa trocar TODAS as PORTAS que o Jboss usa, que não são poucas, e para isso precisa garimpar nos milhares de .xml que ele tem (boa sorte =]). Este post pode te ajudar em algumas, porém ele fala de Jboss rodando na configuração default, mas na all que é onde ele já tem as configurações de cluster, tem muito mais portas =).

Então temos, 2 máquinas ligadas em rede e conversando entre si. Simplesmente o que precisamos fazer para colocá-las em Cluster é levantar o jboss de uma máquina e depois de outra, utilizando a configuração all, assim:


run.bat -c all -b 10.77.6.26 (coloque o ip da maquina aqui)


Como pode se notar, o parametro -c indica qual configuração ele vai utilizar, e o parâmetro -b qual será o IP utilizado para identificar a máquina. Caso não seja passado o ip, o default assumido será 127.0.0.1.

Quando "subir" um jboss você notará nas mensagens de log que ele reconheceu que é o primeiro nó do cluster, ou que ele não conseguiu achar nenhum outro nó "no ar" para formar um cluster. Este Jboss estará rodando OK, porém sozinho esperando encontrar algum outro nó para formar o cluster. O próximo passo então, é subir o outro Jboss. Na hora que ele estiver subindo, irá mandar uma mensagem em multicast (ip=228.1.2.3 porta=45566 via UDP) o servidor que já está no ar irá receber esta mensagem, e então inicia o "handshake" e pronto, eles entram em cluster. Tudo isso será mostrado no log do seu jboss, então para isso deixe o cosole aberto e vá vendo as mensagens que vão aparecendo. Irá aparecer algo assim para o primeiro nó:

16:12:40,828 INFO [DefaultPartition] Number of cluster members: 1
16:12:40,828 INFO [DefaultPartition] Other members: 0
16:12:40,828 INFO [DefaultPartition] Fetching state (will wait for 30000 milliseconds):
16:12:40,828 INFO [DefaultPartition] State could not be retrieved (we are the first member in group)

Você pode inclusive ter vários "clusteres" em uma mesma rede, basta para isso mudar o nome do cluster (no arquivo /server/all/deploy/cluster-service.xml), que por default vem com o nome de DefaultPartition. Para verificar se os seus Jboss estão em cluster, além de ver no console que o cluster foi formado, abra o jmx-console e procure por DefaultPartition e clique nele. Lá você encontrará os IPs das máquinas que estão fazendo parte do Cluster na opção
CurrentView.

Vale a pena ressaltar que a comunicação padrão entre os nós do cluster é feita via UDP com Multicast. No meu caso, eu enfrentei problemas para que os nós se achassem, havia muita demora para formar o cluster, e o farm-deployment raras vezes acontecia. Por um problema de Windows (eu li em algum lugar alguma coisa assim), ou do elemento de rede entre os pontos (a nossa rede é uma bosta), não sei bem o que poderia ser, mas não me surpreenderia com nenhuma das possibilidades. O que me deu esta luz, foi justamente este post, ao menos ele estava tendo o mesmo problema que eu. Lembre-se disso caso esteja tendo problemas, isso pode te economizar muito tempo =)

Enfim, o que tive que fazer para funcionar foi alterar o protocolo de UDP para TCP. Fiz isso no arquivo /server/all/deploy/cluster-service.xml). Logo no começo do arquivo existe uma tag chamada < attribute name="PartitionConfig" > , e dentro desta tag tem um outro elemento chamado < Config >. O que vem habilitado (descomentado) por padrão é o UDP, e (graças a Deus) logo abaixo vem a configuração de TCP comentada. Então o que precisa fazer é descomentar um e comentar o outro. E alterar o elemento TCPPING para que ele contenha os IPs dos principais nós do seu cluster, os quais ele acha no começo, depois você pode incluir outros. Então ficaria algo mais ou menos assim:

< tcpping initial_hosts="${jboss.bind.address}[7800],10.77.6.40[7800]"

Sendo que o próprio jboss substituirá jboss.bind.address pelo seu endereço de IP, e o ip que aparece ali, é o IP do outro nó do seu cluster, ou quantos nós você tiver.


Farm Deployment

Outro aspecto interessante do JBoss, é o deployment em farm. Que nada mais é, você precisar apenas se preocupar com um dos nós, e este cuida de replicar o seu estado para os outros. Então, basta apenas você ter sua aplicação publicada em um dos nós e este copiará a todos os outros a aplicação. O mesmo acontece quando você fizer undeploy de uma aplicação em um dos nós.

Para publicar uma aplicação no farm, basta você copiá-la para o diretório /server/all/farm ao invés de copia-la para /server/all/deploy como é o padrão. Caso você copie para o diretório deploy a sua aplicação será publicada apenas na máquina em questão e o farm-deployment não será executado.

Conclusão

Eu não esperava, mas este será o primeiro de uma série de 3 posts (possivelmente), pois senão iria ficar um post muito grande, e eu não gosto de ler posts muito grandes. Então pretendo nos próximos posts falar sobre como configurar sua fila JMS no esquema de High Availability. E ainda uma aplicação de exemplo para testar este esquema. E como deixar seu Jboss mais "tunado" =)

Até!

[edited]
O Paulo Jerônimo tem um screencast bem interessante sobre como rodar mais de um jboss em cluster na mesma máquina.

quinta-feira, 16 de agosto de 2007

Photosync - Amazing!

Eu não sei quem já conhecia esta "ferramenta/tecnologia" mas pra mim isso é novo. Posso dizer que fiquei realmente impressionado, e achei bastante interessante do aspecto tecnológico... E pasmem, não é coisa da Google hehehehe a MS saiu na frente e comprou os caras =(

O que isso faz? Ele pega milhares de fotos "tagueados" com uma certa palavra e sintetiza as imagens pegando pedaços de cada uma, juntando tudo, formando assim uma imagem tridimensional. Pense nas possibilidades?! ;) cool! Agora assista o vídeo!

Vídeo da Apresentação do Photosync no TED

Quem sabe depois vc queira dar uma testadinha:
Try it - Photosync

ps: Eu não consegui testar, o programa não conseguiu carregar "a Collection...", nem com o IE funfou essa parada.

segunda-feira, 13 de agosto de 2007

Testando Servidor de Email via Telnet

As aplicações de hoje, em quase sua maioria compreendem aplicações para internet ou com alguma interação com internet, e normalmente utilizam-se de serviços que enviam emails. Como as linguagens hoje, possuem API´s para tudo que é coisa, não podia deixar de faltar API´s para envio de email. Essas API´s, já fazem muitas coisas que não nos interessa saber de como é feito. No caso de Java existe a JavaMail API, ela já faz parte da especificação e já vem como parte da espec. JEE. Mas mesmo assim existem API´s complementares para envio de email, como é o caso da Email-API da Apache. Aproveitando este post, um código simples para mandar emails é mais ou menos assim:



O que muitos desenvolvedores não sabem, é como funciona um servidor de email (smtp), principalmente como ao menos testar se ele está funcionando. Exporadicamente eu preciso testar um servidor de smtp localizado em algum servidor, e para isso eu sempre preciso pesquisar quais são os comandos exatos para fazer um teste via telnet neste servidor. Mas como um cara esperto que sou, eu anotei (depois da enézima vez que precisei) e humildemente vos posto esta maneira simples de fazê-lo, e agora vocês já sabem onde achar (e eu também) =)

telnet ipDoServidorSmtp 25
mail from: email@domain.com [enter]
rcpt to: seuemail@domain.com [enter]
data [enter]
[aqui vai o corpo do email]
. [enter]
quit
Just another Tip & Trick.
Valeu

terça-feira, 7 de agosto de 2007

The Dark Tower - Finished

Este post é um useless post.

Terminei ontem o último livro da série a Torre Negra do autor Stephen King. Foram 7 livros, mais de 4000 (Quatro mil) páginas, de uma história envolvente, muito bem bolada, que te transportava para um mundo (vários mundos) cheio de aventuras e particularidades.

Stephen King (site oficial, wikipedia) é muito conhecido por ser o mestre do Terror/Suspense, muitos dele nem tanto terror e suspense assim, diria que ele é um autor bem completo, passando por Suspense, Terror, Drama, Aventura, Épico. Mas queria deixar claro que seus filmes não são um terror do tipo "Massacre da Serra-Elétrica", ou muito menos aqueles filmes de terror de adolescentes americanos, ou como dizia um amigo (que trabalhou na Wise comigo em Curitiba) o Marcão, "filme de galerinha" =).

Algumas obras de Stephen King são muito conhecidas, alguns já clássicos, outros bem contemporâneos, como O Iluminado (The Shining com duas versões), A coisa (It), Um sonho de Liberdade (The Shawshank Redemption), À Espera de um Milagre (The Green Mile), A Mansão Marsten (Salem´s Lot), A tempestade do Século (Storm of the Century - que é continuação do Salem´s Lot), Conta comigo (Stand By Me), Cemitério Maldito (Pet Sematary), Carrie a Estranha (Carrie), Christine (Christine) esses que lembrei agora de cabeça, mas existem muitas obras mesmo, deste grande autor, muitas delas transportadas para Televisão e Cinema.

Bom, já deu pra perceber que sou um grande fã de Stephen King. Apesar de não ser fanático, este Livro A Torre Negra, é sem dúvida a grande obra dele, até mesmo reconhecida assim por ele. Um aspecto interessante de se observar nas obras de Stephen King, é que todas, mas muito mais principalmente esta, estão interligadas, ou tem algum personagem ou faz referência a outras de suas obras. Por isso não se surpreenda, caso você comece a ler esta história e achar que já viu/leu algo assim em outra história de King. Afinal, o mundo é uma roda. =)

A idéia original da história surgiu de um poema épico do século XIX de Richard Browning chamado Childe Roland A Torre Negra Chegou (Childe Roland The Dark Tower Comes). Porém sua história também foi baseada no universo Imaginário de J. R. R. Tolkien, lendas como a de Rei Arthur e seus cavaleiros, usando ainda muitas referencias atuais (ao mundo atual), e ao Faroeste.

Eu resumo esta história como uma intersecção (ou por que não mistura?) de Senhor dos Anéis e de Matrix. Se você conseguir pensar em misturar tais coisas.

O principal personagem desta história é chamado de Roland, o qual é um Pistoleiro. Os pistoleiros são uma estirpe quase extinta, e eles são, digamos assim, os guardiões do Mundo. A Torre Negra, o objeto de maior desejo e o principal objetivo deste pistoleiro, está no centro de todos os mundos, e estes mundos são sustentados por Feixes de Luz, que são interligados no centro pela Torre Negra. Os mundos são ameaçados pelo Rei Rubro (Le Roy Russe), e por seu fiel mago, que assume vários nomes e formas, durante toda a história, uma delas é o Homem de Preto. E a história da Torre Negra, é iniciada assim:

"O Homem de Preto fugia pelo deserto. E o pistoleiro ia atrás."
A partir desta singela frase, um mundo (vários mundos) tomam forma, e personagens nascem e morrem. Há muita morte (menos pra você pistoleiro), sangue, aventura, drama, tensão, amor, paixão, lealdade, aprendizado, ódio, raiva, inteligência, brincadeiras... Realmente uma história completa.

Para quem gostaria de se aventurar com esta magnífica história, eu preciso dizer antes mais umas coisinhas. O primeiro livro, foi escrito em 1970, quando o autor ainda era um estudante universitário, e o segundo livro foi sair apenas em 1987 quando o autor, já estava mais maduro. Por isso se você não gostar do primeiro livro, leia-o inteiro mesmo assim (são apenas 200 páginas), então leia o segundo, se logo no começo você não gostar da história, dai sim, você poderá desistir, mas não antes disso OK?!

Além dos livros, no começo deste ano saiu pela Marvel Comics os quadrinhos do Pistoleiro chamado A Torre Negra (claro!).

Bom, pra finalizar uma lista dos livros da série a Torre Negra:
  1. Volume I: O Pistoleiro (The Gunslinger)
  2. Volume II: A Escolha dos Três (The Drawing of the Three)
  3. Volume III: As Terras Devastadas (The Wastelands)
  4. Volume IV: Mago e Vidro (Wizard and Glass)
  5. Volume V: Lobos de Calla (Wolves of Calla)
  6. Volume VI: Canção de Susannah (Song of Susannah)
  7. Volume VII: A Torre Negra (The Dark Tower)
É... infelizmente é isso, me despeço hoje do Pistoleiro e de seu ka-tet e de sua busca (eterna). Não sei se queria mesmo que chegasse ao fim. É muito boa a história, e era bom sempre ter algo pra ler que fosse realmente agradável. Realmente, o que satisfaz é a busca e não o resultado da busca. =)

Longos dias e belas noites a todos!

sexta-feira, 27 de julho de 2007

Analogias de Desenvolvimento de Software

Achei uns artigos muitos bons navegando por ai.
Um dos que me "chocou", chamou mais a atenção, espantou... sei lá, um dos que gostei foi este artigo.

Ele me levou a lembrar que lá atrás na faculdade, quando nos era ensinado Análise de sistemas num esquema puramente WaterFall, utilizando abordagens Bottom-Up e Top-Down, nos era dito também, que para construir software deveríamos fazer como o pessoal de Construção Civíl, o qual fazia todo o projeto de um prédio, e depois começava a construir. Se eles conseguem/podem fazer isso por que um simples software não pode ser feito assim?!

No Artigo do primeiro link, ele começa contando uma historinha, contando quando foi para uma construção, ou para uma aula de engenharia civíl, não entendi direito, mas vou traduzir aqui:

"O que você está fazendo aqui?" - Eles perguntaram

Eles eram Encarregados, Gerentes de Projeto, Superintendentes, e estavam fazendo um projeto no Lean Construction Institute (LCI) (o que é isso ai não tenho a mínima idéia, mas eu acho que era pra ser conhecido). Verdade, que que o cara estava fazendo la?

Então o cara começou a explicar: "No desenvolvimento de Software, nos é ensinado que devemos gerenciar projetos como os projetos de Construção Civíl. Onde uma construção é planejada no início, custos e prazos são previsíveis, e os clientes recebem o que eles esperam receber."

Silêncio... "Você está brincando, certo?" "Não! Verdade, é assim que nos é ensinado."

Então, incredulidade torna-se em grades gargalhadas!
Quem já fez alguma construção, ou já precisou de que alguém construisse algo para você (o que é bem mais provável, visto que somos desenvolvedores de software), sabe que a obra sempre custa mais do que no início seu pedreiro disse que custaria, e a maldita obra parece não ter fim. Minha mãe está passando por uma reforma em sua casa, e já fazem quase 2 meses, isso que era pra terminar em 2 semanas. Sem contar, que obras externas sempre dependem das condições climáticas.
Outro artigo que achei legal, simples e direto foi este de Joel Spolsky. Tem ainda este.
Mas realmente uma Analogia mais real é a que Marcos Pereira, descreveu em: Desenvolver Software é igual a dirigir. Um dia ainda será assim em todo o lugar, e a paz mundial reinará! Mas até agora, poucas pessoas tem se beneficiado disso.
Outra pedrada, é um post do Thiago Arrais, onde ele diz que Fábricas de Software são uma analogia levada longe demais.

Acho que uma outra analogia boa para desenvolvimento de software como é feito atualmente neste modelo de WaterFall, está na agricultura. De que depende a agricultura e que o seu plantio tenha um bom rendimento? (Porque sejamos francos, tudo gira em torno do dinheiro. Ok, eu não sou nenhum agrônomo, mas vou tentar não falar merda)
  1. De um bom preparo do solo no princípio - Ter bons profissionais, Análise e Arquitetura inicial
  2. Plantar em época correta. - Saber o que usar.
  3. Cuidado no início, com pesticidas, fungicidas e tudo mais. - Ser maleável quanto a arquitetura incial, pois ela pode mudar conforme o entendimento do que é pra fazer vai aumentando.
  4. Rezar para não chover demais, nem de menos, em tempo de germinação. - Literalmente, rezar para que o entendimento inicial, realmente tenha previsto quase tudo, e que não surjam problemas muito complicados
  5. Saber a hora de colher.
  6. Rezar para não chover demais nem de menos em época de colheita. - Rezar para mostrar pro cliente na hora certa o software, para que ele não se decepcione de início. =)
  7. Conseguir estocar ou vender em uma época que o preço está bom. - Ter um ótimo departamento de Relação com o cliente, para fazer ele enxergar o software mais belo do que realmente é. =)
Talvez não tenha sido feliz em todas as analogias, mas era pra ser um pouco engraçado =)

Enfim, eu ainda trabalho em um modelo WaterFall, não tenho como mudar isso facilmente. Não vou ficar falando por ai, que sou contra tudo, que vamos revolucionar o mundo, matar todos os gerentes que não pensam igual a nós, como muitos falam por ai. Mas quem sabe com o tempo, ou conhecimento necessário, ou status necessário, ou apoio necessário, ou todas essas coisas juntas, eu consiga ir fazendo esta mudança.

E por fim, não poderia faltar aquela velha analogia de desenvolvimento de software.