Исходя из того, что мы сделали и увидели, хорошим подходом является разделение работы на части во время выполнения, а не ранее.Другими словами, шаблон «ведущий / ведомый», который управляется событием или временем, когда мастер разделяет пространство работы / данных на гранулированные задачи / блоки, когда он ставится в очередь и запускается.
Причина этого в том, что просмотр заданий в расписании намного проще, когда выполняется на уровне грубого зерна.На этом уровне задания соответствуют единицам, которые вы отслеживаете (например, веб-страницы, профиль пользователя или потоковые данные с датчика).
Мы часто видим срезы на мелкозернистом уровне, но затемувидеть каждого работника, работающего над разумным набором задач.Мы обнаружили, что выполнение каждым рабочим нескольких задач (20–1000? В зависимости от типа / длины задачи) обеспечивает хороший баланс между:
- оптимизацией настройки (например, установлением соединения с базой данных)
- обеспечение хорошего самоанализа в заданиях
- , что делает повторные попытки и обработку исключений более управляемыми
Вы бы хотели, чтобы время обработки для каждого работника было в минутах, какВ отличие от длительных задач, вы можете лучше видеть производительность работника и повторные попытки влияют только на ограниченный объем рабочего пространства.Использование NoSQL-решения (особенно базы данных как услуги, такой как MongoHQ или MongoLabs) может позволить вам легко отслеживать и управлять работой в чанках и в процессе.
Другая рекомендация заключается в созданииработники, которые не зависят от вашей прикладной среды.Это означает, что каждый работник должен быть достаточно автономным, а также использовать обратные вызовы, флаги базы данных и другие асинхронные подходы.Это может быть немного больше работы, но так же, как дизайн приложения MVC, это дает вам большую гибкость и позволяет распределять работу по системам эластичного рабочего.
(Полное раскрытие: я в команде вIron.io, производитель IronMQ, IronWorker и IronCache.)