Saltar para o conteúdo principal
WZ SolutionsWZ SolutionsSoftware Engineering
Engenharia de Software

Padrões Postgres para plataformas empresariais multi-inquilino

Segurança ao nível da linha, particionamento e estratégia de ligações — as três decisões que determinam se a sua plataforma multi-inquilino sobrevive ao décimo cliente.

Engenharia WZ2 min de leitura

Todas as plataformas de produto que construímos acabam por servir várias organizações a partir de uma única instalação. O modelo de isolamento escolhido na segunda semana determina o que é possível no segundo ano, pelo que merece mais reflexão do que costuma receber.

Esquema partilhado com segurança ao nível da linha

Para a maioria das plataformas empresariais, um esquema partilhado com segurança ao nível da linha do Postgres é a escolha por omissão certa. Um único caminho de migrações, um único pool de ligações, e isolamento imposto pela base de dados em vez de por cada consulta que um programador escreve.

alter table facturas enable row level security;

create policy isolamento_inquilino on facturas
  using (inquilino_id = current_setting('app.inquilino_id')::uuid);

O detalhe crítico é que a definição tem de ser aplicada por transacção por uma camada de confiança, e o perfil da aplicação não pode conseguir contornar a segurança ao nível da linha. Uma única ligação que se esqueça de definir o inquilino, a correr como superutilizador ou dono da tabela, derrota todo o modelo.

Particionar as tabelas que crescem sem limite

Leituras de contadores, registos de auditoria e históricos de transacções crescem monotonicamente. O particionamento por intervalo mensal mantém os índices pequenos, transforma a retenção numa remoção de partição em vez de uma eliminação em massa, e permite ao planeador ignorar a maior parte da tabela em consultas limitadas no tempo.

Gerir as ligações de forma deliberada

As ligações Postgres são caras e os ambientes serverless multiplicam-nas. Coloque um pooler em modo transacção à frente da base de dados, mantenha as transacções curtas, e tenha presente que o modo transacção exclui funcionalidades ao nível da sessão, como declarações preparadas mantidas entre instruções ou bloqueios consultivos de sessão.

  • Indexe todas as chaves estrangeiras por que filtra ou junta — o Postgres não as cria por si
  • Prefira índices compostos começados por inquilino_id em tabelas multi-inquilino
  • Use índices de cobertura para manter os caminhos de leitura frequentes só em índice
  • Meça com EXPLAIN (ANALYZE, BUFFERS) sobre dados à escala de produção, não sobre um conjunto de teste
Continuar a ler

Artigos relacionados

Está a trabalhar em algo assim?

Se algo acima é um problema com que vive neste momento, teremos todo o gosto em trocar impressões.

Ou escreva para walter.mussagy@gmail.com — respondemos no prazo de um dia útil.