1

我有一个 Tokio TCP 后端应用程序,简单地说,在收到请求后,它会从 Redis 读取一些内容,向 PostgreSQL 写入一些内容,通过 HTTP 上传一些内容,向 RabbitMQ 发送一些内容等。处理每个请求需要很长时间,所以为每个请求创建一个单独的任务。由于在异步模型中共享连接是不可能的,因此需要一些连接池。目前,每个请求都会建立新的连接,这非常过分。

我一直在寻找 Rust 中的异步连接池实现,但没有找到最新的。

我想听听一些关于如何自己实施它的建议。

我想出的唯一想法是:

  1. 实现一个Stream/Sink具有内部连接集合的对象。它是 LIFO 还是 FIFO 无关紧要,因为连接是相同的。在应用程序启动时,分配了 N 个连接。
  2. 现在我不确定是否可以在任务之间共享这样一个池,但如果可能的话,任务将轮询流以获取连接实例(而不是建立自己的连接实例),使用它,然后放回去。
  3. 如果没有可用的连接,则流可能会建立更多连接或要求任务挂起(取决于其配置)。
  4. 如果连接失败,它将被丢弃,并且池现在包含 N-1 个连接,因此它可能决定在下一个请求时分配一个新连接。

所以我有两个问题,我无法在任何地方找到正确的答案:

  1. 我必须/可以/应该以某种方式在任务之间共享流/接收池吗?无论如何,我在箱子里看到了一些Shared未来。futures

  2. tokio/futures 教程中有一些令人沮丧的地方。例如,它没有解释我如何通知最上面的任务,也就是说,我如何实现神话中的最里面的未来,它本身不汇集任何东西,但仍然必须通知上层的未来。

还是我的方法完全错误?我可以自己开始玩它,但我强烈怀疑我错过了一些东西,例如一键式解决方案。

4

0 回答 0