У меня есть улучшенное asio-приложение со многими потоками, похожим на веб-сервер, которое обрабатывает сотни одновременных запросов. Каждый запрос должен вызывать как memcached, так и redis (через libmemcached и redispp соответственно). Является ли наилучшей практикой в этой ситуации отдельное подключение к redis и memcached из каждого потока (фактически утроение открытых сокетов на сервере, по три на запрос)? Или у меня есть способ создать статический объект с одним подключением memcached / redis и разрешить всем потокам совместно использовать это одно подключение? Я немного сбит с толку, когда речь заходит о безопасности потоков чего-то подобного, и все должно быть асинхронным между потоками, но блокировка для отдельного запроса каждого потока (поэтому каждый поток имеет линейную прогрессию, но многие потоки могут быть в разные места в своей прогрессии в любой момент времени). Имеет ли это смысл?
Спасибо!
Поскольку memcached имеет синхронный протокол, вы не должны писать следующий запрос, прежде чем получите ответ на prevous. Таким образом, никакой другой поток не может общаться в том же подключении memcached. Я бы предпочел установить локальное соединение с потоком, если вы работаете с ним в режиме «блокировки».
Или вы можете заставить его работать «асинхронно»: создайте пул соединений, выберите из него соединение (и заблокируйте его). После завершения запроса верните его в пул.
Кроме того, вы можете создать очередь запросов и обработать ее в специальных потоках (используя множественные вызовы и обратные вызовы).
Других решений пока нет …