2016-02-16 4 views
0

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

Причина, по которой вы оставите окончательный процесс сама по себе, состоит в том, что 3 других процесса могут пройти переменное время, поэтому я хочу, чтобы каждый из них передавал данные в окончательный, как только он выполнил свое задание в чтобы избежать потери времени, и я не хочу, чтобы несколько процессов записывали БД одновременно. Но для этого каждый процесс должен знать, занят ли последний процесс или нет, и в случае, если он доступен, отправляйте свои данные, иначе дождитесь его завершения перед отправкой. Моя идея - использовать «когда-либо» драгоценный камень и создать 3 процесса, которые будут выполняться сами по себе, но я озадачен последним, поскольку я мало знаю о демонах и т. П., И я знаю, что могу сделать все из этого гораздо сложнее, чем на самом деле.

Любое предложение приветствуется, спасибо.

+1

FYI: Ваша проблема звучит как намерение, которое у меня было. Чтобы избежать большого количества запросов на параллельный db-запись, я использовал драгоценный камень sidekiq. – guitarman

ответ

1

Так что я думаю, что я могу дать некоторое представление о вашей проблеме. Моя команда разработчиков использует домашний почтовый сервер, который поддерживается нашей базой данных. Это означает, что сообщения (метаданные задания) хранятся в нашей таблице messages.

Теперь наше приложение для рельсов создает процесс демона с использованием драгоценного камня daemons. Это упрощает создание процессов-демонов. Нет необходимости бояться того, что происходит с процессами daemo; это просто процессы linux/unix, которые работают в фоновом режиме.

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

Чтобы избежать этой проблемы, вы можете использовать row-level locking для своей таблицы сообщений. Таким образом, демонам не нужно блокировать всю таблицу каждый раз, когда она хочет увидеть, есть ли какие-либо задания для сбора.

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

Например: работник А закончил свою работу, поэтому он пишет специальное сообщение special_messages_table. Рабочие B и C завершают задачу, а также записывают в эту таблицу. Теперь, когда все эти демоны обрабатываются, ваш третий демон будет опросить special_messages_table, чтобы узнать, завершена ли какая-либо комбинация этих трех заданий. Как только он обнаружит, что у них есть, он может начать.

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

+0

Спасибо, это очень полезно, и то, что я искал! Вы также правы, полагая, что я пытаюсь избежать проблем с блокировками, и я буду смотреть дальше на блокировку на уровне строк. Я попробую использовать метод special_message_table, поскольку он, кажется, соответствует именно тому, что мне нужно! Thak you again, я дам вам знать, если я, наконец, преодолею страх перед демонами! : D – Jack

+0

Отличный @ Jack, рад, что я мог бы помочь.Следует также упомянуть, что использование очереди сообщений с поддержкой базы данных недостаточно хорошо масштабируется, и если вашему приложению когда-либо нужно резко масштабировать, я рекомендую Sidekiq или RabbitMQ. – FluffyKittens

+0

Спасибо, я буду помнить об этом! Я бы спросил у вас еще одно уточнение, могу ли я: в чем разница между процессом, выполняемым sidekiq или когда-либо и демоном? Разве они не работают в фоновом режиме как разные процессы? Я пытаюсь понять, какие преимущества принесет каждое решение в моем случае. Еще раз спасибо! – Jack

Смежные вопросы