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

#ruby #distributed #distributed-transactions #daemons

#ruby #распределенный #распределенный-транзакции #демоны

Вопрос:

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

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

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

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

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

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

Ответ №1:

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

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

Комментарии:

1. В настоящее время я использую драгоценный камень демонов ruby(github.com/mikehale/daemons ). Что я делаю, так это проверяю, сколько экземпляров запущено, и передаю параметры с ОГРАНИЧЕНИЕМ и СМЕЩЕНИЕМ каждому экземпляру демона. Итак… если мне нужно отправить 1000 электронных писем, каждый экземпляр daemon выбирает разные 100 строк базы данных. Но иногда я получаю строку или электронное письмо, доставленное 2 или 3 раза. Это означает, что 2 экземпляра демона выбирают одни и те же строки базы данных.

2. Я понимаю, в чем ваша проблема. Я пытаюсь сказать, что вам не следует тратить свое время на разбор этой логики. Люди уже потратили сотни часов своего времени на создание библиотек, которые отлично подходят для обработки фоновых заданий. Вы должны сосредоточиться на самих заданиях. При этом я уверен, что вы только что столкнулись с ошибкой в вашем SQL.

3. Спасибо за ваш ответ… Сейчас я просматриваю Resque, чтобы узнать, как это может улучшить мое приложение… большое спасибо

4. Bloudermilk, я не думаю, что использование Resque было бы лучшим вариантом для меня, поскольку мне нужно контролировать поток доставки электронной почты, выбирая некоторые строки, но не другие. Если я использую Resque, у меня не было бы способа выбирать только нужные строки, как я делаю в MYSQL. Правильно?

5. @NewtonX невозможно сказать, не зная больше о вашем приложении. Оцените Resque, DelayedJob и другие решения, чтобы выяснить, что лучше для вашего приложения. При необходимости задавайте новые вопросы, не нужно поднимать этот поток.