cat*_*ory 1 architecture json elixir psql ecto
典型的 Elixir Web 应用程序通常有一个 postgresql 后端,带有Ecto与 API 逻辑相结合的查询。
然而,由于每个请求cowboy创建一个子进程(包含应用程序逻辑),因此即使使用池/提供,这是否会产生为n 个并发请求生成n 个psql 线程GenServer的效果?cowboypoolboy
然后,转移到存在应用程序的多个实例的场景(例如 Docker 容器集群),这不会为现有数据库线程总数添加额外的因素吗?
Cowboy 确实为每个请求创建一个新的 Erlang 进程,但从该进程执行 Ecto 查询不会导致新的数据库连接。Ecto 保留一个与数据库的连接池(使用 db_connection/poolboy)。该池的大小是使用pool_sizeRepo 配置中的选项设置的。当您启动查询时,将从该池中借用一个连接并用于执行查询。执行完成后连接返回到池中。Ecto 永远不会为每个查询创建新连接。如果池中没有可用的连接,它将等待一个可用的连接,或者如果在配置的超时(默认为 30 秒)内没有签入连接,则最终会超时。