#php #redis #predis
#php #redis #предварительный
Вопрос:
возможно ли изменить сообщение об ошибке «максимальное количество достигнутых клиентов» на null или пустую строку?
Я использую redis в качестве кэша для своих значений БД, и в тех случаях, когда я не могу получить значения из кэша, я получу их из БД. если бы я мог настроить его в redis самостоятельно, это был бы лучший вариант для меня, потому что мой код не нужно будет менять по порядкудля поддержки этого крайнего случая.
если у кого-то есть несколько советов о том, как избежать таких ошибок, было бы неплохо (Я использую php-скрипты с пакетом predis)
Комментарии:
1. ИМО, это лучше обрабатывать в клиенте. если вы хотите это сделать, возможно, вы можете установить для этого значения неоправданно высокое значение?
2. У меня несколько клиентов, и я не хочу менять их все … в настоящее время он установлен на 10 Тыс. Сколько, по вашему мнению, возможно?
3. 10k уже достаточно. обычно у клиента уже есть пул соединений. если пул соединений не используется, то, вероятно, 100 тыс.
Ответ №1:
В сообщении об ошибке max number of clients reached
четко указано, что Redis достиг предела клиента и не может обслуживать какие-либо новые запросы.
- эта проблема, вероятно, может быть связана с неправильным использованием
PredisClient
кода in. Вместо этого создайте объект подключения один раз (singleton
) и используйте его в течение всего срока службы процесса. Код, вероятно, создает новый объект при каждом запросе к Redis и сохраняет все эти соединения открытыми. - еще одна вещь, которую стоит проверить, как
php
процессы управляются веб-сервером. Веб-сервер (напримерapache prefork
,nginx php-fpm
) может надолго оставлять процессы, удерживающие соединения с Redis, и исчерпывать ресурсы сервера (память, процессор). - если ничего из вышеперечисленного не соответствует действительности — проблема (ошибка) может быть в
predis
библиотеке.
Итог: предел исчерпания кода / веб-сервера maxclients
.
Если у вас нет контроля над кодом / веб-сервером (например nginx
), чтобы уменьшить количество сообщений об ошибках, вы можете:
- увеличение
maxclients
более чем на 10 кб (зависит от ресурсов вашего сервера Redis). Это уменьшит частоту сообщений об ошибках. - подумайте о том, чтобы включить (по умолчанию отключено) соединение
timeout
(используйте его с осторожностью, так как ваш код может предполагать, что соединения никогда не прерываются). Это приведет к удалению старых подключений из пула подключений. - уменьшите
tcp-keepalive
с300
секунд до менееtimeout
. Это закроет соединения сdead peers
(клиентами, с которыми невозможно связаться, даже если они выглядят подключенными).
Комментарии:
1. спасибо, Том! это очень ценная информация, но она не отвечает на мой вопрос. Я хочу изменить возвращаемое сообщение об ошибке…
2. Ха-ха! Это правда! Я все еще не могу понять — вы получаете это сообщение об ошибке в журнале (app / redis) или в качестве вывода из процесса php?
3. мое php-приложение получает это сообщение при попытке подключиться к серверу redis.
4. Понял. В этом случае, если вас не волнуют все ошибки. Вы можете отключить их — php.net/manual/en/… Или, если у вас есть доступ к коду, вы можете проверить,
predis
поддерживает ли пользовательское ведение журнала для каждого экземпляра объекта.5. В любом случае я думаю, что ответ @TomLime очень подробен в отношении того, как на самом деле исправить ошибку. Это ненормальное поведение в приложении для получения этого сообщения (я не уверен, насколько велико ваше приложение, но у нас есть несколько веб-серверов за балансировщиком нагрузки, и мы совершаем сотни, а иногда и тысячи вызовов redis в минуту через синглтон на каждом сервере, мы никогда не получаем это isseu) Мне кажется, что вам нужно потратить некоторое время на правильную обработку подключений к вашему кластеру Redis, а не на молчаливое обнаружение ошибки (тихое обнаружение тоже довольно опасно, imo)