Arquiteturas Comuns de Apps Rails @ RubyConf BR 2015

7c12adb8b5521c060ab4630360a4fa27?s=47 Plataformatec
September 18, 2015

Arquiteturas Comuns de Apps Rails @ RubyConf BR 2015

7c12adb8b5521c060ab4630360a4fa27?s=128

Plataformatec

September 18, 2015
Tweet

Transcript

  1. Arquiteturas Comuns de Apps Rails que vemos por aí George

    Guimarães em 30 minutos ou menos
  2. consulting and software engineering

  3. None
  4. Estamos contratando!
 http://plataformatec.com.br/careers

  5. None
  6. DISCLAIMER:

  7. VIM FALAR SOBRE

  8. Experiências,

  9. Dificuldades,

  10. e Dicas

  11. DOGMAS estão vindo

  12. ou ATALHOS COGNITIVOS?

  13. NÃO CONSIGO COBRIR TODOS OS CONTEXTOS

  14. “George veio cagar regra"

  15. !

  16. 1. O monolito 2. Banco de Dados compartilhado 3. Micro

    serviços 4. Integração via Eventos/Msgs
  17. 1. O monolito ou Aplicação Integrada

  18. Não tenha medo do monolito

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

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

  21. é possível escrever código fácil de entender, de fácil manutenção

    e com abstrações que façam sentido
  22. Integração Discreta Documentação no código Código de baixa complexidade

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

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

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

    ruim
  26. None
  27. Difícil de escalar um time com monolito

  28. Deploy demorado

  29. Difícil de entender

  30. DIFÍCIL DE ENTENDER

  31. DICAS monolito

  32. Guidelines
 Code Review Automatize tudo o que puder
 Documente o

    setup do projeto (README ou bin/setup)
  33. use um monorepo

  34. 2. Banco de dados compartilhado

  35. “rapidez” na hora de acessar DB

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

  37. Compartilhar models gem compartilhada com models?


  38. Rodar migrations é difícil

  39. Deploy unificado

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

  41. DICAS DB compartilhado

  42. use um monorepo

  43. teste seus scripts de backup/restore

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

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

  46. 3. Micro serviços

  47. deploys independentes ciclo de vida independente

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

  49. entender um pedaço é mais fácil o todo pode ser

    muito grande
  50. mais peças móveis deploy mais complexo logs unificados? tracing de

    requests debugging complexo
  51. replica funcionalidades de banco de dados via http com a

    desvantagem da latência, falta de funcionalidades
  52. acoplamento pode ficar implícito podemos fazer deploys independentes? mudanças de

    APIs quebram o sistema?
  53. n gems de clients

  54. (normalmente sua equipe é enxuta)

  55. (não crie ineficiências)

  56. DICAS micro serviços

  57. use um monorepo

  58. 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
  59. não use sinatra vc vai acabar querendo replicar funcionalidades do

    rails
  60. crie serviços, não micro CRUD (html) + API (json) ciclo

    de vida de um resource aplicações mais independentes
  61. contratos/pactos podem te ajudar equipes heterogênas equipes "distantes"

  62. None
  63. None
  64. None
  65. 4. Integração via Eventos/Msgs ou, “como replicar dados para apps

    independentes"
  66. None
  67. # 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
  68. DICAS int. mensagens

  69. logging é essencial vc quer saber tudo o que acontece

    centralize os logs
  70. tome cuidado na ordem dos deploys

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

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

  73. DISCLAIMER!

  74. DICA:

  75. MONOREPO

  76. george:~/monorepo[master]$ tree -t . !"" site !"" admin !"" gems

    # !"" http_logger # $"" minitest-goodies $"" README.md
  77. source 'https://rubygems.org' gem 'rails', '4.2.4' gem 'http_logger', path: '../gems/http_logger' gem

    'minitest-goodies', path: '../gems/minitest-goodies'
  78. ~/monorepo[master]$ git subtree push --prefix=gems/http_logger git@github.com:georgeguimaraes/ http_logger.git

  79. 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
  80. Monolito Continue até quando não puder

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

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

  83. 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
  84. george@plataformatec.com.br @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