Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Arquiteturas Comuns de Apps Rails @ RubyConf BR 2015

Plataformatec
September 18, 2015

Arquiteturas Comuns de Apps Rails @ RubyConf BR 2015

Plataformatec

September 18, 2015
Tweet

More Decks by Plataformatec

Other Decks in Technology

Transcript

  1. Arquiteturas Comuns de Apps Rails
    que vemos por aí
    George Guimarães
    em 30 minutos ou menos

    View full-size slide

  2. consulting and software engineering

    View full-size slide

  3. Estamos contratando!

    http://plataformatec.com.br/careers

    View full-size slide

  4. VIM FALAR SOBRE

    View full-size slide

  5. Experiências,

    View full-size slide

  6. Dificuldades,

    View full-size slide

  7. DOGMAS
    estão vindo

    View full-size slide

  8. ou ATALHOS
    COGNITIVOS?

    View full-size slide

  9. NÃO CONSIGO COBRIR
    TODOS OS CONTEXTOS

    View full-size slide

  10. “George veio cagar regra"

    View full-size slide

  11. 1. O monolito
    2. Banco de Dados compartilhado
    3. Micro serviços
    4. Integração via Eventos/Msgs

    View full-size slide

  12. 1. O monolito
    ou Aplicação Integrada

    View full-size slide

  13. Não tenha medo do monolito

    View full-size slide

  14. É difícil separar as
    responsabilidades de um sistema

    View full-size slide

  15. saber o que é o “domínio" leva tempo

    View full-size slide

  16. é possível escrever código fácil de entender,
    de fácil manutenção e com abstrações que
    façam sentido

    View full-size slide

  17. Integração Discreta
    Documentação no código
    Código de baixa complexidade

    View full-size slide

  18. são as mesmas técnicas que usaríamos para
    qualquer tipo de arquitetura

    View full-size slide

  19. “mudar” a arquitetura não vai melhorar seus
    problemas

    View full-size slide

  20. e só porque é um monolito não significa que
    seja ruim

    View full-size slide

  21. Difícil de escalar um time com monolito

    View full-size slide

  22. Deploy demorado

    View full-size slide

  23. Difícil de entender

    View full-size slide

  24. DIFÍCIL DE
    ENTENDER

    View full-size slide

  25. DICAS
    monolito

    View full-size slide

  26. Guidelines

    Code Review
    Automatize tudo o que puder

    Documente o setup do projeto (README ou bin/setup)

    View full-size slide

  27. use um monorepo

    View full-size slide

  28. 2. Banco de dados
    compartilhado

    View full-size slide

  29. “rapidez” na hora de acessar DB

    View full-size slide

  30. separação de responsabilidades
    site / admin
    validações

    View full-size slide

  31. Compartilhar models
    gem compartilhada com models?


    View full-size slide

  32. Rodar migrations é difícil

    View full-size slide

  33. Deploy unificado

    View full-size slide

  34. “Quem é o dono do campo/coluna?”

    View full-size slide

  35. DICAS
    DB compartilhado

    View full-size slide

  36. use um monorepo

    View full-size slide

  37. teste seus scripts de backup/restore

    View full-size slide

  38. automatize deploys
    e lembre-se de testar os rollbacks

    View full-size slide

  39. smoke tests
    as apps em conjunto estão ok?
    tem certeza?

    View full-size slide

  40. 3. Micro serviços

    View full-size slide

  41. deploys independentes
    ciclo de vida independente

    View full-size slide

  42. linguagens diferentes
    permite o melhor de vários mundos

    View full-size slide

  43. entender um pedaço é mais fácil
    o todo pode ser muito grande

    View full-size slide

  44. mais peças móveis
    deploy mais complexo
    logs unificados?
    tracing de requests
    debugging complexo

    View full-size slide

  45. replica funcionalidades de banco de dados via http
    com a desvantagem da latência,
    falta de funcionalidades

    View full-size slide

  46. acoplamento pode ficar implícito
    podemos fazer deploys independentes?
    mudanças de APIs quebram o sistema?

    View full-size slide

  47. n gems de clients

    View full-size slide

  48. (normalmente sua equipe é enxuta)

    View full-size slide

  49. (não crie ineficiências)

    View full-size slide

  50. DICAS
    micro serviços

    View full-size slide

  51. use um monorepo

    View full-size slide

  52. não crie um gemserver interno
    Adiciona passos a mais no seu fluxo de entrega:
    Commita na gem
    Publica a gem
    Update no Gemfile de cada app
    Roda os testes de todo mundo

    View full-size slide

  53. não use sinatra
    vc vai acabar querendo replicar funcionalidades do rails

    View full-size slide

  54. crie serviços, não micro
    CRUD (html) + API (json)
    ciclo de vida de um resource
    aplicações mais independentes

    View full-size slide

  55. contratos/pactos podem te ajudar
    equipes heterogênas
    equipes "distantes"

    View full-size slide

  56. 4. Integração via Eventos/Msgs
    ou, “como replicar dados para apps independentes"

    View full-size slide

  57. # app/models/user.rb on the publisher app
    class User
    include Promiscuous::Publisher
    publish :name, :email
    end
    # app/models/user.rb on the subscriber app
    class User
    include Promiscuous::Subscriber
    subscribe :name, :email
    after_create { Rails.logger.info "Hi #{name}!" }
    end

    View full-size slide

  58. DICAS
    int. mensagens

    View full-size slide

  59. logging é essencial
    vc quer saber tudo o que acontece
    centralize os logs

    View full-size slide

  60. tome cuidado na ordem dos deploys

    View full-size slide

  61. teste localmente
    você consegue conectar nas filas de produção

    View full-size slide

  62. Vou começar uma app
    O que eu faço?

    View full-size slide

  63. george:~/monorepo[master]$ tree -t
    .
    !"" site
    !"" admin
    !"" gems
    # !"" http_logger
    # $"" minitest-goodies
    $"" README.md

    View full-size slide

  64. source 'https://rubygems.org'
    gem 'rails', '4.2.4'
    gem 'http_logger', path: '../gems/http_logger'
    gem 'minitest-goodies', path: '../gems/minitest-goodies'

    View full-size slide

  65. ~/monorepo[master]$ git subtree push
    --prefix=gems/http_logger
    [email protected]:georgeguimaraes/
    http_logger.git

    View full-size slide

  66. Monolito
    Sem muitas peças móveis
    Facilita análise de erro / performance
    Amadureça os conceitos e abstrações do seu domínio de negócios

    View full-size slide

  67. Monolito
    Continue até quando não puder

    View full-size slide

  68. Monolito
    é mais fácil estrangular um monolito, do que juntar

    View full-size slide

  69. não encontre
    problemas para suas
    soluções

    View full-size slide

  70. Por incrível que pareça, a alternativa mais sem graça
    vai te ajudar a entregar features e manter a
    flexibilidade para mudanças

    View full-size slide

  71. [email protected]
    @georgeguimaraes
    Obrigado! Dúvidas?
    https://www.flickr.com/photos/publicplaces/7440727306/in/photolist-ckvEZQ-8fCN3e-nYFygB-p82nbh-wbvUya-nGWwgA-5ahRL4-afpWj4-dq8Ji5-jsVWfF-9zCVfk-fNh9UN-iNUD2J-pMyUkR-gLS3AU-dxre4m-
    arHDxj-8vC7By-9qbqFD-rA6FMv-nsjdYy-dpFX1B-pkbsmm-bwGQpF-m8bxLg-qJmRN4-9qm1cc-fNi9Yk-5dA9Dc-ee52fu-bGSSt4-pQzrS2-9zy9dQ-kqjDgr-dkkHeL-paSkn8-swkmVC-oVrCAS-pmXotB-nug5Fp-g8PYx8-
    nsnByK-edcjfR-eVWzMJ-dxcXoP-drgfd5-816jHn-mRFByr-ajNXL9-h3s4tX
    https://www.flickr.com/photos/publicplaces/7440727306/in/photolist-ckvEZQ-8fCN3e-nYFygB-p82nbh-wbvUya-nGWwgA-5ahRL4-afpWj4-dq8Ji5-jsVWfF-9zCVfk-fNh9UN-iNUD2J-pMyUkR-gLS3AU-dxre4m-
    arHDxj-8vC7By-9qbqFD-rA6FMv-nsjdYy-dpFX1B-pkbsmm-bwGQpF-m8bxLg-qJmRN4-9qm1cc-fNi9Yk-5dA9Dc-ee52fu-bGSSt4-pQzrS2-9zy9dQ-kqjDgr-dkkHeL-paSkn8-swkmVC-oVrCAS-pmXotB-nug5Fp-g8PYx8-
    nsnByK-edcjfR-eVWzMJ-dxcXoP-drgfd5-816jHn-mRFByr-ajNXL9-h3s4tX

    View full-size slide