Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

triton

Pool de recursos genérico e de alto desempenho para Delphi: lease, backpressure, LIFO/FIFO, métricas e adapters plugáveis

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

Triton

Filho de Poseidon, guardião das profundezas: retém o que não pode se perder.

Triton

Pool de recursos genérico e de alto desempenho para Delphi

Semântica de lease, backpressure, LIFO/FIFO, métricas estruturadas e adapters plugáveis.

Playbook • Contribuindo


Triton é uma biblioteca Delphi para pooling de recursos orientada à produção. Foi criada para substituir implementações legadas que sofrem de locks globais de escrita no caminho quente, crescimento ilimitado e ausência de observabilidade nativa. Inspirado em HikariCP, Apache Commons Pool 2 e Npgsql, Triton leva essas mesmas ideias a sério no Delphi.


Por que o Triton?

Pools Delphi legados tipicamente:

  • Adquirem e selecionam itens dentro de um lock global de escrita: todas as threads serializam na criação
  • Fazem busca linear O(n) para encontrar um item ocioso
  • Não têm MaxSize real: sob carga, o pool simplesmente cresce sem parar
  • Não oferecem backpressure: threads se acumulam sem disjuntor
  • Misturam infraestrutura de pool com política específica do recurso
  • Não têm métricas nativas: não é possível observar o que está acontecendo

O Triton resolve todos esses pontos separando o core do pool da política do adapter, garantindo reserva atômica do slot e oferecendo observabilidade estruturada desde o início.


Funcionalidades Principais

Funcionalidade Descrição
Lease atômico Um slot é reservado antes de qualquer instância ser entregue ao chamador; dois leases nunca compartilham o mesmo recurso
Backpressure MaxPendingWaiters rejeita tentativas de acquire quando a fila de espera está cheia, devolvendo uma falha rápida em vez de travar
WarmUp Pré-aloca um número configurado de recursos antes do servidor começar a aceitar tráfego
LIFO / FIFO Política de reutilização de idle configurável: LIFO favorece conexões usadas mais recentemente ("quentes"); FIFO garante equidade
Semântica de lease O chamador recebe um ITritonLease<T>; chamar Release recicla, Discard destrói
ValidateOnAcquire O adapter executa um health check antes de entregar o recurso; conexões falhas são substituídas de forma transparente
ResetOnRelease O adapter limpa o estado do recurso (ex.: rollback) antes de devolvê-lo à fila ociosa
Detecção de leak Leases mantidos por mais tempo que LeakDetectionThresholdMs emitem uma observação estruturada e incrementam um contador
Keep-alive Manutenção em background sonda conexões ociosas periodicamente para mantê-las saudáveis
Housekeeper Worker interno leve executa evicção e keep-alive fora do caminho quente
Métricas estruturadas Snapshot() retorna um TTritonMetricsSnapshot completo com contadores, picos e percentis
Observabilidade plugável OnObservation emite eventos estruturados em caminhos lentos e de falha, sem acoplamento a nenhum backend de log
Core genérico TTriton<T> funciona com qualquer tipo de recurso via ITritonAdapter<T> tipado

O Ciclo de Vida do Pool em Ação

Animação do ciclo de vida de um pool Triton: warm-up, acquire/release normal, crescimento sob pico de carga, esgotamento e recuperação escalonada por ociosidade

Cinco fases, um loop de 36 segundos: o warm-up cria as MinSize instâncias de uma vez; o fluxo normal faz as mesmas instâncias girarem entre Acquire/Release; um pico de carga cresce o pool além do MinSize até o MaxSize; o esgotamento mostra o que o caller realmente vê quando todo slot está emprestado e o AcquireTimeoutMs se esgota; a recuperação é onde IdleTimeoutMs e IdleTimeoutJitterMs entram em ação: as extras fecham em onda escalonada em vez de todas de uma vez, enquanto as instâncias de MinSize ficam paradas o tempo todo (só são recicladas de forma preguiçosa pelo MaxLifetimeMs, no próximo Acquire ou Release, nunca evictadas proativamente pelo housekeeper).


Performance & Benchmarks

Medido em dois níveis: um microbenchmark isolado da primitiva Acquire/Release (zero syscalls no caminho sem contenção, hot path sem alocação) e um soak de mundo real (mesmo servidor HTTP, mesmo driver de banco, só o pool muda) com 2000 usuários virtuais por 20 minutos, ~40:1 de contenção, PostgreSQL:

Métrica Pool de referência Triton
Throughput 912 req/s 967 req/s (+6%)
Latência mediana 270 ms 228 ms (−16%)
p95 2,15 s 1,83 s (−15%)

Sob carga moderada os dois pools empatam; a vantagem do Triton aparece sob alta contenção, na cauda de latência e na taxa de falha. Reprodução em samples/05-benchmark-sqlite e samples/06-benchmark-pool-latency.


Documentação

A referência completa está no Playbook, um guia modular cobrindo conceitos, adapters, operação e receitas.

Seção Conteúdo
Visão geral O que é o Triton, arquitetura em camadas, quando usar
Inspirações Bibliotecas que influenciaram o design do Triton e o que foi aproveitado de cada uma
Conceitos core Lease semantics, slot state machine, adapter contract, opções
Referência de Configuração Todas as opções de TTritonOptions, tipos, defaults e quando ajustar cada uma
Adapters FireDAC, THTTPClient, TIdSMTP, criando seu adapter
Operação e runtime Observabilidade, métricas, backpressure, leak detection, housekeeper
Receitas Padrões prontos para cenários comuns

A Família Olímpica

Poseidon comanda os mares: poder bruto, a engine assíncrona sob as ondas. Hermes percorre todos os reinos: carrega mensagens, mais rápido que qualquer onda. Hefesto forja nas profundezas: invisível, incansável, transformando matéria bruta em obra acabada. Apollo é o deus da luz e da verdade: traz tudo à luz.

Projeto Mito Papel
Poseidon Deus dos mares Framework HTTP assíncrono nativo + engine de I/O (IOCP/RIO, io_uring/epoll)
Hermes Mensageiro dos deuses, guia entre os reinos Cliente Redis (chave-valor, pub/sub, mensageria)
Hefesto Forjador dos deuses, trabalha nas sombras Jobs em background (filas, workers, retry, agendamento)
Apollo Deus da luz e da verdade, traz as coisas à luz Logging estruturado (sinks assíncronos, OTLP, Seq, Loki, Datadog)

Contribuindo

Veja CONTRIBUTING.md com diretrizes sobre adapters, testes, atualização do playbook e fluxo de pull request.


🇺🇸 Read this document in English: README_en.md