Работа с наборами очередей

Wicked

Новичок
Работа с наборами очередей

Всем известно, что такие структуры данных как деревья (двоичные, b-tree, и т.д.), кучи и т.д. вполне пригодны для хранения приоритезированных очередей и позволяют делать быстрые вставки и выборки.

Рассмотрим более общий случай:
Допустим, у нас есть несколько именованных очередей: q1, q2, q3, ... Как в memcacheq.

У нас также есть разборщики очередей, которые могут каждый раз хотеть наиболее важную задачу:
а) из некоторого заранее неизвестного набора очередей - худший случай;
б) из некоторого заранее известного набора очередей (например, всегда выбирает выбирает либо из (q1, q2), либо из (q3, q4), либо из (q1, q5)) - лучший случай; Удобно об этом мыслить в терминах тегов для очередей.

Но пока что известные мне стратегии выбора наиболее приоритетной задачи из множества очередей сводятся к простому перебору: мы смотрим на самую приоритетную задачу в каждой из очередей и из них выбираем нужную. Это довольно неплохо на практике в случае, когда:
1) кол-во очередей, участвующих в выборках - мало, даже если самих очередей - туча.
2) техническая реализация сервера очередей позволяет делать такое атомарное действие. В том же memcacheq, насколько я понимаю, если мы сделаем мультигет, он выберет по топовой задаче из каждой очереди, и удалит их у себя.

Если говорить о выборки из тегов, то мне даже видится следующее возможное улучшение: каждый тег тоже может представлять из себя вспомогательную приоритезированную очередь ("очередь тега") с кол-вом задач = сумме кол-в задач во всех "оригинальных очередях", отмеченным этим тегом. Каждая их задач в "очереди тега" имеет приоритет задачи из оригинальной очереди и содержит в себе только имя оригинальной очереди. Т.е. процесс выборки топовой задачи из тега сводится к:
1) выбрали топовую задачу из очереди тега.
2) из нее поняли, из какой оригинальной очереди нужно выбрать задачу с детальным описанием.
3) выбрали топовую задачу из той оригинальной очереди.
Еще теги можно реализовать с помощью куч, тогда оверхед по месту будет вообще несущественным, просто нужно будет их как-то перезаполнять. Но остается проблема с поддержанием целостности между очередями тегов и основными очередями, т.е. такое должен уметь делать сам сервер очередей.

Собственно вопросы:
1) может быть существует какая-нибудь структура данных именно для быстрой работы с наборами очередей? На ум приходит что-то типа r-tree, но вот именно она не годится. Моих знаний пока не хватает, но постараюсь найти и сам :)
2) знаете ли вы какие-нибудь open-source проекты, где были бы решены подобные проблемы?
 

Alexandre

PHPПенсионер
знаете ли вы какие-нибудь open-source проекты, где были бы решены подобные проблемы?
rabbitmq там реализованы приоритеты очередей
есть также есть ZMQ & ActiveMQ
ну и погуглить ;)
в настоящее время заканчиваю (вернее делаю 2ю версию) php_aqpm (враппер дл РНР - пока без приоритетов, но это прикрутить не долго), еще в разработке ngx_aqpm (50% готовности)
в ближайшее время выложу в Гоогле коде.
Планировал подготовить доклад, но тема видно не актуальна для большинства, да и приехать на Конфу в этом году не смогу по этому особо и не вылезал с докладом: http://phpclub.ru/talk/showthread.php?postid=863271#post863271

-~{}~ 19.08.09 18:09:

упсс...
спросил у техподдержки, оказывается поддержка приоритетов только пока планируется (в протоколе AMQP она присутствует, в API поддерживается).

как вариант - можно создать несколько очередей с приоритетами: Q1 Q2 Q3...
и обрабатываем их по приоритетам:
сперва читаем сообщения из Q1 потом из Q2, etc....

а пишем сообщения в один обмен с разными ключами:
queue.1, queue.2 & queue.3 etc... а сервер сам их биндит по очередям в соответсвии с ключами:
key=queue.1 -> Q1
key=queue.2 -> Q2
key=queue.3 -> Q3
etc...

-~{}~ 19.08.09 18:21:

Т.е. процесс выборки топовой задачи из тега сводится к:
1) выбрали топовую задачу из очереди тега.
2) из нее поняли, из какой оригинальной очереди нужно выбрать задачу с детальным описанием.
3) выбрали топовую задачу из той оригинальной очереди
сделай трехуровневый ключ: tag.task.prty - есть несколько путей решения этой задачи... какой оптимальнее - надо эксперементировать,
думаю, что первоночально необходимо поизучать AMQP, чтоб понять с чем его едят, чтоб у меня не получился разговор глухого со слепым . Будет желание повозится с очередями, выложу РНР-модуль в общий доступ.

вообще функционал AMQP на порядок шире memcachemq & XMPP
 
Сверху