ADR-004: LIFO Connection Pooling¶
Estado: ✅ Accepted Date: 2026-01-29 Deciders: Rodrigo Roldán
Context¶
Connection pooling es crítico para performance. Dos estrategias principales:
FIFO (First In, First Out): Cola, primeras conexiones se reutilizan primero
LIFO (Last In, First Out): Stack, últimas conexiones se reutilizan primero
Consideraciones:
Conexiones TCP idle tienen timeout del servidor
Conexiones más recientes tienen más probabilidad de estar activas
Cache locality: conexiones recientes están más “calientes”
Decision¶
Usar LIFO (Last In, First Out) para connection pooling.
Implementation:
class ConnectionPool:
def __init__(self):
self._pools: Dict[str, List[Connection]] = {}
def put_connection(self, host: str, port: int, conn: Connection):
key = f"{host}:{port}"
self._pools[key].append(conn) # Push (LIFO)
def get_connection(self, host: str, port: int) -> Connection:
key = f"{host}:{port}"
if self._pools[key]:
return self._pools[key].pop() # Pop (LIFO)
return self._create_new_connection(host, port)
Características:
Pool separado por
host:portMax size configurable por host
Dead connection detection antes de reutilizar
Thread-safe con
threading.Lock
Consequences¶
Positive ✅¶
Menos conexiones muertas: Conexiones recientes más probablemente activas
Cache locality: Mejores hit rates en CPU cache
Simple: Lista como stack es eficiente O(1)
Predictible: Comportamiento determinístico
Negative ❌¶
Desbalance: Algunas conexiones nunca se reutilizan si pool está activo
Starvation: Conexiones antiguas pueden quedar idle hasta timeout
No es round-robin: No distribuye carga uniformemente
Mitigations¶
Dead connection detection: Verificar
is_usable()antes de reutilizarMax idle time: (futuro) Descartar conexiones muy antiguas
Pool limits: Evitar crecimiento infinito
Alternatives Considered¶
FIFO: Rejected. Más conexiones muertas, peor performance.
Round-robin: Rejected. Más complejo, no mejora performance.
Least recently used: Rejected. Overhead de tracking innecesario.
Performance Data¶
(Pendiente: benchmarks comparando LIFO vs FIFO)
References¶
httpcore pool implementation