2015-10-06 5 views
4

Я знаю, что драйверы очереди Laravel, такие как redis и beanstalkd, и я читал, что вы можете увеличить количество рабочих для beanstalkd и т. Д. Однако я просто не уверен, что эти решения подходят для мой сценарий. Вот что мне нужно;Выполнение асинхронных заданий в фоновом режиме (laravel)

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

Я прочитал данные из этого сокета по строкам, и как только я доберусь до тега закрытия XML, я отправлю буфер другому анализируемому процессу. Я просто кодировал xml в base64 и запускал отдельный процесс php для каждого xml. shell_exec('php parse.php' . $base64XML);

Это позволило мне быстро разобрать эти бесконечные xml-данные. Вид ручного нарезания резьбы. Теперь я хотел бы использовать те же функции с Laravel, но мне интересно, есть ли лучший способ сделать это. Я считаю, что Artisan :: call ('command') не выводит его на задний план. Конечно, я мог бы сделать shell_exec в Laravel, но я хотел бы знать, могу ли я извлечь выгоду из Beanstalkd или аналогичного решения.

Итак, настоящий вопрос: Как установить количество рабочих очередей для beanstalkd или redis драйверов? Как и 20 потоков, работающих одновременно. Больше, если это возможно.

Немного менее важный вопрос: Сколько потоков слишком много? Если бы у меня был высокопроизводительный выделенный сервер, который мог бы обрабатывать нагрузку просто отлично, создало бы 500 потоков/рабочих с помощью этих инструментов, чтобы вызвать какие-либо проблемы на уровне кода?

ответ

6

Ну ларавельные очереди просто созданы для этого.

Основой, вы должны создать Job Class. Вся тяжелая работа, которую вы хотите сделать в вашем XML-документе, должна быть здесь. Затем вы извлекаете xml из гнезда и как только вы получили один документ, you push it on your Queue.

Позже работник очереди выберет его из очереди и выполнит тяжелую работу.

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

Я также не рекомендую вам делать это без очереди (с вилкой, как и вы). На самом деле, если придет слишком много документов, вы создадите слишком много потоков childs и перегрузите свой сервер. Бухгалтерия этих потоков правильно рискованна и не стоит того, когда простая очередь с фиксированным числом работников решает все эти проблемы из коробки).

+0

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

+3

Работник базовый экземпляр php, выполняющий команду php artisan queue: слушайте, как указано здесь: http://laravel.com/docs/5.1/queues#running-the-queue-listener Если вы используете только одну команду, один рабочий, если вы запустите два, у вас есть два работника и т. д. ... Я рекомендую что-то вроде Супервизора или Формана, чтобы управлять тем количеством процессов, которые вы создаете. – Atrakeur

0

После небольшого исследования я нашел how to set the number of worker processes. Я пропустил эту часть документации. Дурак я. Мне все еще интересно, может ли этот инструмент супервизора обрабатывать сотни рабочих для таких ситуаций, как мой. Надеюсь, кто-то может поделиться своим опытом, но если нет, я буду обновлять этот ответ, как только я сделаю тест производительности на этой неделе.

0

Сообщаю вам, что shell_exec() не является идеальным способом запуска асинхронных задач в PHP. Кажется, что при разработке, но если у вас небольшой vps (1-2 ГБ оперативной памяти), вы можете перегрузить ваш сервер, а apache/nginx/sql/что-то может затормозить, пока вас нет, и ваш сайт может быть недоступен часами/дней.

Я рекомендую Laravel Queues + Scheduler для такого рода вещей.