Rails Queue Management - PullRequest
       25

Rails Queue Management

1 голос
/ 06 июня 2011

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

Я смотрю в resque, но у меня возник общий вопрос о дизайне таких проблем, как эта. Итак, если у меня есть работа, которая потенциально может составлять 5-20 млн. Единиц работы, каков наилучший способ хранения очереди? Например, я мог бы теоретически разделить работу на части и сохранить ее, а затем создать работу для этого блока, или я мог бы иметь 5-20 миллионов отдельных позиций в очереди. Казалось бы, в работе, которую нужно извлечь / восстановить, много накладных расходов. Но есть и дополнительные издержки, и больше кода, чтобы попытаться разделить работу на части.

1 Ответ

1 голос
/ 07 июня 2011

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

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

Мы часто видим срезы на мелкозернистом уровне, но затемувидеть каждого работника, работающего над разумным набором задач.Мы обнаружили, что выполнение каждым рабочим нескольких задач (20–1000? В зависимости от типа / длины задачи) обеспечивает хороший баланс между:

  • оптимизацией настройки (например, установлением соединения с базой данных)
  • обеспечение хорошего самоанализа в заданиях
  • , что делает повторные попытки и обработку исключений более управляемыми

Вы бы хотели, чтобы время обработки для каждого работника было в минутах, какВ отличие от длительных задач, вы можете лучше видеть производительность работника и повторные попытки влияют только на ограниченный объем рабочего пространства.Использование NoSQL-решения (особенно базы данных как услуги, такой как MongoHQ или MongoLabs) может позволить вам легко отслеживать и управлять работой в чанках и в процессе.

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

(Полное раскрытие: я в команде вIron.io, производитель IronMQ, IronWorker и IronCache.)

...