Потребители AMQ выбирают, какую очередь обрабатывать

Учитывая следующий сценарий:

У меня есть система, которая создает, обновляет и удаляет записи. Для каждого из этих действий мне нужно что-то сделать (скажем, записать события в журнал в качестве глупого примера), однако мне нужно обработать эти события для каждой записи по порядку - это означает, что я не могу зарегистрировать удаление, пока не сделаю create или любое из предыдущих обновлений. Я также не могу зарегистрировать обновление, пока не зарегистрирую создание.

Я исследую очереди, чтобы сохранить последовательность. Однако я действительно не хочу, чтобы RecordID_2 задерживался за RecordID_14. Записи не нужно обрабатывать последовательно, в отличие от действий над каждой записью. Следовательно, я не думаю, что могу / должен использовать одну очередь.

Поскольку у меня нет сотен активных записей RecordID_XX одновременно, я думал о наличии очереди для каждого RecordID_XX, поэтому, если для этого одного RecordID может быть несколько обновлений, каждое событие для этой записи будет добавлено в ту же очередь и обработано. по порядку (т. е. сначала создание, обновление_1 после завершения создания, обновление_2 обрабатывается после завершения обновления_1 и т. д.), однако, если появились дополнительные события для другой записи, они будут добавлены в свою собственную очередь. Если очередь пуста какое-то время, она просто получает удалено. Я понимаю, что это может привести к тому, что очередь получит одно сообщение, а затем будет удалена, поскольку не было обновлений до истечения времени ожидания простоя. (Это не кажется эффективным)

На основе Андрес Т Финнелл отличный ответ на этот вопрос.

Я думал о следующем

Producer (Web Service) -> Queue_Original <- Dispatcher  -> RecordID_14 
                                                        -> RecordID_2 
                                                        -> RecordID_8
                                                        -> RecordID_15

Некоторые из «журналов» могут занять много времени. Поэтому я хочу, чтобы несколько потребителей слушали эти очереди.

Допустим, у меня есть Consumer_1 и Consumer_2 (я могу добавить Consumer_3 позже, чтобы помочь с растущей нагрузкой)

Я бы хотел, чтобы Consumer_1 сделал getDistinations () где брокер вернет [RecordID_14, RecordID_2, RecordID_8, RecordID_15]

Вопросов:

  • Может ли Consumer_1 выполнить итерацию по списку очередей, возвращаемых брокером, в поисках первой доступной очереди, к которой не подключен Consumer_X, и начать обработку 1-го сообщения в этой очереди?
  • А затем каждый последующий Потребитель делать то же самое, пока не найдет следующую очередь без подключенного Потребителя?
  • Подойдет ли здесь Консультативные сообщения?

  • Я полностью ошибаюсь? Есть ли лучший подход справиться с этим сценарием?

Любая JMS - неправильный путь, поверьте мне. Взгляните на Apache Kafka или аналогичный. Очереди там намного гибче.

yegodm 22.03.2018 22:16

yep Информационные сообщения AMQ с группами сообщений могут решить ваши проблемы activemq.apache.org/message-groups.html, Spring DefaultMessageListenerContainer для создания concurrentConsumers docs.spring.io/spring/docs/current/javadoc-api/org/…

Hassen Bennour 23.03.2018 08:49

@yegodm - Итак, глядя на Кафку ... все еще изо всех сил пытаюсь вписать это в мои требования. Есть ли у меня тема для всех сообщений и диспетчер (мой термин) добавляет события для каждого RecordID в отдельные разделы (аналогично тому, как я описал очереди выше? Однако вы не можете удалять разделы. Я не хочу, чтобы потерянные разделы осталось после того, как я завершил обработку всех событий для RecordID_14, я также не хочу, чтобы Consumer_2 начал обрабатывать обновление для события Create, которым Consumer_1 все еще занят. Таким образом, один раздел с несколькими потребителями также отсутствует.

AcidHawk 23.03.2018 14:04

Во-первых, я почти уверен, что динамическое создание / удаление очередей - не лучшая идея, так как это, скорее всего, довольно дорогостоящие операции. Во-вторых, как вы заявили, одновременно не будет активных сотен записей. Вы можете постоянно выделять достаточное количество разделов, чтобы обеспечить наилучшую степень параллелизма, без необходимости удалять потерянные. Вам просто нужно стабильно маршрутизировать события в разделы, чтобы RecordID_N всегда переходил в раздел №X.

yegodm 23.03.2018 15:30

@yegodn - Спасибо за комментарии, я ценю вашу помощь. Так что единственная идея, которую я могу придумать, - это, возможно, 10 разделов. Затем каждый RecordID_XX, оканчивающийся на разные целые числа от 0 до 9, переходит в один из 10 разделов. Например. Все события для RecordID_00, 10, 20 попали в PartitionA, все события для RecordID_01,11,21 все идут в PartitionB, а все события для RecordID_02,12,22 идут в PartitionC и т. д. С одним потребителем на раздел ... Некоторый параллелизм а синхронная обработка сохранилась?

AcidHawk 23.03.2018 15:55

Если вы связываете одного потребителя с разделом, то да, порядок публикации сохраняется.

yegodm 23.03.2018 16:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
61
0

Другие вопросы по теме