Twitter muda front-end de Ruby para Java

Engraçado que a maior parte das pessoas fala e reclama e briga mas não em a menor noção do real problema. O problema do twitter e da maior parte dos sites de porte absurdo (e não grande porte, grande porte é o sitezinho da igreja) é que chega a um momento em que milisegundos fazem diferença do ponto de vista financeiro e também de uso. Pra maior parte dos sites feitos hoje, demorar 800 milisegundos pra trazer um resultado é normal, natural até, quem faz site usando JSF e componentes de terceiros provavelmente está bem pior do que isso porque a maior parte desses arquivos são enviados via filtros e não diretamente como arquivo pelo servidor HTTP e o tempo vai ser tão ruin quanto seria se fosse feito em Ruby, mas ninguém vai se preocupar com isso porque você vai ter lá os seus 5 usuários simultâneos rodando dentro de uma intranet da vida.

O twitter chegou onde chegou porque eles tinham um turnaround altíssimo em Ruby pra adicionar novas funcionalidades e criar coisas novas, coisas que eles não teriam no início em Java e qualquer pessoa que já tenha feito um projeto web em java na vida sabe exatamente isso. A linguagem se prestou perfeitamente pra transformar o site no sucesso que ele é hoje, mas infelizmente o interpretador do Ruby está anos luz atrás da JVM, na verdade TODOS os interpretadores da atualidade comem poeira feio pra JVM a exceção do Mono e do .Net runtime da Microsoft. PHP? Python? Perl? Todos brincadeira de criança quando comparados ao trabalho de engenharia que levou a máquina virtual do Java que nós temos hoje.

Pro twitter cortar esses milisegundos foi não apenas uma diminuição de custos de hardware como também uma melhora do ponto de vista do usuário que vai notar uma diferença grande na busca final.

O problema é da linguagem? Sim e não, o problema é do interpretador primitivo (assim como os do Python, Php e Perl ) e das vantagens que a linguagem oferece e que também e transformam em custos em tempo de execução para o interpretador. Não existe almoço grátis, ter classes abertas, closures, tudo como sendo objetos em Ruby tem um custo alto no tempo de execução. A grande pergunta que as pessoas devem fazer é, será que esse custo se paga pro meu caso? Será que ter todas essas vantagens hoje do ponto de vista da linguagem cobrem as desvantagens da compicação que é pro interpretador lidar com isso?

Teoricamente, deveríamos todos ser partidários da lógica, já que somos todos programadores, mas as pessoas teimam em trbalhar com tecnologia como times de futebol, defendendo um em detrimento do outro, precisamos deixar dessa infantilidade e enxergar os fatos pelos fatos. Me dá pena ver pessoas que criam “ódio” por ferramentas, frmeworks ou linguagens de programação sem nem ao menos tê-los testado, porque essas pessoas simplesmente sinalizam que não serão capazes de continuar no mercado de TI, que é necessariamente sincretista e propenso aos meshes de coisas completamente diferentes.

Vivemos eternamente no problema onde a única ferramenta a mão é o martelo e queremos que tudo o que aparece na nossa frente são pregos.

[quote=Mauricio Linhares]Engraçado que a maior parte das pessoas fala e reclama e briga mas não em a menor noção do real problema. O problema do twitter e da maior parte dos sites de porte absurdo (e não grande porte, grande porte é o sitezinho da igreja) é que chega a um momento em que milisegundos fazem diferença do ponto de vista financeiro e também de uso. Pra maior parte dos sites feitos hoje, demorar 800 milisegundos pra trazer um resultado é normal, natural até, quem faz site usando JSF e componentes de terceiros provavelmente está bem pior do que isso porque a maior parte desses arquivos são enviados via filtros e não diretamente como arquivo pelo servidor HTTP e o tempo vai ser tão ruin quanto seria se fosse feito em Ruby, mas ninguém vai se preocupar com isso porque você vai ter lá os seus 5 usuários simultâneos rodando dentro de uma intranet da vida.

