У меня есть фоновое приложение Tokio TCP, которое после получения запроса кратко читает что-то из Redis, записывает что-то в PostgreSQL, загружает что-то через HTTP, отправляет что-то в RabbitMQ и т. Д. Обработка каждого запроса занимает много времени.время, поэтому создается отдельная задача для каждого запроса.Поскольку совместное использование соединений невозможно в асинхронных моделях, требуется пул некоторых соединений.На данный момент новые соединения устанавливаются при каждом запросе, и это чрезвычайно избыточно.
Я искал реализацию пула асинхронных соединений в Rust, но не нашел ни одного из них до сих пор.
Я бы хотел услышать несколько советов о том, как реализовать это сам.
Единственная идея, которая мне пришла в голову:
- Реализация объекта
Stream/Sink
свнутренняя коллекция связей.Неважно, является ли это LIFO или FIFO, так как соединения идентичны.При запуске приложения выделяется N соединений. - Теперь я не уверен, возможно ли разделить такой пул между задачами, но если бы это было возможно, задачи опрашивали бы поток для экземпляра соединения (вместо создания своего собственного), используйте его,и затем верните обратно.
- Если бы не было доступных соединений, поток мог бы установить больше из них или попросить, чтобы задача зависла (в зависимости от его конфигурации).
- В случае сбоя соединения,он удаляется, и пул теперь содержит N-1 подключений, поэтому он может принять решение выделить новое при следующем запросе.
Итак, у меня две проблемы, я нигде не могу найти правильные ответы:
Должен ли / может / должен ли я каким-то образом совместно использовать пул потоков / приемников?В любом случае, я вижу некоторые Shared
фьючерсы в ящике futures
.
В уроке по Токио / Фьючерсам есть несколько мрачных моментов.Например, это не объясняет, как я должен уведомить самую верхнюю задачу, то есть, как я могу реализовать мифическое сокровенное будущее, которое само по себе ничего не объединяет, но все же должно уведомлять верхнее будущее.
Или мой подход совершенно неверный?Я мог бы начать играть с ним сам, но у меня есть сильное подозрение, что я что-то пропустил, например, решение в один клик.