【问题标题】:Phoenix 1.4: How can I keep a DBConnection across multiple requests?Phoenix 1.4:如何跨多个请求保持 DBConnection?
【发布时间】:2019-11-12 21:44:30
【问题描述】:

我有一个带有 Elixir 1.9、Phoenix 1.4 和 PostgreSQL 数据库的 Phoenix 应用程序。此应用用作 API 服务器。

它需要这样的功能:

假设它运行 1000 个并发进程连接到数据库池大小为 100 的数据库。每个进程需要运行 5 个不同的查询。

通常在这样的设置中,1000 个进程将共享池中的 100 个 DBConnection,并轮流运行查询,每个进程将运行 1 或 2 个查询,或几个查询,并将连接提供给另一个要运行的进程。这些进程不断共享池中的连接以运行查询,直到它们都完成每个查询的所有 5 个查询。

问题:是否有任何配置或指令强制每个进程完成所有 5 个查询,然后才能将连接返回给池以共享?

【问题讨论】:

  • 我不明白你为什么要这样做,但无论如何,将查询包装在事务中应该可以。
  • 每个进程都是一个任务,它通过不同的查询集以不同的方式进行,每个查询都取决于前一个的结果,因此将它们全部包装在事务中并不方便。但这是一个有趣的想法。我会看看我们是否可以以某种方式利用它。

标签: elixir connection-pooling ecto phoenix


【解决方案1】:

通常在这样的设置中,1000 个进程将共享池中的 100 个 DBConnection [...]

在 2019 年和Broadway 之前是“正常”的。实际上甚至在 2016 年和GenStage 之前,但百老汇让处理背压成为一种魅力。如今,我们通常在消费者和潜在瓶颈(在您的情况下为数据库)之间放置GenStage(低级别)或Broadway(高级别)背压处理程序。与工作人员池相比,这要强大得多。

强制每个进程完成所有 5 个查询,然后才能返回连接

将您的查询封装在Ecto.Multi

【讨论】:

  • 谢谢。我会看看那些东西。
猜你喜欢
  • 2020-06-19
  • 2014-09-13
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 2022-11-03
相关资源
最近更新 更多