使用 Ecto 的每个请求的数据库线程数

Database threads per request using Ecto

典型的 Elixir Web 应用程序通常有一个 postgresql 后端,带有 Ecto 查询和 API 逻辑。

然而,由于 cowboy 每个请求创建一个子 GenServer 进程(包含应用程序逻辑),这是否会产生 n psql 线程对于 n 个并发请求,即使使用 cowboy/poolboy 提供的池?

然后,转到存在多个应用程序实例的场景(例如 docker 容器集群),这是否会增加现有数据库线程总数的额外因素?

Cowboy 确实为每个请求创建了一个新的 Erlang 进程,但是从该进程执行一个 Ecto 查询将不会导致一个新的数据库连接。 Ecto 保持与数据库的连接池(使用 db_connection/poolboy)。该池的大小是使用 Repo 配置中的 pool_size 选项设置的。当您启动查询时,将从该池中借用一个连接并用于执行查询。执行完成后连接返回池中。 Ecto 永远不会为每个查询创建一个新的连接。如果连接在池中不可用,它将等待一个可用或最终超时,如果在配置的超时(默认为 30 秒)内没有签入连接。