Merb Desenvolvimento Web com Ruby sem Rails Danilo Sato ThoughtWorks UK .

Post on 16-Apr-2015

109 views 3 download

Transcript of Merb Desenvolvimento Web com Ruby sem Rails Danilo Sato ThoughtWorks UK .

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