part_os
@part_os
Сложное в простом

Утечки памяти в обработчиках сообщений AMQP, как вы с ними справляетесь?

Использую php-amqplib/rabbitmq-bundle,
создаю
producer OldSound\RabbitMqBundle\RabbitMq\ProducerInterface
consumer OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface

Всё работает, обрабатывает, по завершению выполняю закрытие соединений к БД, чистку кеша, слежу что бы ни где ни чего не накапливалось.
НО! PHP рожден умирать, и соответственно где то в недрах всё ровно идёт накопление по 1Мб и через какое то время consumer падает.
Автоматом приподнимается, и заново обрабатывает сообщение.

Утечки памяти в обработчиках сообщений AMQP, как вы с ними справляетесь?
  • Вопрос задан
  • 392 просмотра
Решения вопроса 1
Утечки памяти в обработчиках сообщений AMQP, как вы с ними справляетесь?


  • Ограничивать время работы консюмера. После n часов/минут должен завершиться процесс после очередной итерации, после чего запущен новый процесс.
  • Завершать процесс при выделении памяти более допустимого объема. PHP считает выделенную память достаточно не точно, но попробовать можно memory_get_usage(), memory_get_peak_usage. -l флаг.
  • Завершать процесс после обработки n сообщений. -m флаг в упомянутой библиотеке php-amqplib/rabbitmq-bundle


Про сами утечки: надо дебажить и не допускать утечек :)

Верно, "рожден умирать". Рекомендовал бы не запускать скрипты на "вечно". Рано или поздно они повиснут (дело не в памяти, а в том что процесс фактически будет висеть, но ничего не делать).
Должен быть механизм убивающий слишком долго запущенные процессы. Отталкиваться можно от установленного времени работы скрипту.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы