2017-10-03 9 views
0

Une application web Elixir typique aura généralement un backend postgresql, avec des requêtes Ecto couplées à la logique API.Fils de base de données par requête utilisant Ecto

Cependant depuis cowboy crée un processus enfant GenServer (contenant la logique d'application) par demande, cela aura pour effet de produire n fils de psql pour n requêtes simultanées, même avec la mise en commun cowboy/poolboy fournit?

Ensuite, passer à un scénario où plusieurs instances de l'application existent (par exemple un cluster de conteneur docker) cela n'ajoutera pas un facteur supplémentaire au nombre total de threads de base de données existants?

Répondre

4

Cowboy crée un nouveau processus Erlang pour chaque requête, mais l'exécution d'une requête Ecto à partir de ce processus entraînera et non une nouvelle connexion à la base de données. Ecto conserve un pool de connexions à la base de données (en utilisant db_connection/poolboy). La taille de ce pool est définie à l'aide de l'option pool_size dans la configuration du Repo. Lorsque vous lancez une requête, une connexion de ce pool est empruntée et utilisée pour exécuter la requête. La connexion est renvoyée au pool une fois l'exécution terminée. Ecto ne créera jamais une nouvelle connexion pour chaque requête. Si une connexion n'est pas disponible dans le pool, elle attendra qu'elle soit disponible ou éventuellement expirée si aucune connexion n'est enregistrée dans le délai d'attente configuré (30 secondes par défaut).

+0

Merci - calcul du nombre maximum de threads de la base de données de l'application sur ** ** Les instances de l'application doivent alors être ** n ** * 'pool_size' – category

+1

Oui, c'est vrai. Chaque instance de l'application ouvrira les connexions 'pool_size'. – Dogbert

+0

N'est-ce pas un problème? Je veux dire, si le nombre d'instances augmente de façon incontrôlable, alors les threads n * pool_size pourraient simplement tuer la DB sous une forte charge, que faites-vous dans ce cas dans le monde Elixir? –