O twitter chegou onde chegou porque eles tinham um turnaround altíssimo em Ruby pra adicionar novas funcionalidades e criar coisas novas, coisas que eles não teriam no início em Java e qualquer pessoa que já tenha feito um projeto web em java na vida sabe exatamente isso. A linguagem se prestou perfeitamente pra transformar o site no sucesso que ele é hoje, mas infelizmente o interpretador do Ruby está anos luz atrás da JVM, na verdade TODOS os interpretadores da atualidade comem poeira feio pra JVM a exceção do Mono e do .Net runtime da Microsoft. PHP? Python? Perl? Todos brincadeira de criança quando comparados ao trabalho de engenharia que levou a máquina virtual do Java que nós temos hoje.

Pro twitter cortar esses milisegundos foi não apenas uma diminuição de custos de hardware como também uma melhora do ponto de vista do usuário que.

O problema é da linguagem? Sim e não, o problema é do interpretador primitivo (assim como os do Python, Php e Perl ) e das vantagens que a linguagem oferece e que também e transformam em custos em tempo de execução para o interpretador. Não existe almoço grátis, ter classes abertas, closures, tudo como sendo objetos em Ruby tem um custo alto no tempo de execução. A grande pergunta que as pessoas devem fazer é, será que esse custo se paga pro meu caso? Será que ter todas essas vantagens hoje do ponto de vista da linguagem cobrem as desvantagens da compicação que é pro interpretador lidar com isso?

Teoricamente, deveríamos todos ser partidários da lógica, já que somos todos programadores, mas as pessoas teimam em trbalhar com tecnologia como times de futebol, defendendo um em detrimento do outro, precisamos deixar dessa infantilidade e enxergar os fatos pelos fatos. Me dá pena ver pessoas que criam “ódio” por ferramentas, frmeworks ou linguagens de programação sem nem ao menos tê-los testado, porque essas pessoas simplesmente sinalizam que não serão capazes de continuar no mercado de TI, que é necessariamente sincretista e propenso aos meshes de coisas completamente diferentes.

Vivemos eternamente no problema onde a única ferramenta a mão é o martelo e queremos que tudo o que aparece na nossa frente são pregos.[/quote]

Concordo plenamente com o Mauricio, principalmente na parte de termos torcedores ao invés de profissionais.

[quote=marcio_gs][quote=Mauricio Linhares]Engraçado que a maior parte das pessoas fala e reclama e briga mas não em a menor noção do real problema. O problema do twitter e da maior parte dos sites de porte absurdo (e não grande porte, grande porte é o sitezinho da igreja) é que chega a um momento em que milisegundos fazem diferença do ponto de vista financeiro e também de uso. Pra maior parte dos sites feitos hoje, demorar 800 milisegundos pra trazer um resultado é normal, natural até, quem faz site usando JSF e componentes de terceiros provavelmente está bem pior do que isso porque a maior parte desses arquivos são enviados via filtros e não diretamente como arquivo pelo servidor HTTP e o tempo vai ser tão ruin quanto seria se fosse feito em Ruby, mas ninguém vai se preocupar com isso porque você vai ter lá os seus 5 usuários simultâneos rodando dentro de uma intranet da vida.

O twitter chegou onde chegou porque eles tinham um turnaround altíssimo em Ruby pra adicionar novas funcionalidades e criar coisas novas, coisas que eles não teriam no início em Java e qualquer pessoa que já tenha feito um projeto web em java na vida sabe exatamente isso. A linguagem se prestou perfeitamente pra transformar o site no sucesso que ele é hoje, mas infelizmente o interpretador do Ruby está anos luz atrás da JVM, na verdade TODOS os interpretadores da atualidade comem poeira feio pra JVM a exceção do Mono e do .Net runtime da Microsoft. PHP? Python? Perl? Todos brincadeira de criança quando comparados ao trabalho de engenharia que levou a máquina virtual do Java que nós temos hoje.

