Какие доступные решения для сообщений существуют для межпроцессного взаимодействия в ruby? - PullRequest
5 голосов
/ 09 июня 2011

У меня есть приложение rails, использующее delayed_job.Мне нужны мои задания, чтобы общаться друг с другом для таких вещей, как «задача 5 выполнена» или «это список того, что нужно обработать для задачи 5».

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

Неужели ячто-то упустили?

уточнение: Я не ищу новую систему очередей, я ищу способ для фоновых задач общаться друг с другом.В основном просто безопасно разделяемые переменные.Предлагают ли нижеприведенные рамки этот объект?Обидно, что отложенная работа не выполняется.

use case:"выполнить эти 5 задач параллельно, а затем, когда все они будут выполнены, выполнить эту 1 последнюю задачу".Итак, каждая из 5 задач проверяет, является ли она последней, и, если это так, запускает последнюю задачу.

Ответы [ 3 ]

3 голосов
/ 09 июня 2011

Я использую resque .Также существует множество плагинов , которые должны упростить обмен данными между процессами.

Использование redis имеет еще одно преимущество: вы можете использовать каналы pub-sub для связи между работниками / службами.

Другой подход (но не проверенный мной): http://www.zeromq.org/,, который также имеет привязки рубина .Если вы хотите протестировать новый материал, попробуйте zeromq.


Обновление

Чтобы уточнить / объяснить / расширить мои комментарии выше:

Почему я должен переключаться с DelayedJobs на Resque - это упомянутое преимущество, что у меня есть очередь и сообщения в одной системе, потому что Redis предлагает это.

Другие источники:

Если бы мне пришлось остаться на DJ , я бы продлилрабочие классы с redis или zeromq / 0mq (только примеры здесь) для получения сообщений в моих существующих фоновых заданиях.

Я бы не попробуйте обмен сообщениями с ActiveRecord / MySQL ( на самом деле даже не с очередями! ), потому что эта БД не самая эффективная система для этого случая использования, особенно если в приложении слишком много фоновых рабочих и огромныхочереди и бесчисленные обмены сообщениями в короткие сроки.

Если это небольшое приложение с меньшим количеством работников, вытакже может реализовать простой обмен сообщениями через БД, но и здесь я бы предпочел memcache;сообщения - это короткий блок данных, который может обрабатываться только в оперативной памяти.

Общие переменные никогда не будут хорошим решением.Подумайте о нескольких машинах, на которых могут жить ваше приложение и ваши работники.Как бы вы обеспечили передачу переменных сохранения между ними?

Хорошо, кто-то может упомянуть DRb (распределенный рубин), но, похоже, он больше не используется.(пока еще не видел реального примера)

Если вы хотите поиграть с DRb, прочитайте это краткое введение .

Мой личный порядок предпочтений: Сообщения (real)> Обмен сообщениями через базу данных> Совместное использование переменных

2 голосов
/ 09 июня 2011
0 голосов
/ 02 декабря 2015

Вы можете использовать Трубы:

reader, writer = IO.pipe

fork do
  loop do
    payload = { name: 'Kris' }
    writer.puts Marshal.dump(payload)
    sleep(0.5)
  end
end

loop do
  begin
    Timeout::timeout(1) do
      puts Marshal.load(reader.gets) # => { name: 'Kris' }
    end
  rescue Timeout::Error
    # no-op, no messages to receive
  end
end
  • В одну сторону
  • Считать как поток байтов

Трубы выражаются в виде пары, aчитатель и писатель.Для двусторонней связи вам понадобятся два набора труб.

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