Ночное пакетное сетевое задание на Heroku - PullRequest
4 голосов
/ 08 февраля 2012

Мы работаем над проектом Rails для Heroku, который должен обрабатывать и обрабатывать данные каждую ночь для каждого пользователя. Это требует много доступа в Интернет на пользователя, и мы надеемся, что сможем поддерживать десятки тысяч пользователей. Несмотря на то, что при анализе, расчете и записи в базы данных требуется немало времени, мы ожидаем, что большая часть времени будет затрачена на ожидание данных из сети.

Каков наилучший общий подход к выполнению этой задачи при минимизации времени на настенные часы и сборов Heroku? Очевидно, что потребуется параллельное или асинхронное сетевое взаимодействие, чтобы воспользоваться временем, затраченным на ожидание сети, но как нам быть с этим? Мы думаем в терминах очереди на базе базы данных с разветвленными рабочими процессами, но это может быть не лучшим подходом или даже невозможным в Heroku.

Ответы [ 2 ]

7 голосов
/ 12 февраля 2012

Heroku поддерживает отложенное задание , я бы начал там. Затем вы можете сделать следующее:

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

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

Если вы обнаружите, что каждая работа тратит слишком много времени на ожидание работы сети, взгляните на eventmachine . Задания - это просто рубиновый код, поэтому вы можете выполнять любые трюки с распараллеливанием, которые вам здесь нужны, Heroku не должен вас никоим образом ограничивать.

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

Вы можете обнаружить, что 1 работа / пользователь не имеет смысла, и что вам нужно n работ на пользователя (одна работа на свойство или что-то в этом роде). Не зная вашего точного варианта использования, трудно сказать заранее, поэтому я предполагаю 1-1 сопоставление.

Следует также отметить, что новый стек Heroku поддерживает системы очередей, отличные от отложенного задания (прокрутите вниз).

2 голосов
/ 18 февраля 2012

Задержка - это здорово, я рекомендую это от всей души.Добавьте драгоценный камень HireFire, чтобы сделать его еще лучше - этот драгоценный камень автоматически увеличивает число рабочих процессов при накоплении невыполненных заданий и отключает рабочих, когда не нужно выполнять никаких заданий.Однако, если вы используете HireFire, не планируйте выполнение заданий в будущем - просто ставьте их в очередь, когда вы хотите, чтобы они выполнялись, возможно, в грабли, выполняемой дополнением Heroku Cron.(HireFire не запустит рабочие процессы правильно, если вы попытаетесь запланировать задания на будущее.)

Вы можете настроить максимальное количество работников, которое будет использовать HireFire, и то, как оно добавляет работников в качестве невыполненного задания.рабочие места растет.Это позволяет очень легко масштабировать.Вам нужно будет выбрать подходящий «размер зерна» для ваших заданий очистки / разбора (сколько сотен или тысяч пользователей должно быть обработано за одно задание).Затем внутри задачи Cron разделите всех пользователей на группы соответствующего размера, поставьте в очередь фоновое задание для каждой группы и дайте HireFire запустить соответствующее количество рабочих процессов, чтобы быстро завершить все задания.

Этодо сих пор остается проблема минимизации затрат на динамочасНедавно я столкнулся с той же проблемой на сайте Rails, который я создавал ...

Сайт извлекает данные из различных веб-сервисов, используя delayed_job фоновых рабочих.Я получил увеличение производительности почти в 10 раз для этого задания извлечения данных, запустив несколько HTTP-запросов параллельно, используя утилиту параллельного преобразования карт, которую я построил сам.

Я намерен еще немного поработать над этимВнедрение map-уменьшает, но если вы хотите использовать его сейчас, добро пожаловать: https://github.com/alexdowad/showcase/blob/master/ruby-threads/threads.rb

Чем выше ваше соотношение времени ожидания / обработки, тем больше вы выиграете.Дайте мне знать, если вам нужен пример кода фоновой работы, который использует эту утилиту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...