Pular para o conteúdo

apps/architecture/vertical-slice

044 · Arquiteturas de Alto Nível (Macro-Architecture) · ≈ 6 min de estudo

Vertical Slice Architecture

O código se organiza por caso de uso, não por camada: cada pasta em features/ tem a rota, a validação, a regra e o SQL de uma operação. Feature nova é pasta nova, sem tocar em controller, service ou repositório compartilhados. Use em backends que crescem por funcionalidade e onde cada operação tem complexidade diferente.

passos
6
arquivos
6
teste
1
tecnologias
5
Infraestrutura realTypeScriptBunElysiaPostgreSQLDocker
Baixar cartão

Cenário

Banco digital com três operações de conta: enviar PIX por chave, consultar saldo e paginar o extrato. O PIX é complexo (limite, trava de linhas, lançamento em partida dobrada, idempotência); o saldo é uma consulta de uma linha; o extrato lê o razão com cursor. Cada fatia usa o padrão que a sua complexidade pede.

Planta

Fluxo
7/7
features/pix_transferfeatures/balance_checkfeatures/statement_querysharedmain.tsso .use de cada fatiarota POST /pix/transfersschema, limite, transacao, SQLrota GET /accounts/:id/balanceuma consulta diretarota GET/accounts/:id/statementpaginacao keysetpool_db e config_appso infraestruturaPostgreSQLaccounts, ledger_entriesusa
7

7 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Código por funcionalidade, não por camada.

Esconde cada passo: lembre antes de tocar para revelar.

Vocabulário compartilhado

  1. 01

    Cada fatia é um plugin Elysia em features/<caso_de_uso>/handler_<caso_de_uso>.ts, com rota, schema, regra e SQL no mesmo arquivo

  2. 02

    pix_transfer trava origem e destino em ordem de id, move o saldo e grava débito e crédito em ledger_entries numa transação; o endToEndId único faz a repetição virar 409, inclusive em chamadas simultâneas

  3. 03

    balance_check é uma consulta direta — sem comando, repositório nem service de conta

  4. 04

    statement_query lê o mesmo razão com paginação por cursor (keyset): a página N custa o mesmo que a primeira

  5. 05

    Fatias compartilham dados (as tabelas), nunca código: shared/ só tem pool e config

  6. 06

    slice_boundary.test.ts falha se uma fatia importar outra ou se shared/ ganhar regra de negócio

Trade-offs

O que se ganha, o que se paga

4 vantagenscada ganho tem um preço4 custos

Vantagens

  • Feature nova é pasta nova, sem risco para as existentes

  • A feature inteira num lugar: fácil de ler, mudar e remover

  • Cada fatia escolhe a própria complexidade

  • Fatia autocontida extrai para serviço com pouco esforço

Custos

  • SQL e mapeamento repetidos entre fatias, por decisão

  • Sem disciplina, shared/ absorve regra de negócio

  • Operação que cruza fatias exige coordenação explícita

  • Regra repetida entre fatias precisa de revisão atenta

apps/architecture/vertical-slice

6 arquivos

src/features/pix_transfer/

  • handler_pix_transfer.tsEnvio de PIX: limite, trava, partida dobrada, idempotência

src/features/balance_check/

  • handler_balance_check.tsConsulta de saldo

src/features/statement_query/

  • handler_statement_query.tsExtrato paginado por cursor

src/shared/

  • pool_db.tsPool de conexões

src/

  • main.tsRegistro das fatias com .use()
  • slice_boundary.test.tstesteFronteira entre fatias

Executar · com Docker

  1. ./docker.sh up# sobe PostgreSQL
  2. cp .env.example .env# variáveis de ambiente
  3. bun install# dependências
  4. bun run demo# roda o cenário
  5. bun run test# integração contra o serviço real
Requisitos
BunDocker
Sobe junto
PostgreSQL

Por que se relacionam

Teste rápido

Qual destes combina com Vertical Slice Architecture?

Próximo projeto · Arquiteturas de Alto Nível (Macro-Architecture)Feature Flags
Esc

↑ ↓ navegarEnter abrir191 resultados