Как я могу использовать очередь с работником CakePHP по требованию?

В CakePHP существуют различные системы для управления самой очередью (RabbitMQ, бобовый стебель, Amazon SQS, торт-фп-очередь Деревомарка), но все они, кажется, требуют демонизированной рабочей задачи. Эти постоянно работающие работники (у которых есть все возможности CakePHP) слушают задания по мере их поступления в очередь, выполняют их обработку, а затем бездействуют до следующего задания.

В настоящее время я использую очередь на основе beanstalk (см. Выше), и она работает нормально, но с точки зрения ресурсов сервера, она не особенно эффективна. У нас есть утечки памяти, и иногда приходится убивать и перезапускать процессы.

Тем не менее, теперь я пытаюсь добавить больше разных видов «трубок» (на языке beanstalk) и столкнулся с проблемами с ОЗУ на наших серверах, на которых работает так много разных работников одновременно. Когда я раскручиваю всех нужных мне рабочих, я получаю фатальные ошибки нехватки памяти.

Я бы предпочел что-то вроде «безсерверной» / лямбда-установки, где рабочий раскручивается по требованию, выполняет свою небольшую работу, а затем завершает работу. Вроде как задание cron, вызывающее оболочку CakePHP, но данные задания динамически заполняются из очереди.

У кого-нибудь есть опыт работы с такой установкой для очередей? Я использую инфраструктуру на основе AWS, поэтому все, что использует сервисы Amazon, было бы особенно полезно.

2

Решение

Насколько я знаю, есть только два способа запустить PHP. Либо как поток внутри веб-контейнера (Apache, Nginx, CGI), либо как процесс оболочки (однопоточный). Когда вы запускаете его на оболочке, вы застреваете с 1 потоком на процесс.

Я знаю, что это отстой, но PHP не лучший инструмент для работников серверов. Lambda архитектура не поможет решить эту проблему. Вы просто не загружаете свои проблемы с многопоточностью на другой хост.

В конце концов, самое простое решение — просто запустить больше процессов PHP. Если у вас возникли сбои. Вам нужно запустить PHP внутри сценария оболочки. Это просто природа PHP в командной строке.

Но я поделюсь своим опытом, какие у вас есть варианты.

Тем не менее, сейчас я пытаюсь добавить больше разных видов «трубок» (на языке beanstalk) и столкнулся с проблемами оперативной памяти на наших серверах, на которых работает так много разных работников одновременно. Когда я раскручиваю всех нужных мне рабочих, я получаю фатальные ошибки нехватки памяти.

В прошлый раз, когда я проверял, бобовый стебель был однопоточным. Поэтому я не думаю, что для PHP возможно порождение нескольких рабочих одновременно с beanstalk. Вы должны запустить 1 экземпляр PHP, который получает сообщение и работает с ним. Если вы хотите масштабировать, вам нужно запустить несколько экземпляров PHP.

Похоже, ваши работники либо имеют утечки памяти, либо просто потребляют много памяти. Я не понимаю, как это имеет отношение к бобовому стеблю. Вы должны исправить ваши утечки и изменить исходный код, чтобы использовать меньше памяти.

Мне пришлось переписать код PHP, чтобы использовать анализатор пересылки XML, потому что другой анализатор XML загружал бы весь документ в память. Парсер прямого чтения использовал меньше памяти, но было неудобно переписывать весь мой код. Вы должны решить, что стоит вам больше. Тратить больше денег на Рама или тратить время на переписывание кода. Это твой звонок.

объем памяти

PHP поставляется с мягким ограничением на использование памяти. Даже если хост-машина имеет много памяти, поток PHP выдаст ошибку нехватки памяти, когда достигнет мягкого предела. Это то, что вы должны вручную изменить в php.ini файл. Простите, если вы уже сделали это, но я подумал, что стоит упомянуть.

Увеличить ограничение памяти PHP в php.ini:

memory_limit = 128M

Одноразовый узор

Я решил многие утечки памяти, используя одноразовый шаблон. Это просто interface вы используете на объектах, а затем обернуть код в using() функция. Благодаря этой библиотеке я смог уменьшить утечки памяти на 99%. (полное раскрытие, это моя библиотека github).

https://github.com/cgTag/php-disposable

Многопоточный PHP

Есть проект с открытым исходным кодом, который добавляет поддержку многопоточности в PHP, и он выглядит для меня как сплошная библиотека.

https://github.com/krakjoe/pthreads

Проект добавляет многопоточную поддержку PHP (с модулем C ++), который в основном создает новую Глобальный область для каждой темы. Это позволяет вам запускать оболочку CakePHP в каждом потоке, и я думаю, что есть API для обмена данными между потоками (мьютекс и тому подобное).

Dockerize

У меня был некоторый успех в запуске docker только для того, чтобы справиться с одной задачей оболочки CakePHP. Это позволило мне быстро масштабироваться, запустив несколько контейнеров на одном хост-компьютере. Затраты дополнительной памяти на контейнеры действительно не так уж и плохи. Я не помню точное число, но оно меньше, чем вы думаете.

Демоны

Это проверенный и проверенный способ запуска сервисов в Linux. Единственная проблема здесь в том, что это 1 thead в PHP на демона. Таким образом, вы должны зарегистрировать несколько демонов для увеличения масштаба. С учетом вышесказанного, эта опция хорошо работает с многопоточной библиотекой выше.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]