merb desenvolvimento web com ruby sem rails danilo sato thoughtworks uk
TRANSCRIPT
MerbDesenvolvimento Web com Ruby sem Rails
Danilo SatoThoughtWorks UKwww.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– 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 MoreLOC 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 MoreLOC 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 MoreLOC 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 0.0 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• …
LockRails (dispatcher.rb)
LockRails (dispatcher.rb)
Lock• Rails segura o mutex antes de:– Determinar o roteamento– Atender a requisição
Lock• Rails segura o mutex antes de:– 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:– 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:– ~ 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:– ~ 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:– 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– …
MerbDesenvolvimento Web com Ruby sem Rails
Danilo SatoThoughtWorks UKwww.dtsato.com