Pro twitter cortar esses milisegundos foi não apenas uma diminuição de custos de hardware como também uma melhora do ponto de vista do usuário que.

O problema é da linguagem? Sim e não, o problema é do interpretador primitivo (assim como os do Python, Php e Perl ) e das vantagens que a linguagem oferece e que também e transformam em custos em tempo de execução para o interpretador. Não existe almoço grátis, ter classes abertas, closures, tudo como sendo objetos em Ruby tem um custo alto no tempo de execução. A grande pergunta que as pessoas devem fazer é, será que esse custo se paga pro meu caso? Será que ter todas essas vantagens hoje do ponto de vista da linguagem cobrem as desvantagens da compicação que é pro interpretador lidar com isso?

Teoricamente, deveríamos todos ser partidários da lógica, já que somos todos programadores, mas as pessoas teimam em trbalhar com tecnologia como times de futebol, defendendo um em detrimento do outro, precisamos deixar dessa infantilidade e enxergar os fatos pelos fatos. Me dá pena ver pessoas que criam “ódio” por ferramentas, frmeworks ou linguagens de programação sem nem ao menos tê-los testado, porque essas pessoas simplesmente sinalizam que não serão capazes de continuar no mercado de TI, que é necessariamente sincretista e propenso aos meshes de coisas completamente diferentes.

Vivemos eternamente no problema onde a única ferramenta a mão é o martelo e queremos que tudo o que aparece na nossa frente são pregos.[/quote]

Concordo plenamente com o Mauricio, principalmente na parte de termos torcedores ao invés de profissionais.[/quote]

Concordo plenamente com o Mauricio, principalmente na parte de termos torcedores ao invés de profissionais. [2]

E só pra complementar um pouco mais, estou trabalhando atualmente exatamente em migrar o backend da empresa de Ruby pra Java, porque estamos tendo um aumento muito grande na quantidade de acessos e os processos em Ruby consomem muito tempo implementando mágica que não precisamos já que o trabalho é basicamente fazer parse de XML, JSON, gerar imagens de PDF e extrair texto de PDFs. O problema é simples e as soluções em java tem um ganho de performance absurdo contra qualquer outra linguagem. Com os benchmarks que fizemos aqui, a extração de texto de arquivos PDF demorava 0.1 segundos em Java e 0.25 com um SDK de terceiros em C e precisamos que isso seja o mais rápido possível, se em C fosse mais rápido, com certeza teríamos ficado com a solução em C.

Já na nossa aplicação web, existe zero de interesse de re-escrever ela em Java, ela é toda em Ruby e deve continuar assim por muito tempo ainda já que ela atende muito bem as nossas necessidades atuais. No dia que ela não atender mais, vamos com certeza mudá-la para que ela seja a melhor possível para os nossos clientes.

Acho que todo mundo deveria por na cabeça que o único time que existe é o time do cliente e você está sempre jogando nele, então é o seu trabalho procurar a melhor solução tecnológica pra ele. E pra fazer isso você tem que procurar conhecer novas tecnologias e novas formas de se resolver os problemas. A comunidade Java produziu muita coisa interessante, gerou projetos que todos nós dependemos até hoje, mas será que não existem em outras linguagens outras soluções que podem ser melhores pros nossos problemas.

Torça pro seu time de futebol, mas pegue todas as linguagens de programação, é a melhor forma de levar a sua carreira de TI, tanto do ponto de vista profissional quanto financeiro, pois quanto mais você sabe, mais você vale e mais vão pagar pelo seu passe.

Na verdade isso tem mais a ver com a API de NIO que utilizaram e design assíncrono /Event-driven. Quando falamos nesse tipo de arquitetura, significa: imutabilidade de objetos, não blocante ! Lembrando que essa é a chave, pois eles lidam com streams.

