Как я могу распределить задачу между многими процессами в Ruby? - PullRequest
0 голосов
/ 27 апреля 2011

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

Чтобы сделать это быстрее, я обычно создаю 3 экземпляра одного и того же демона.И каждый из них выбирает разные данные, используя mysql LIMIT и OFFSET.

. Проблема в том, что иногда задача выполняется 2 или 3 раза с одной и той же записью данных.

Так что ядумаю, что доверия только к базе данных LIMIT и OFFSET недостаточно ... поскольку 2 или более демона могут иногда собирать одни и те же данные одновременно.

Как я могу сделать это безопасно?Избегание 2 экземпляров для выбора одинаковых данных

  • Демон 1 => выбирает записи от 1 до 100
  • Демон 2 => выбирает записи от 101 до 200
  • Демон3 => выбирает записи от 201 до 300

1 Ответ

3 голосов
/ 27 апреля 2011

Вместо того, чтобы использовать собственное решение, вы можете посмотреть на существующие решения для обработки фоновых заданий, например Resque (личный фаворит).С Resque вы поставили бы в очередь задание для каждой из ваших строк, используя триггер, который имеет смысл в вашем приложении (трудно сказать без контекста), например, ссылку на вашем сайте.Вы всегда будете поддерживать количество рабочих X (трое в вашем случае), а Resque выполнит работу по управлению очередью за вас.Resque использует Redis в качестве бэкэнда, поэтому он поддерживает атомарный push / pop из шлюза (не более двойной обработки).

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

...