Здравствуйте.
у меня laravel 10, php8.2, redis 6, пыха с редисом работает через predis
Очереди на redis, управляются через horiozin + supervisor
Замечаю, что фейлятся джобы, начал читать логи, вижу в них такую ошибку перед самым стартом моей джобы.
Error while reading line from the server. [tcp://127.0.0.1:6379]
Ошибку кидает predis, через 90 сек фейлится джоба (retry_after 90 сек)
Те мой код не может подключится к редису причем не всегда, а иногда, из 20 джобов 2-3 зафейлятся, остальные отрабатывают хорошо..
Начал изучать редис, нагуглил в конфигах там timeouts и он у меня стоял 300
Поставил timeouts 0 и ошибки больше не встречал, вообще рецепт нашел тут:
https://stackoverflow.com/questions/64062313/predi...
Но согласен с автором, что решение кажется странным, НИКОГДА не закрывать подключения, так они же кончатся...
По умолчанию редис держит 10к подключений, но можно изменить (там есть зависимость от дискрипторов, но не суть)
Те оно конечно, решил провести эксперимент.
неистово пушил простетские задачи в очередь и смотрел в redis-cli client list, а их там всегда 5 штук, это как? у меня отрабатывает куча джобов за короткий промежуток, а клиентов 5..
1) Как получаются эти клиенты, я думал что на каждую джобу будет свой плодится, а нет, а как тогда, как оно с php-fpm работает?
2) Нормально это вообще, что timeouts 0? мне кажется нет
3) Почему ошибка вообще возникала? если логически подумать, то php-fpm стучался к редису и открывал соединение, получал данные и джоба успешно делала свои дела, спустя 300сек ЭТОТ ЖЕ pid php-fpm стучался в редис для очердной задачи, а соединение уже было закрыто и не мог достучатся, фейлился, так выходит? а что же тогда новое соединение не открыть, зачем старое юзать... (поэтому в эксперименте выше всегда 5 клиентов, когда джобов 50+ в моменте, тк юзаются старые подключения, верно мыслю?)
4) Какое вообще правильно решение в этой ситуации? (да, я понимаю, что многого не понимаю, конкретно как оно там под капотом устроено, вот и прошу объяснить)
еще находил решение что у predis параметр read_write_timeout -1
read_write_timeout - timeout in seconds applied after connection establishment; uses PHP default. Negative value sets infinite timeout.
у меня он вообще не установлен, это тоже "таймаут" и говорят его выключить, зачем.. чтобы ждать соединения вечно, так оно же и не появится, не появляется же пока живет php-fpm процесс, который не получает данные от редиса ( Error while reading line from the server) тоже не понимаю этого решения. и почему оно вообще спасает (сам не пробовал)
нашел это решение тут:
https://stackoverflow.com/questions/11776029/predi...