O Rails é um framework Request-Driven, síncrono e isso traz problemas quando você precisa escalar para milhares de nós, entrentato em Ruby você poderia escrever design Non-Blocking, event-driven utilizando Goliath, que utiliza Fibers ( Ruby 1.9) para endereçar - http://www.infoq.com/news/2007/08/ruby-1-9-fibers.

Dêem uma lida em performance: http://postrank-labs.github.com/goliath

Para Java e Scala, existe uma alternativa bem bacana para esse tipo de design, que é a utilização de Actors Model com Akka Framework - http://www.akka.io , desenhado pelo Jonas Bóner, engenheiro do Terracota.

O Akka trabalha com isolamento, atores remotos acessados através do Protobuf - http://code.google.com/p/protobuf e isso garante uma rápida comunicação.

Uma outra solução, seria utilizar SEDA (http://www.eecs.harvard.edu/~mdw/proj/seda) e talvez até mesclar, implementar SEDA com ActorsModel.

Resumindo, a JVM é parruda e ninguém discute, entretanto se utilizar com a arquitetura “convencional” request-driven síncrono, talvez o benefício não seja tão grande.

A questão da equipe do Twitter pode ter sido maturidade dos projetos, já que o Netty possui mais tempo e o código dele realmente é limpo, olhei o repositório logo quando vi a notícia, enquanto o Akka que eu citei, é muito sujo, pessoal que vem do C.

Como o Maurício disse, também acho que estão fugindo muito por aqui da discussão técnica e caindo para o mesmo pensamento que critico em developers Microsoft, que não enxergam um palmo à sua frente.

Todas as linguagens são interessantes, gostaria de ter tempo pra estudar diversas outras, pois cada linha de pensamento diferente, como programação funcional do lisp e haskell, ou a facilidade de metaprogramação do Ruby vai te tornar um programador melhor.

Quem aqui já escreveu uma DSL ? Veria Ruby com outros olhos.

Pra finalizar: Isso aqui não é futebol pra ter torcida !! :slight_smile:

PS: Gostaria de discutir por aqui alternativas de design, SEDA vs Actors, combinação, Fibers - JVM e por aí vai…

º´~s

Kenobi

É importante lembrar também que usar IO assíncrono não significa ser mais rápido, IO assíncrono normalmente é mais lento que IO síncrono, as pessoas procuram IO assíncrono porque elas reduzem a quantidade de threads necessárias pra fazer o mesmo trabalho, já que você não precisa de uma thread lendo e outra escrevendo do socket pra fazer o trabalho e com menos threads você estressa menos o SO e fica mais fácil de aceitar uma quantidade maior de clientes, já que a quantidade de threads que podem existir no SO é finita e cada thread também aumenta o trabalho do scheduler e o consumo de memória com o seu stack.

Bem lembrando Maurício, inclusive o Porcelli fez uma experimento com o Akka e o achou lento, comparando ao multithread tradicional, entretanto a proposta do mesmo é escalabilidade.

Acredito que vão conseguir ainda otimizar e comunicação remota é uma das coisas que pega em qualquer ambiente distribuído.

Falando no design de Actors, na verdade a Thead fica em Loop, esperando atores processarem, portanto, uma Thread consegue endereçar diversos atores, consequentemente respondendo a diversos requests.

[quote=Mauricio Linhares]E só pra complementar um pouco mais, estou trabalhando atualmente exatamente em migrar o backend da empresa de Ruby pra Java, porque estamos tendo um aumento muito grande na quantidade de acessos e os processos em Ruby consomem muito tempo implementando mágica que não precisamos já que o trabalho é basicamente fazer parse de XML, JSON, gerar imagens de PDF e extrair texto de PDFs. O problema é simples e as soluções em java tem um ganho de performance absurdo contra qualquer outra linguagem. Com os benchmarks que fizemos aqui, a extração de texto de arquivos PDF demorava 0.1 segundos em Java e 0.25 com um SDK de terceiros em C e precisamos que isso seja o mais rápido possível, se em C fosse mais rápido, com certeza teríamos ficado com a solução em C.

Já na nossa aplicação web, existe zero de interesse de re-escrever ela em Java, ela é toda em Ruby e deve continuar assim por muito tempo ainda já que ela atende muito bem as nossas necessidades atuais. No dia que ela não atender mais, vamos com certeza mudá-la para que ela seja a melhor possível para os nossos clientes.

Acho que todo mundo deveria por na cabeça que o único time que existe é o time do cliente e você está sempre jogando nele, então é o seu trabalho procurar a melhor solução tecnológica pra ele. E pra fazer isso você tem que procurar conhecer novas tecnologias e novas formas de se resolver os problemas. A comunidade Java produziu muita coisa interessante, gerou projetos que todos nós dependemos até hoje, mas será que não existem em outras linguagens outras soluções que podem ser melhores pros nossos problemas.

Torça pro seu time de futebol, mas pegue todas as linguagens de programação, é a melhor forma de levar a sua carreira de TI, tanto do ponto de vista profissional quanto financeiro, pois quanto mais você sabe, mais você vale e mais vão pagar pelo seu passe.[/quote]

Interessante esse caso. Está aí uma demonstração do enorme poder da plataforma Java. Pena que não há como comparar com todas as plataformas…

Olá

Só para reafirmar alguns conceitos…

IO pode ser bloqueante e não bloqueante. IO bloqueante é sempre síncrono. IO não bloqueante pode ser síncrono (padrão Reactor) ou assíncrono (padrão Proactor).

E o Maurício tem razão. IO Assíncrono não garante operação mais rápida do que IO síncrono (para fazer uma única coisa por vez). Até porque para ser assíncrono precisa usar software muito mais complexo. Mas se a gente trabalha com recursos finitos, IO assíncrono não bloqueante permite usar os mesmos recursos de forma mais efetiva e responder maior número de solicitações. E também facilita o aumento de recursos escalando horizontalmente.

Outra coisa que quero lembrar…

O Netty atual foi feito pelo coreano Trustin Lee que fez o Apache Mina baseado no antigo Netty igualmente feito por ele. Como o próprio manual do Netty chama a atenção, tratar Streams tem lá suas dificuldades. O tem um modelo de threads que atende um modelo de eventos tal como o SEDA.

E atenção que o Netty também tem a fragilidade de ter pouca gente que o entenda e capaz de evoluí-lo. Com a notícia desta semana que o Trustin Lee está procurando emprego, aumentaram minhas preocupações. Mesmo assim pretendo usar em um próximo projeto porque acho melhor do que o Mina e já fracassei tentando usar o Grizzly.

Quanto ao Akka acompanho o projeto com muito interresse, acho que pode ser muito útil para trocar mensagens, mas para construir um servidor ou um gateway, a menos que futuros testes me provem em contrário, o Netty ainda é meu favorito.

Abraços
Luca Bastos

Acredito que esse foi o maior motivo por optarem em mudar a arquitetura. Hoje o Twitter é muito acessado através de suas apis e possui integração com os mais diferentes devices, gerando uma quantidade de tráfego altíssima.

Por tanto, performance não era somente o objetivo. Acredito que foi um efeito colateral provido pela JVM e uma linguagem estaticamente tipada.

Posso estar errado, mas o maior problema era escalonamento, o que não é fácil de fazer com a arquitetura Rails. Eles conseguiram isso no backend, criando um filhote de AMQP em Scala, mas faltava resolver o input.

Luca, você que estudava SEDA também, o que você acha do Blend - http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html ? Vi que o Netty faz pools de thread, na documentação.

PS: Coisinha pra estudar: http://en.wikipedia.org/wiki/Directed_acyclic_graph

Olá

[quote=Kenobi]
Luca, você que estudava SEDA também, o que você acha do Blend - http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html ? [/quote]

Realmente, já tive meus tempos de entusiasmo com o SEDA. Principalmente depois que assisti uma palestra sobre seu uso em um projeto de telecom. Mas é tudo muito complicado. A menos que algum especialista crie um framework (como o Netty), é muito difíicil fazer algo com o SEDA.

Sobre o blender tudo que sei é o que está no texto da notícia. E me parece que NÃO se refere a front end como está no título deste tópico e no Infoq. Desconfio que meu entendimento sobre o que é front end não é o mesmo do Eder Magalhães. Mas posso estar errado porque para mim frameworks baseados em componentes como Wicket e JSF pecam justamente por misturar excessivamente front end com back end.

Abraços
Luca Bastos

Acredito que Frontend se trata da API Rest em cima de HTTP, que recebe os streams (inputs). Também acho que não tem a ver com a interface gráfica, pois poderia fazer algo completamente besta, usando JQuery diretamente se quisesse.

nunca a frase “não existe bala de prata” fez tanto sentido.

O Twitter tem um problema e trocar Ruby para Java resolve. Não diminui o Ruby em nada, pelo contrario a comunidade poderia se esforçar duplamente para fornecer uma alternativa nesse caso. A maquina virtual de Smalltalk é mais antiga que a jvm e ruby e pode ser uma boa fonte de inspiração (MagLev?).

Perl, quando vc programa com Moose ou Mouse (frameworks que adicionam uma camada de orientação a objetos em runtime, tornando mais legivel e meta programavel) existe a opção de tornar a Classe imutável, assim não é possivel adicionar metodos on the fly porém uma camada em XS é criada acelerando o resto da classe e benchmarks mostram um ganho consideravel. Claro que existem outros problemas, mas talvez Ruby tenha que ir fazer uma escolha dessas: abrir mão do monkey patching em determinados momentos.

Vejamos as cenas dos próximos capitulos. Será que vão migrar tudo para Go?

Tiago, dá uma lida nas minhas colocações, do Luca e Maurício. Acho que o caminho está muito mais em design da solução que linguagem :-).

