Quatro bancos, uma aplicação

Prévia grátis 3 min de leitura

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.
Aula 1 de 7 · grátis

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.

Digite para buscar...