Мне нужно реализовать систему честной очереди, чтобы сообщения обрабатывались циклически, на основе значения некоторого заголовка сообщения для всех значений этого заголовка для сообщений, находящихся в настоящее время в очереди.Возможна ли «справедливая очередь» с помощью JMS
Сообщения в системе естественно сгруппированы по некоторому свойству, из которых существует много тысяч возможных значений, а набор значений для входящих в настоящее время сообщений изменяется со временем. Аналогами были бы сообщения с заголовком, который является миллисекундной частью времени, во время создания сообщения. Таким образом, заголовок будет иметь значение от 0 до 999, и будет некоторое распределение значения для всех сообщений, находящихся в настоящее время в очереди.
Мне нужно иметь возможность потреблять сообщения в таком порядке, чтобы никакое другое значение не было приоритетным по сравнению с любым другим. Если значения заголовка из очереди сообщений распределены таким образом
value | count
------|-------
A | 3
B | 3
C | 2
Тогда порядок потребления будет A,B,C,A,B,C,A,B
.
Если в очередь добавляются сообщения с другим значением, они должны автоматически добавляться в циклическую последовательность.
Это подразумевает некоторые знания о текущих сообщениях в очереди, но не требует, чтобы знания были сохранены потребителем; у брокера могут быть механизмы для порядка доставки.
Допустимо, что существует некоторый порог, за которым начинается честная очередь. Это означает, что если порог равен 10, то приемлемо последовательно обрабатывать 10 сообщений с одинаковым значением, но обрабатываемое 11-м сообщение должно быть в следующем порядке: следующее значение. Следующий может быть одним и тем же значением, если только сообщения с очередью имеют это значение.
Число возможных значений, вероятно, исключает просто создание очереди для каждого и повторение очередей, хотя это еще не было проверено.
Мы используем HornetQ, но если есть альтернативы, которые предоставляют эту семантику, я бы с удовольствием узнал.
Сообщения являются заданиями, а значения заголовка являются идентификаторами пользователей. То, что ищутся, заключается в том, что в некоторых пределах никакие задания от любого конкретного пользователя не будут задерживать работу от любого другого пользователя; Пользователь, производящий 1 миллион рабочих мест, не приводит к тому, что последующие задания от других пользователей ждут обработки этого миллиона рабочих мест.
Потребители в очередях в HornetQ оцениваются в порядке создания, поэтому добавление выборочного потребителя в очередь не будет препятствовать тому, чтобы все пользователи-пользователи могли получать сообщения, соответствующие фильтру.
Группы JMS, похоже, не помогают, поскольку это связывает данную группу (пользователя?) С данным потребителем.
Потенциальное решение создает выборочные потребители по теме, основанной на спросе (например, 10 последовательных сообщений от одного и того же пользователя), с чем-то управляющим жизненным циклом всех выборочных потребителей, чтобы гарантировать, что уловки не обрабатывают одинаковые сообщение. Хотя это возможно, похоже, имеет некоторые обременительные требования к синхронизации.
Предполагаю ли вы из ваших примеров, что FIFO не является вариантом по умолчанию? Это только потому, что может быть пользователь, который генерирует ненормальный всплеск запросов? Является ли этот пользователь предсказуемым? Должны ли они иметь собственную очередь/тему для отдельной обработки? Очевидно, что нет сообщений о неявной последовательности сообщений, так как вы можете обрабатывать их не по порядку (пользователем в вашем примере), так что многопоточная служба чтения не будет работать? – Omertron