Mas não adianta trocar o design se a implementação não acompanha :wink:

Luca, só uma curiosidade, o Mule implementa Seda então, para muitos cenários de integração você pode usar Seda facilmente :-).

Tiago, linguagem dinamicamente tipada vai ter uma performance inferior e talvez isso com o tempo seja amenizado, até mesmo pela JVM com suporte à linguagens dinâmicas - JSR 292. Para os amantes de Ruby há o Mirah, uma linguagem parecidíssima com Ruby, onde a diferença básica consiste em tipos.

Com essa diferença, a performance de Mirah é comparável à outras linguagens como Scala.

Mas ainda acho, que o problema estava muito mais no escalonamento e não na performance, até pq como disseram, se quisessem somente performance talvez tivessem usado uma outra abordagem.

Um abraço,

Kenobi - akka @scaphe :slight_smile:

O site do twitter vive dando problema, muito mau feito, se é culpa da linguagem não sei, mas se eles são ninjas e rockstars não conseguem fazer um sistema rails decente, imagina nós, pobre mortais.

[quote=Diabo Loiro]quero ver alguem que ja trabalhou em alguma aplicação de um banco gigantesca enterprise, aprender ruby, tudo facinho , codigo gerado ,lindo e maravilhoso.

quero ver usar active record na base de dados do banco… para min ruby não é feito para aplicações enterprise.[/quote]

Senhor Certified, eu teria vergonha de publicar isso que você escreveu em um fórum público. Procure estudar mais!

Acho que esses caras que começaram a discutir a partir da página 5 deveriam comparecer mais vezes ao GUJ. A discussão deu uma melhorada animal.

Ruby ainda tem muito que evoluir ,está mil anos do Java e .Net no mercado corporativo. Pra pagina da padaria do Tio Joao o Ruby realmente eh bem mais agil . Agora pra mercado corporativo…