История изменений
Исправление Absurd, (текущая версия) :
Вообще я похоже писал похожую систему лет 5 назад. Там очередью служила оракловая таблица, в которую новые задания добавлялись при помощи простого insert-а. Треды-рабочие ее разгребали не по одному а сразу по MIN(queue_size, 50) штук. Там в оракле можно писать запросы вида update Job set Status='PENDING' where Status='NEW' and RowNum <50 bulk collect into OutputArray c последующим возвратом этого OutputArray в виде резалтсета. Тред получал эксклюзивную копию этих 50 штук джобов и дальше работал с ними без блокировок. Таким образом количество блокировок на один джоб снижалось в 50 раз.
Исходная версия Absurd, :
Вообще я похоже писал похожую систему лет 5 назад. Там очередью служила оракловая таблица, в которую новые задания добавлялись при помощи простого insert-а. Треды-рабочие ее разгребали не по одному а сразу по MAX(queue_size, 50) штук. Там в оракле можно писать запросы вида update Job set Status='PENDING' where Status='NEW' and RowNum <50 bulk collect into OutputArray c последующим возвратом этого OutputArray в виде резалтсета. Тред получал эксклюзивную копию этих 50 штук джобов и дальше работал с ними без блокировок. Таким образом количество блокировок на один джоб снижалось в 50 раз.