Потоки базы данных на запрос с использованием Ecto
Типичное веб-приложение Elixir обычно имеет серверную часть postgresql с Ecto
запросы в сочетании с логикой API.
Однако так как cowboy
создает ребенка GenServer
процесс (содержащий логику приложения) для каждого запроса будет иметь эффект создания n потоков psql для n одновременных запросов, даже с пулом cowboy
/poolboy
обеспечивает?
Затем, переходя к сценарию, в котором существует несколько экземпляров приложения (например, кластер док-контейнера), это не добавит дополнительный фактор к общему количеству существующих потоков базы данных?
1 ответ
Cowboy создает новый процесс Erlang для каждого запроса, но выполнение запроса Ecto из этого процесса не приведет к новому соединению с базой данных. Ecto поддерживает пул соединений с базой данных (используя db_connection / poolboy). Размер этого пула устанавливается с помощью pool_size
вариант в конфигурации репо. Когда вы инициируете запрос, соединение из этого пула заимствуется и используется для выполнения запроса. Соединение возвращается в пул после завершения выполнения. Ecto никогда не создаст новое соединение для каждого запроса. Если соединение не доступно в пуле, оно будет ждать, пока оно не станет доступным, или в конечном итоге истечет время ожидания, если в настроенное время ожидания не будет установлено соединение (по умолчанию 30 секунд).