Предотвращение слишком большого количества подключений к memcached (Enyim Client)
Я ищу предложения по эффективному решению для открытия соединений memcached, учитывая цитату FAQ:
Помните, что ничто не мешает вам случайно подключиться много раз. Если вы создаете экземпляр клиентского объекта memcached как часть объекта, который вы пытаетесь сохранить, не удивляйтесь, когда 1000 объектов в одном запросе создают 1000 параллельных соединений. Посмотрите внимательно на ошибки, как это, прежде чем попасть в список.
См. Также: Инициализация клиента Memcached и управление объектами соединения.
Я подумал об использовании синглтона в нашей сборке кэширования для предоставления клиента memcached, хотя я уверен, что должны быть более совершенные методы, так как блокировки привносят (ненужные?) Накладные расходы.
Я четко знаю шаблоны использования клиента, но я не совсем понимаю, как эффективно использовать клиент в отношении масштабируемости и производительности. Как другие люди имеют дело с использованием клиентов memcached?
Для вас это щедрость 50.
1 ответ
У нас был похожий сценарий с Redis-клиентом, и изначально нашим решением было создать единый общий экземпляр, к которому мы синхронизировали доступ через lock
, Это было хорошо, но чтобы избежать задержек и блокировок, мы в конце концов написали поточно-ориентированный конвейерный клиент, который позволяет одновременное использование без какой-либо блокировки. Я не знаю так много о протоколе болей мужчин, но мне интересно, может ли что-то подобное здесь применяться. Я действительно испытываю искушение попытаться выяснить, могу ли я добавить это в BookSleeve (наш пользовательский OSS Redis-клиент), если вы можете немного подождать.
Но мы, как правило, могли поддерживать только синхронизированный общий экземпляр (почти то же самое, что и синглтон, в зависимости от того, насколько вы чисты).
Взглянув на FAQ, конвейер действительно возможен; и я полностью открыт для возможности написания асинхронного / конвейерного клиента memcached внутри книжного рукава. Большая часть необработанного ввода-вывода / мультиплексирования была бы довольно распространена в Redis. Другие приемы, которые вы можете рассмотреть, - это использование get_multi и т. Д., А не раздельное получение, где это возможно - хотя я не знаю, поддерживает ли ваш текущий клиент это (IK не смотрел).
Но: я не знаю, как это противопоставляет memcached и redis, но в нашем случае переключение на конвейерный / мультиплексированный API означало, что нам не нужно было использовать много пула (много соединений) - одно соединение (правильно конвейеризованное) способно поддержки большого количества одновременного использования с одного узла.