измените сообщение об ошибке redis «максимальное количество клиентов достигнуто» на «

#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)