Подключение к удаленным сервисам из многопоточных запросов

У меня есть улучшенное asio-приложение со многими потоками, похожим на веб-сервер, которое обрабатывает сотни одновременных запросов. Каждый запрос должен вызывать как memcached, так и redis (через libmemcached и redispp соответственно). Является ли наилучшей практикой в ​​этой ситуации отдельное подключение к redis и memcached из каждого потока (фактически утроение открытых сокетов на сервере, по три на запрос)? Или у меня есть способ создать статический объект с одним подключением memcached / redis и разрешить всем потокам совместно использовать это одно подключение? Я немного сбит с толку, когда речь заходит о безопасности потоков чего-то подобного, и все должно быть асинхронным между потоками, но блокировка для отдельного запроса каждого потока (поэтому каждый поток имеет линейную прогрессию, но многие потоки могут быть в разные места в своей прогрессии в любой момент времени). Имеет ли это смысл?

Спасибо!

0

Решение

Поскольку memcached имеет синхронный протокол, вы не должны писать следующий запрос, прежде чем получите ответ на prevous. Таким образом, никакой другой поток не может общаться в том же подключении memcached. Я бы предпочел установить локальное соединение с потоком, если вы работаете с ним в режиме «блокировки».

Или вы можете заставить его работать «асинхронно»: создайте пул соединений, выберите из него соединение (и заблокируйте его). После завершения запроса верните его в пул.

Кроме того, вы можете создать очередь запросов и обработать ее в специальных потоках (используя множественные вызовы и обратные вызовы).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]