Потоки базы данных на запрос с использованием Ecto

Типичное веб-приложение Elixir обычно имеет серверную часть postgresql с Ecto запросы в сочетании с логикой API.

Однако так как cowboy создает ребенка GenServer процесс (содержащий логику приложения) для каждого запроса будет иметь эффект создания n потоков psql для n одновременных запросов, даже с пулом cowboy/poolboy обеспечивает?

Затем, переходя к сценарию, в котором существует несколько экземпляров приложения (например, кластер док-контейнера), это не добавит дополнительный фактор к общему количеству существующих потоков базы данных?

1 ответ

Решение

Cowboy создает новый процесс Erlang для каждого запроса, но выполнение запроса Ecto из этого процесса не приведет к новому соединению с базой данных. Ecto поддерживает пул соединений с базой данных (используя db_connection / poolboy). Размер этого пула устанавливается с помощью pool_size вариант в конфигурации репо. Когда вы инициируете запрос, соединение из этого пула заимствуется и используется для выполнения запроса. Соединение возвращается в пул после завершения выполнения. Ecto никогда не создаст новое соединение для каждого запроса. Если соединение не доступно в пуле, оно будет ждать, пока оно не станет доступным, или в конечном итоге истечет время ожидания, если в настроенное время ожидания не будет установлено соединение (по умолчанию 30 секунд).

Другие вопросы по тегам