Quatro bancos, uma aplicação
O Rails 8 vem com quatro bancos configurados por padrão, e a maioria das pessoas nunca percebe, porque o framework esconde a emenda quase por completo.
O que está configurado
O config/database.yml desta aplicação declara quatro entradas por ambiente:
development:
primary: ...
cache: { migrations_paths: db/cache_migrate }
queue: { migrations_paths: db/queue_migrate }
cable: { migrations_paths: db/cable_migrate }
Cada uma é um papel de conexão separado, com pool próprio, schema próprio e caminho de migração próprio. Não são quatro conexões para uma coisa só. São quatro bancos que dá para endereçar de forma independente e que às vezes apontam para o mesmo servidor.
Os schemas são arquivos separados, e o tamanho de cada um diz para que ele serve:
| Arquivo de schema | Tabelas | Guarda |
|---|---|---|
db/schema.rb |
33 | Cursos, usuários, matrículas, submissões: a aplicação |
db/queue_schema.rb |
11 | Jobs, execuções, semáforos e processos do Solid Queue |
db/cache_schema.rb |
1 | solid_cache_entries |
db/cable_schema.rb |
1 | solid_cable_messages |
flowchart TB
A["uma aplicação Rails"] --> P["papel primary. 33 tabelas"]
A --> C["papel cache. 1 tabela"]
A --> Q["papel queue. 11 tabelas"]
A --> B["papel cable. 1 tabela"]
P --> N["quatro pools, quatro schemas, quatro caminhos de migração"]
C --> N
Q --> N
B --> N
Por que o Rails 8 fez isso
Cada um desses três já foi um serviço separado. Uma fila de jobs queria dizer Redis e Sidekiq. Um cache queria dizer Redis ou Memcached. WebSockets queriam dizer Redis como broker.
A família Solid trocou os três por tabelas, e o suporte a vários bancos é o que torna isso suportável. O milhão de linhas do cache não precisa morar no mesmo schema dos seus usuários, e limpar a fila não quer dizer mexer nos dados da aplicação.
A troca vale ser dita com clareza. Você tem um serviço a menos para rodar e um conceito a mais para entender. Para um time pequeno, costuma ser uma boa troca, mas só se o conceito for entendido, e é para isso que este curso existe.
Separação lógica não é separação física
Todo o resto deste curso se apoia nessa distinção.
As quatro entradas são sempre separadas logicamente: pools separados, arquivos de schema separados, tarefas db:migrate:* separadas. Se elas são separadas fisicamente depende de uma string.
No ambiente de desenvolvimento desta aplicação, elas nomeiam quatro bancos diferentes. Em produção, três delas nomeiam o mesmo:
production:
primary: { database: app_production }
cache: { database: app_production_cache }
queue: { database: app_production }
cable: { database: app_production }
Mudar para onde um papel aponta é uma linha e nenhum código, porque nada na aplicação se refere a um banco pelo nome. Ela se refere a um papel. Essa propriedade é o motivo para usar o recurso, e a lição 5 trata da decisão que ela deixa barata.
Pontos-chave
- O Rails 8 configura quatro bancos por padrão: primary, cache, queue e cable.
- Cada um é um papel com pool, arquivo de schema e caminho de migração próprios, com 33, 1, 11 e 1 tabelas aqui.
- A família Solid trocou Redis, Memcached e um broker de WebSocket por tabelas no seu próprio banco.
- A separação lógica está sempre lá. A física é o que a string
database:disser. - Nada na aplicação nomeia um banco, só um papel, então mudar um de lugar é uma mudança de uma linha.
Continue com a aula 2
Como um modelo acha seu banco
Modelos herdam o primary, e os adapters Solid usam connects_to para nomear um papel resolvido pelo database.yml.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.