Desenvolvimento Web com Ruby sem Rails Merb Desenvolvimento Web com Ruby sem Rails Danilo Sato ThoughtWorks UK www.dtsato.com
Merb?
Rails não escala!
Aviso: Eu sou fã de Rails
Lembram?
Não é bem assim…
Rails = Revolução Mudou a forma de encarar o desenvolvimento Web Opinionated: Testes Migrations Convention over Configuration DRY
Opinião forte Estrutura da aplicação
Opinião forte Estrutura da aplicação MVC
Opinião forte Estrutura da aplicação MVC AJAX: Script.aculo.us / Prototype
Opinião forte Estrutura da aplicação MVC AJAX: Script.aculo.us / Prototype ORM: ActiveRecord
Opinião forte Estrutura da aplicação MVC AJAX: Script.aculo.us / Prototype ORM: ActiveRecord Testes: Test::Unit unit / functional / integration
Opinião forte Estrutura da aplicação MVC AJAX: Script.aculo.us / Prototype ORM: ActiveRecord Testes: Test::Unit unit / functional / integration Mailer/ActiveResource/ActiveSupport/…
Perfeito para Iniciantes Modelo de Dreyfus: Iniciante Práticas e Regras independentes de contexto
Perfeito para Iniciantes Modelo de Dreyfus: Iniciante Práticas e Regras independentes de contexto Competente Contexto é importante, mas sem prioridade
Perfeito para Iniciantes Modelo de Dreyfus: Iniciante Práticas e Regras independentes de contexto Competente Contexto é importante, mas sem prioridade Proficiente Contexto interpretado de forma holística
Perfeito para Iniciantes Modelo de Dreyfus: Iniciante Práticas e Regras independentes de contexto Competente Contexto é importante, mas sem prioridade Proficiente Contexto interpretado de forma holística Expert Decisões baseadas na intuição
Perfeito para Iniciantes Modelo de Dreyfus: Iniciante Práticas e Regras independentes de contexto Competente Contexto é importante, mas sem prioridade Proficiente Contexto interpretado de forma holística Expert Decisões baseadas na intuição Mestre Ações sem prestar atenção na consciência
Mas e se quero algo diferente? Fugir do padrão é difícil, mas não impossível
Merb Framework web MVC em Ruby Desenvolvido pelo Ezra Mongrel + Erb EngineYard Brincando com Mongrel Handlers Mongrel + Erb
Menos mágica Symbol.to_proc (&:color)
Menos mágica Symbol.to_proc (&:color) returning {}
Menos mágica Symbol.to_proc (&:color) returning {} Active Support:
Menos mágica Symbol.to_proc (&:color) returning {} Active Support: distance_of_time_in_words_to_now
Menos mágica Symbol.to_proc (&:color) returning {} Active Support: distance_of_time_in_words_to_now auto_link_email_addresses
Menos mágica Symbol.to_proc (&:color) returning {} Active Support: distance_of_time_in_words_to_now auto_link_email_addresses cycle
Flexível merb-core
Flexível merb-core merb-more merb-action-args /merb-assets merb-builder / merb-cache merb-freezer / merb-gen merb-haml / merb-mailer merb-parts / merb-slices
Rack Ebb Evented Mongrel FastCGI Mongrel Thin Webrick
Leve Rails Merb Core Merb More LOC LOC (Testes) OBS: Linhas de Código desconsiderando comentários e linhas em branco Rails 2.1.0 vs. Merb-0.9.3 Script adaptado de code_statistics.rb (usado no Rails para fazer rake:stats)
Leve Rails Merb Core Merb More LOC 55393 LOC (Testes) 37639 OBS: Linhas de Código desconsiderando comentários e linhas em branco Rails 2.1.0 vs. Merb-0.9.3 Script adaptado de code_statistics.rb (usado no Rails para fazer rake:stats)
Leve Rails Merb Core Merb More LOC 55393 5406 1774 LOC (Testes) 37639 4529 1184 OBS: Linhas de Código desconsiderando comentários e linhas em branco Rails 2.1.0 vs. Merb-0.9.3 Script adaptado de code_statistics.rb (usado no Rails para fazer rake:stats)
Rápido Thread-safe
Rápido Thread-safe Consegue atender requisições sem bloquear
Rápido Thread-safe Consegue atender requisições sem bloquear “Benchmark” (replies/s): Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you Mínimo Média Máximo D.P. Rails Merb
Rápido Thread-safe Consegue atender requisições sem bloquear “Benchmark” (replies/s): Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you Mínimo Média Máximo D.P. Rails 0.0 43.4 75.2 30.8 Merb
Rápido Thread-safe Consegue atender requisições sem bloquear “Benchmark” (replies/s): Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you Mínimo Média Máximo D.P. Rails 0.0 43.4 75.2 30.8 Merb 73.3 143.0 65.8
A vida fora do Mutex
O famoso exemplo Upload de arquivo: Operação demorada Rails padrão bloqueia até terminar de responder
O famoso exemplo Upload de arquivo: Operação demorada Rails padrão bloqueia até terminar de responder Isso significa: Mongrel não responde mais nenhuma requisição!
O famoso exemplo Upload de arquivo: Operação demorada Rails padrão bloqueia até terminar de responder Isso significa: Mongrel não responde mais nenhuma requisição! Soluções: BackgroundDb Custom Mongrel Handler …
Lock Rails (dispatcher.rb)
Lock Rails (dispatcher.rb)
Lock Rails segura o mutex antes de: Determinar o roteamento Atender a requisição
Lock Rails segura o mutex antes de: Algoritmo de rotas no Rails: Determinar o roteamento Atender a requisição Algoritmo de rotas no Rails: Não thread-safe ~ 1100 linhas de código complexo
Lock Rails segura o mutex antes de: Algoritmo de rotas no Rails: Determinar o roteamento Atender a requisição Algoritmo de rotas no Rails: Não thread-safe ~ 1100 linhas de código complexo ActiveRecord
Lock Algoritmo de rotas no Merb: ~ 600 linhas de código complexo Thread-safe Não é executado dentro do mutex
Lock Algoritmo de rotas no Merb: Não acoplado ao ActiveRecord ~ 600 linhas de código complexo Thread-safe Não é executado dentro do mutex Não acoplado ao ActiveRecord
Lock Algoritmo de rotas no Merb: Não acoplado ao ActiveRecord ~ 600 linhas de código complexo Thread-safe Não é executado dentro do mutex Não acoplado ao ActiveRecord
Coisas legais no Merb
Retorno da action flexível render: String Template (formato, status_code, layout) redirect proc: Libera o mutex e continua executando o bloco
Exemplo
render_deferred Recebe um bloco que será executado fora do mutex
render_then_call Renderiza a String e executa o bloco for a do mutex
render_chunked Um bloco que enviará pedaços de dados cada vez que for chamado Teste no Firefox para ver os “pedaços” chegando aos poucos
Rotas Flexíveis Padrão
Rotas Flexíveis Padrão Subdomains
Rotas Flexíveis Padrão Subdomains RESTful
Rotas Flexíveis Padrão Subdomains RESTful Aninhadas
Rotas Flexíveis Padrão Subdomains RESTful Aninhadas Regex
Rotas Flexíveis Padrão Subdomains RESTful Aninhadas Regex Ver rotas
Plugins são Gems! merb_activerecord / merb_datamapper / merb_sequel merb_helpers merb_param_protection merb_stories / merb_test_unit merb_has_flash merb-auth / merbful_authentication merb_paginate … http://wiki.merbivore.com/pages/plugins
Estrutura da Aplicação Padrão
Estrutura da Aplicação Padrão Flat
Estrutura da Aplicação Padrão Flat Very Flat
Migrar do Rails é fácil
Coisas não tão legais no Merb
Lembram?
Merb??
Mas… O código é legível Documentação está crescendo: Livros: http://www.merbivore.org http://www.merbunity.com http://wiki.merbivore.com Livros: http://peepcode.com/products/meet-merb-pdf-draft http://manning.com/ivey (em breve) http://merb.4ninjas.org (online - em desenvolvimento)
Imaturo Ainda não chegou na versão 1.0 Menos tempo de vida Comunidade menor Bem menos plugins
Conclusão
Resumo Merb: Menos mágica Flexível Leve Rápido Familiar para quem conhece Rails Em desenvolvimento…
Rails ou Merb? Depende Rails é melhor para iniciantes Merb é para quem gosta de “brincar” com coisas novas
Use a ferramenta certa! Tem muito mais (só em Ruby): Ramaze Sinatra Camping Nitro IOWA …
Desenvolvimento Web com Ruby sem Rails Merb Desenvolvimento Web com Ruby sem Rails Danilo Sato ThoughtWorks UK www.dtsato.com