Предотвращение слишком большого количества подключений к memcached (Enyim Client) - PullRequest
6 голосов
/ 28 апреля 2011

Я ищу предложения по эффективному решению для открытия соединений memcached, учитывая цитату FAQ:

Помните, ничто не мешает вам случайно соединяясь много раз. Если вы создаете экземпляр клиента memcached объект как часть объекта, который вы пытаясь хранить, не удивляйтесь когда 1000 объектов в одном запросе создать 1000 параллельных соединений. Посмотрите внимательно на ошибки, как это прежде чем прыгать в список.

См. Также: Инициализация клиента Memcached и Управление объектами подключения .

Я подумал об использовании синглтона в нашей сборке кэширования для предоставления клиента memcached, хотя я уверен, что должны быть более совершенные методы, так как блокировки привносят (ненужные?) Накладные расходы.

Мне понятны шаблоны использования клиента, но я не совсем понимаю, как эффективно использовать клиент с точки зрения масштабируемости и производительности. Как другие люди обращаются с клиентами memcached?

Для вас есть щедрость 50.

1 Ответ

3 голосов
/ 28 апреля 2011

У нас был похожий сценарий с клиентом Redis, и изначально Нашим решением было создать единый общий экземпляр, к которому мы синхронизировали доступ через lock.Это было хорошо, но чтобы избежать задержек и блокировок, мы в конечном итоге написали поточно-ориентированный конвейерный клиент, который позволяет одновременное использование без какой-либо блокировки.Я не знаю так много о протоколе болей мужчин, но мне интересно, может ли что-то подобное здесь применяться.Я действительно испытываю искушение попытаться выяснить, могу ли я добавить это в BookSleeve (наш пользовательский клиент OSS Redis), если вы можете немного подождать.

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


Взглянув на FAQ , конвейер действительно являетсявозможность;и я полностью открыт для возможности написания асинхронного / конвейерного клиента memcached внутри booksleeve .Большая часть необработанного ввода-вывода / мультиплексирования была бы довольно распространена в Redis.Другие приемы, которые вы можете рассмотреть, - это использование get_multi и т. Д., А не раздельное получение, где это возможно - я не знаю, поддерживает ли ваш текущий клиент это, хотя (IK не смотрел).

Но: я не делаюзнаю, как он противопоставляет memcached и redis, но в нашем случае , переключение на конвейерный / мультиплексированный API означало, что нам не нужно для использования большого количества пулов (много соединений) - одно соединение(должным образом конвейерный) способен поддерживать много одновременного использования с одного узла.

...