2017-10-03 5 views
0

Eine typische Elixir-Webanwendung hat normalerweise ein Postgresql-Backend mit Ecto Abfragen, die mit der API-Logik gekoppelt sind.Datenbank-Threads pro Anfrage mit Ecto

jedoch seit cowboy erstellt ein Kind GenServer Prozess pro Anfrage (die App Logik enthält), wird dies zur Folge haben, n psql Gewinde für n gleichzeitige Anforderungen produzieren, auch mit dem Pooling cowboy/poolboy bietet?

Wenn Sie dann zu einem Szenario wechseln, in dem mehrere Instanzen der Anwendung vorhanden sind (z. B. ein Dockercontainercluster), wird dadurch kein zusätzlicher Faktor zur Gesamtzahl der vorhandenen Datenbank-Threads hinzugefügt.

Antwort

4

Cowboy einen neuen Erlang Prozess für jede Anforderung schafft aber eine Ecto Abfrage von diesem Prozess wird nicht Ergebnis in einer neuen Datenbankverbindung ausgeführt wird. Ecto hält einen Pool von Verbindungen zur Datenbank (mit db_connection/poolboy). Die Größe dieses Pools wird über die Option pool_size in der Konfiguration des Repos festgelegt. Wenn Sie eine Abfrage initiieren, wird eine Verbindung aus diesem Pool ausgeliehen und zum Ausführen der Abfrage verwendet. Die Verbindung wird nach Abschluss der Ausführung an den Pool zurückgegeben. Ecto erstellt niemals eine neue Verbindung für jede Abfrage. Wenn eine Verbindung im Pool nicht verfügbar ist, wartet sie auf eine Verfügbarkeit oder eine Zeitüberschreitung, wenn im konfigurierten Zeitlimit (standardmäßig 30 Sekunden) keine Verbindung eingecheckt wird.

+0

Danke - Berechnung bis max Anzahl der App Db-Threads über ** n ** App-Instanzen sollten dann nur sein ** n ** * 'pool_size' – category

+1

Ja, das ist richtig. Jede Instanz der App öffnet 'pool_size'-Verbindungen. – Dogbert

+0

Ist das nicht ein Problem? Ich meine, wenn die Anzahl der Instanzen unkontrollierbar anwächst, könnten n * pool_size-Threads einfach die DB unter schwerer Last töten, was machst du dann in der Elixir-Welt? –