2013-07-10 2 views
0

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

Большое спасибо!

ответ

0

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

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

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

Смежные вопросы