a) Ai-je besoin de la configuration before_fork / after_fork comme inUnicorn, puisque les nœuds de calcul du cluster sont forkés ?.
Normalement non, mais puisque vous utilisez preload_app
, oui. Le préchargement de l'application permet à une instance de fonctionner, puis de bifurquer l'espace mémoire pour les travailleurs ; le résultat est que vos initialiseurs ne sont exécutés qu'une seule fois (éventuellement en allouant des connexions à la base de données, etc.). Dans ce cas, votre on_worker_boot
code est approprié. Si vous n'utilisez pas preload_app
, puis chaque travailleur démarre lui-même, auquel cas l'utilisation d'un initialiseur serait idéale pour configurer la connexion personnalisée comme vous le faites. En fait, sans preload_app
, votre on_worker_boot
block générerait une erreur car à ce stade, ActiveRecord et ses amis ne sont même pas chargés.
b) Comment puis-je ajuster mon nombre de threads en fonction de mon application - quelle serait la raison de le supprimer ? / Dans quels cas cela ferait-il une différence ? 0:16 n'est-il pas déjà optimisé ?
Sur Heroku (et mes tests), vous faites mieux correspondre votre min
/max
fils, avec max
<=DB_POOL
paramètre. Le min
les threads permettent à votre application de ralentir les ressources lorsqu'elles ne sont pas en charge, ce qui est normalement idéal pour libérer des ressources sur le serveur, mais probablement moins nécessaire sur Heroku ; ce dyno est déjà dédié au traitement des requêtes Web, peut tout aussi bien les avoir prêts et prêts. Lors de la définition de votre max
fils <=votre DB_POOL
la variable d'environnement n'est pas requise, vous courez le risque de consommer toutes vos connexions de base de données dans le pool, puis vous avez un thread qui veut une connexion mais ne peut pas l'obtenir, et vous pouvez obtenir l'ancien "ActiveRecord ::ConnectionTimeoutError - could not obtenir une connexion à la base de données dans les 5 secondes." Erreur. Cela dépend de votre application cependant, vous pourriez très bien avoir max
> DB_POOL
et être bien. Je dirais votre DB_POOL
doit être au moins le même que votre min
threads, même si vos connexions ne sont pas chargées avec impatience (les threads 5:5 n'ouvriront pas 5 connexions si votre application n'atteint jamais la base de données).
c) La base de données Heroku autorise 500 connexions. Quelle serait une bonne valeur pour DB_POOL en fonction du nombre de threads, de travailleurs et de dyno ? - Est-ce que chaque thread par worker par dyno nécessite une seule connexion DB lorsqu'il travaille en parallèle ?
Le niveau de production en autorise 500, pour être clair :)
Chaque thread par worker par dyno pourrait consomment une connexion, selon qu'ils essaient tous d'accéder à la base de données en même temps. Habituellement, les connexions sont réutilisées une fois qu'elles sont terminées, mais comme je l'ai mentionné dans b)
, si vos threads sont supérieurs à votre pool, vous pouvez passer un mauvais moment. Les connexions seront réutilisées, tout cela est géré par ActiveRecord, mais parfois pas idéalement. Parfois, les connexions deviennent inactives ou meurent, et c'est pourquoi il est suggéré d'activer le Reaper, pour détecter et récupérer les connexions mortes.