Re: Oracle AQ - костыли и альтернативы
От: Vladimir Alekseev  
Дата: 23.10.15 13:58
Оценка:
Здравствуйте, Neco, Вы писали:

N>Появилась задача реализовать наколенную ESB по-быстрому, а частью ESB является реализация очередей (queues). В качестве хранилища имеется либо файловая система, либо Oracle. Файловую систему я сразу отбросил, начал с реализации на оракле в виде таблиц.


Есть ли реальная необходимость "забирать" задачи из очереди в БД напрямую из worker'ов? Почему бы не сделать отдельный поток/процесс, который выбирает в себя весь список задач (список id), которые нужно выполнить, а всем worker'ам выдавет id следующей задачи по запросу "Дай мне следующую задачу"? В случае многопроцессовой реализации это, возможно, выльется в написание некого сервиса, а в случае многопоточной реализации — в простой "Queue<Task>". Для отметки того, что задача выполнена и удаления ее из таблицы-очереди — делается обратная процедура — запрос "Пометить задачу как выполненную" к сервису или обратный Queue<TaskId> для многопроцессовой/многопоточной реализации соответственно.

Побочный эффект — некая задача может быть передана worker'у дважды, если программа упала после того, как она была выполнена в первый раз, но до того, как была удалена из очереди. Но с этим, ИМХО, бороться проще, чем с зависанием задачи если worker ее заблокировал и упал.

Имел опыт реализации подобных вещей и описанный мной вариант оказался проще, чем Oracle AQ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.