Реализация кросс-поточных / процессных очередей в Perl - PullRequest
1 голос
/ 10 ноября 2009

Каков наиболее эффективный способ реализации очередей для чтения другим потоком / процессом?

Я думаю об использовании базовой таблицы MySQL с опросом во сне. Это звучит как наиболее масштабируемый (даже не обязательно на том же сервере), но потенциально может привести к слишком большому количеству запросов к БД.

Ответы [ 3 ]

3 голосов
/ 10 ноября 2009

У вас есть несколько вариантов, и это действительно зависит от того, что вы пытаетесь заставить систему делать.

  • fork дочерние процессы и интерфейс с использованием соединений их каналов stdin / stdout.
  • создать именованный канал в файловой системе, например /tmp/mysql.sock. Это в основном использует сокеты для связи между процессами.
  • Настройка брокера сообщений. Я бы рекомендовал попробовать ActiveMQ и использовать клиент Stomp для Perl . Это, вероятно, ваше самое масштабируемое решение.
2 голосов
/ 10 ноября 2009

В PostgreSQL вы можете использовать комбинацию NOTIFY / LISTEN, после запуска LISTEN (s) потребуется только ожидание в сокете соединения PG.

2 голосов
/ 10 ноября 2009

Это одна из тех вещей, которую легко написать себе в точных спецификациях. Я написал игрушку здесь:

http://github.com/jrockway/app-queue

Я не уверен, что он больше компилируется, поскольку AnyEvent :: Subprocess значительно изменился с тех пор, как я его написал. Но вы можете украсть идеи.

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

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

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