Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Arquiteturas Comuns de Apps Rails @ RubyConf BR...
Search
Plataformatec
September 18, 2015
Technology
6
370
Arquiteturas Comuns de Apps Rails @ RubyConf BR 2015
Plataformatec
September 18, 2015
Tweet
Share
More Decks by Plataformatec
See All by Plataformatec
O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma linguagem que é usada no mundo inteiro @ Elixir Brasil 2019
plataformatec
5
980
O case da Plataformatec com o Elixir - Como uma empresa brasileira criou uma linguagem que é usada no mundo inteiro @ QCon SP 2018
plataformatec
1
220
Elixir @ iMasters Intercon 2016
plataformatec
1
260
GenStage and Flow by @josevalim at ElixirConf
plataformatec
17
2.7k
Elixir: Programação Funcional e Pragmática @ 2º Tech Day Curitiba
plataformatec
2
290
Elixir: Programação Funcional e Pragmática @ Encontro Locaweb 2016
plataformatec
4
280
What's ahead for Elixir: v1.2 and GenRouter
plataformatec
15
2k
Pirâmide de testes, escrevendo testes com qualidade @ RubyConf 2015
plataformatec
10
2.3k
Dogmatismo e Desenvolvimento de Software @ Rubyconf BR 2014
plataformatec
6
850
Other Decks in Technology
See All in Technology
組織貢献をするフリーランスエンジニアという生き方
n_takehata
1
1.3k
データ資産をシームレスに伝達するためのイベント駆動型アーキテクチャ
kakehashi
PRO
2
540
Oracle Cloud Infrastructure:2025年2月度サービス・アップデート
oracle4engineer
PRO
1
210
OpenID Connect for Identity Assurance の概要と翻訳版のご紹介 / 20250219-BizDay17-OIDC4IDA-Intro
oidfj
0
280
『衛星データ利用の方々にとって近いようで触れる機会のなさそうな小話 ~ 衛星搭載ソフトウェアと衛星運用ソフトウェア (実物) を動かしながらわいわいする編 ~』 @日本衛星データコミニティ勉強会
meltingrabbit
0
150
SA Night #2 FinatextのSA思想/SA Night #2 Finatext session
satoshiimai
1
140
室長と気ままに学ぶマイクロソフトのビジネスアプリケーションとビジネスプロセス
ryoheig0405
0
370
Developers Summit 2025 浅野卓也(13-B-7 LegalOn Technologies)
legalontechnologies
PRO
0
720
速くて安いWebサイトを作る
nishiharatsubasa
10
13k
ホワイトボードチャレンジ 説明&実行資料
ichimichi
0
130
(機械学習システムでも) SLO から始める信頼性構築 - ゆる SRE#9 2025/02/21
daigo0927
0
120
Platform Engineeringは自由のめまい
nwiizo
4
2.1k
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
It's Worth the Effort
3n
184
28k
Speed Design
sergeychernyshev
27
790
Designing for Performance
lara
604
68k
For a Future-Friendly Web
brad_frost
176
9.5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Why Our Code Smells
bkeepers
PRO
336
57k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Fireside Chat
paigeccino
34
3.2k
Writing Fast Ruby
sferik
628
61k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
Transcript
Arquiteturas Comuns de Apps Rails que vemos por aí George
Guimarães em 30 minutos ou menos
consulting and software engineering
None
Estamos contratando! http://plataformatec.com.br/careers
None
DISCLAIMER:
VIM FALAR SOBRE
Experiências,
Dificuldades,
e Dicas
DOGMAS estão vindo
ou ATALHOS COGNITIVOS?
NÃO CONSIGO COBRIR TODOS OS CONTEXTOS
“George veio cagar regra"
!
1. O monolito 2. Banco de Dados compartilhado 3. Micro
serviços 4. Integração via Eventos/Msgs
1. O monolito ou Aplicação Integrada
Não tenha medo do monolito
É difícil separar as responsabilidades de um sistema
saber o que é o “domínio" leva tempo
é possível escrever código fácil de entender, de fácil manutenção
e com abstrações que façam sentido
Integração Discreta Documentação no código Código de baixa complexidade
são as mesmas técnicas que usaríamos para qualquer tipo de
arquitetura
“mudar” a arquitetura não vai melhorar seus problemas
e só porque é um monolito não significa que seja
ruim
None
Difícil de escalar um time com monolito
Deploy demorado
Difícil de entender
DIFÍCIL DE ENTENDER
DICAS monolito
Guidelines Code Review Automatize tudo o que puder Documente o
setup do projeto (README ou bin/setup)
use um monorepo
2. Banco de dados compartilhado
“rapidez” na hora de acessar DB
separação de responsabilidades site / admin validações
Compartilhar models gem compartilhada com models?
Rodar migrations é difícil
Deploy unificado
“Quem é o dono do campo/coluna?”
DICAS DB compartilhado
use um monorepo
teste seus scripts de backup/restore
automatize deploys e lembre-se de testar os rollbacks
smoke tests as apps em conjunto estão ok? tem certeza?
3. Micro serviços
deploys independentes ciclo de vida independente
linguagens diferentes permite o melhor de vários mundos
entender um pedaço é mais fácil o todo pode ser
muito grande
mais peças móveis deploy mais complexo logs unificados? tracing de
requests debugging complexo
replica funcionalidades de banco de dados via http com a
desvantagem da latência, falta de funcionalidades
acoplamento pode ficar implícito podemos fazer deploys independentes? mudanças de
APIs quebram o sistema?
n gems de clients
(normalmente sua equipe é enxuta)
(não crie ineficiências)
DICAS micro serviços
use um monorepo
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
não use sinatra vc vai acabar querendo replicar funcionalidades do
rails
crie serviços, não micro CRUD (html) + API (json) ciclo
de vida de um resource aplicações mais independentes
contratos/pactos podem te ajudar equipes heterogênas equipes "distantes"
None
None
None
4. Integração via Eventos/Msgs ou, “como replicar dados para apps
independentes"
None
# 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
DICAS int. mensagens
logging é essencial vc quer saber tudo o que acontece
centralize os logs
tome cuidado na ordem dos deploys
teste localmente você consegue conectar nas filas de produção
Vou começar uma app O que eu faço?
DISCLAIMER!
DICA:
MONOREPO
george:~/monorepo[master]$ tree -t . !"" site !"" admin !"" gems
# !"" http_logger # $"" minitest-goodies $"" README.md
source 'https://rubygems.org' gem 'rails', '4.2.4' gem 'http_logger', path: '../gems/http_logger' gem
'minitest-goodies', path: '../gems/minitest-goodies'
~/monorepo[master]$ git subtree push --prefix=gems/http_logger
[email protected]
:georgeguimaraes/ http_logger.git
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
Monolito Continue até quando não puder
Monolito é mais fácil estrangular um monolito, do que juntar
não encontre problemas para suas soluções
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
[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