2016-09-22 7 views
1

Можно ли создавать несколько заданий с работы, чтобы рабочие могли работать на любых вакантных рабочих местах?Установка beanstalk с несколькими рабочими очередями: задания, которые порождают другие задания

В настоящее время мой настрой такой. У меня есть 20 рабочих, ожидающих, что любые рабочие места будут оттеснены. Одна из заданий - отправить iOS push-уведомление, проблему с iOS, вы не можете отправлять массовые сообщения.

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

Сценарий: если в одной теме есть 1000 пользователей, я должен получить всех 1000 пользователей и их устройств, а затем начать отправку на каждое устройство. Это подтолкнуло бы новую работу к моей очереди, и один работник подберет ее, а остальные рабочие будут свободны и будут ждать новых рабочих мест. Что делать, если никакие рабочие места не будут доступны в течение определенного времени, Работник 1 должен был выполнить всю работу, затем

Что я сейчас работаю. Безопасно ли, если бы эта одна большая работа, вместо этого создавали бы другую работу, чтобы другие работники, которые являются вакантными, могли забрать ее и выполнить эту работу?

P.S Все работы выполняются в 1 трубе.

ответ

1

Это звучит вполне разумно для меня, распространяя нагрузку среди ряда рабочих.

Есть некоторые вещи, о которых я буду относиться осторожно - например, задание соответствующего приоритета. Если задача, которая создала десятки или сотни других задач, имеет более высокий приоритет, чем задание, которое фактически выполняет отправку, тогда вы быстро получите потенциально сотни тысяч рабочих мест, но рабочие могут не запускать их, и поэтому очередь заполнять.

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

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

Я бы также поставил новые группы рабочих мест в новую трубку (запуск десятков трубок не дорого). Вы можете смотреть сразу несколько трубок (получение «самой важной» работы у кого-либо из них), но вы не можете считать разные типы работ в одной трубе, поэтому разделение типов на разные очереди позволяет вам легко видеть сколько заданий каждого типа запущено. Таким образом, если процессы отправки наращиваются, вы можете замедлить создание заданий разделения на некоторое время или пометить их как еще более низкий приоритет на некоторое время.

И, наконец, чтобы сохранить преимущество над выполнением пакетных заданий и избежать некоторых накладных расходов, я бы, вероятно, разделил задания от 1000 + -off на пакеты, возможно, 25-50 уведомлений на одно задание.