Die irreführende Konfiguration
Beim Konfigurieren von Connection Pools in Vapor – ob für Redis, PostgreSQL oder andere Datenbanken – begegnet dir ein Parameter namens maximumActiveConnections. Die naheliegende Annahme ist, dass dieser die maximale Gesamtanzahl an Verbindungen für deine Anwendung festlegt. Tut er nicht. Er legt das Maximum pro NIO EventLoop fest.
Diese Unterscheidung ist in der Produktion enorm wichtig.
Die Rechnung, die mich überrascht hat
Auf einem typischen Server erstellt Swift NIO einen EventLoop pro CPU-Kern. Die tatsächliche maximale Verbindungsanzahl ist also:
actual max = maximumActiveConnections * CPU cores * number of dynos/instancesIch hatte maximumActiveConnections auf 8 gesetzt, in der Annahme, dass ich meine Redis-Verbindungen auf vernünftige 16 über zwei Dynos begrenze. Die tatsächliche Zahl:
8 (per event loop) * 8 (cores) * 2 (dynos) = 128 potential connectionsDas ist eine Größenordnung mehr als beabsichtigt, und es überschritt das Verbindungslimit meines Redis-Anbieters bei Traffic-Spitzen.

Die Symptome
Der Fehlermodus ist besonders tückisch: intermittierende 500-Fehler, die nur unter Last auftreten. Bei normalem Traffic erreichst du nie das echte Verbindungslimit, also funktioniert alles einwandfrei. Bei Spitzen häufen sich Verbindungen über alle Event Loops gleichzeitig an und überschreiten das Limit des Anbieters. Die Fehler wirken zufällig und sind lokal schwer zu reproduzieren, weil Entwicklungsmaschinen typischerweise weniger Kerne haben.
Den richtigen Wert berechnen
Teile das Verbindungslimit deines Anbieters durch die Gesamtzahl der Event Loops über alle Instanzen hinweg:
// Provider limit: 40 connections
// 2 dynos * 8 cores = 16 event loops total
// 40 / 16 = 2.5, round down to 2
app.redis.configuration = .init(
pool: .init(maximumActiveConnections: 2)
)Diese konservative Einstellung hat endlich die seit Langem bestehenden seltenen 500-Fehler in TranslateKit behoben, die mich monatelang verwirrt hatten. Überprüfe immer die Verbindungslimits deines Cloud-Anbieters und rechne die Multiplikation durch, bevor du deployst.
