ActiveMQ: как отправить одну и ту же группу сообщений в одну потребительскую ветку - PullRequest
0 голосов
/ 01 марта 2020

Мы используем ActiveMQ, в нашем проекте есть требование, чтобы группа сообщений, принадлежащая одной группе, использовалась одним потребительским потоком.

Например, у нас есть 3 (M1, M2, M3 ) сообщения, принадлежащие лицу A и 3 (M4, M5, M6) сообщения, принадлежащие лицу B.

Наше требование: все сообщения принадлежат лицу A, должны быть использованы потоком 1 потребителя, и все сообщения принадлежат человек B должен быть поглощен потребительским потоком 2.

На основании документации ActiveMQ и, по нашему мнению, мы использовали концепцию JMXGroupId в ActiveMQ. Например, мы установили JMSXGroupId как 123 для всех сообщений (M1, M2, M3), принадлежащих человеку A, и 234 для всех сообщений (M4, M5, M6), принадлежащих человеку B.

С JMXGroupId в некоторых случаях все сообщения, принадлежащие человеку A & B (M1, M2, M3, M4, M5 и M6), отправляются в один и тот же потребительский поток 1. Но по нашему требованию оно должно идти к двум различным нити.

1 Ответ

0 голосов
/ 01 марта 2020

Похоже, что этот вопрос обсуждался ранее в списке рассылки ActiveMQ. Это обсуждение привело к этой проблеме , и, похоже, решение этой проблемы заключается в отправке сообщения со свойством JMSXGroupSeq, значение которого -1. Как указано в Jira:

Ключом к перебалансированию, теперь, когда групповая загрузка является частью приоритета потребителя, является периодическое окончание c группы с использованием свойства отрицательного порядкового номера. message.setIntProperty ("JMSXGroupSeq", -1);

К сожалению, существует проблема с этой реализацией, которая обобщена на эта проблема . Об этой проблеме было сообщено в конце 2010 года (т. Е. 10 лет или go сейчас), и, похоже, с тех пор ничего не было сделано для ее решения.

Поэтому я вижу для вас три различных варианта:

  1. Исправьте проблему в ActiveMQ кодовой базе самостоятельно. Это одно из больших преимуществ программного обеспечения с открытым исходным кодом - вы можете исправлять ошибки и реализовывать нужные вам функции, не ожидая никого другого.
  2. Перейти к ActiveMQ Artemis , который уже поддерживает эта функция, как отмечено в документации . ActiveMQ Artemis является брокером следующего поколения от ActiveMQ и должен стать ActiveMQ 6, когда он достигнет достаточного паритета функций. ActiveMQ Artemis поддерживает все те же протоколы, что и ActiveMQ 5.x, поэтому вам не нужно менять ни одного из ваших клиентов.
  3. Отключите группировку сообщений и просто используйте селекторы на ваших потребителях. Например, каждое сообщение, принадлежащее лицу 1, может иметь свойство с именем personIndex со значением 1, и потребитель, который должен получать эти сообщения, может использовать селектор, такой как personIndex = 1, и тогда каждое сообщение, принадлежащее человеку 2, может иметь свойство с именем personIndex со значением 2, и потребитель, который должен получать эти сообщения, может использовать селектор, например personIndex = 2.
...