Реализация асинхронного пула соединений в Rust - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть фоновое приложение Tokio TCP, которое после получения запроса кратко читает что-то из Redis, записывает что-то в PostgreSQL, загружает что-то через HTTP, отправляет что-то в RabbitMQ и т. Д. Обработка каждого запроса занимает много времени.время, поэтому создается отдельная задача для каждого запроса.Поскольку совместное использование соединений невозможно в асинхронных моделях, требуется пул некоторых соединений.На данный момент новые соединения устанавливаются при каждом запросе, и это чрезвычайно избыточно.

Я искал реализацию пула асинхронных соединений в Rust, но не нашел ни одного из них до сих пор.

Я бы хотел услышать несколько советов о том, как реализовать это сам.

Единственная идея, которая мне пришла в голову:

  1. Реализация объекта Stream/Sink свнутренняя коллекция связей.Неважно, является ли это LIFO или FIFO, так как соединения идентичны.При запуске приложения выделяется N соединений.
  2. Теперь я не уверен, возможно ли разделить такой пул между задачами, но если бы это было возможно, задачи опрашивали бы поток для экземпляра соединения (вместо создания своего собственного), используйте его,и затем верните обратно.
  3. Если бы не было доступных соединений, поток мог бы установить больше из них или попросить, чтобы задача зависла (в зависимости от его конфигурации).
  4. В случае сбоя соединения,он удаляется, и пул теперь содержит N-1 подключений, поэтому он может принять решение выделить новое при следующем запросе.

Итак, у меня две проблемы, я нигде не могу найти правильные ответы:

  1. Должен ли / может / должен ли я каким-то образом совместно использовать пул потоков / приемников?В любом случае, я вижу некоторые Shared фьючерсы в ящике futures.

  2. В уроке по Токио / Фьючерсам есть несколько мрачных моментов.Например, это не объясняет, как я должен уведомить самую верхнюю задачу, то есть, как я могу реализовать мифическое сокровенное будущее, которое само по себе ничего не объединяет, но все же должно уведомлять верхнее будущее.

Или мой подход совершенно неверный?Я мог бы начать играть с ним сам, но у меня есть сильное подозрение, что я что-то пропустил, например, решение в один клик.

...