Merb Desenvolvimento Web com Ruby sem Rails Danilo Sato ThoughtWorks UK www.dtsato.com Merb? Rails não escala!

Download Report

Transcript Merb Desenvolvimento Web com Ruby sem Rails Danilo Sato ThoughtWorks UK www.dtsato.com Merb? Rails não escala!

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
– Competente
 Práticas e Regras independentes de contexto
 Contexto é importante, mas sem prioridade
Perfeito para Iniciantes
• Modelo de Dreyfus:
– Iniciante
– Competente
– Proficiente
 Práticas e Regras independentes de contexto
 Contexto é importante, mas sem prioridade
 Contexto interpretado de forma holística
Perfeito para Iniciantes
• Modelo de Dreyfus:
– Iniciante
– Competente
– Proficiente
– Expert
 Práticas e Regras independentes de contexto
 Contexto é importante, mas sem prioridade
 Contexto interpretado de forma holística
 Decisões baseadas na intuição
Perfeito para Iniciantes
• Modelo de Dreyfus:
– Iniciante
– Competente
– Proficiente
– Expert
– Mestre
 Práticas e Regras independentes de contexto
 Contexto é importante, mas sem prioridade
 Contexto interpretado de forma holística
 Decisões baseadas na intuição
 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 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
LOC
LOC (Testes)
Merb Core
Merb More
55393
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
LOC
LOC (Testes)
Rails
Merb Core
Merb More
55393
37639
5406
4529
1774
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):
Mínimo
Média
Máximo
D.P.
Rails
Merb
Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you
Rápido
• Thread-safe
• Consegue atender requisições sem bloquear
• “Benchmark” (replies/s):
Rails
Mínimo
Média
Máximo
D.P.
0.0
43.4
75.2
30.8
Merb
Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you
Rápido
• Thread-safe
• Consegue atender requisições sem bloquear
• “Benchmark” (replies/s):
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
Fonte: http://www.trawlr.com/items/5757847-rails-or-merb-what-s-best-for-you
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:
– 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
–…
Merb
Desenvolvimento Web com Ruby sem Rails
Danilo Sato
ThoughtWorks UK
www.dtsato.com