Учитывая следующий сценарий:
У меня есть система, которая создает, обновляет и удаляет записи. Для каждого из этих действий мне нужно что-то сделать (скажем, записать события в журнал в качестве глупого примера), однако мне нужно обработать эти события для каждой записи по порядку - это означает, что я не могу зарегистрировать удаление, пока не сделаю 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]
Вопросов:
Подойдет ли здесь Консультативные сообщения?
Я полностью ошибаюсь? Есть ли лучший подход справиться с этим сценарием?
yep Информационные сообщения AMQ с группами сообщений могут решить ваши проблемы activemq.apache.org/message-groups.html, Spring DefaultMessageListenerContainer для создания concurrentConsumers docs.spring.io/spring/docs/current/javadoc-api/org/…
@yegodm - Итак, глядя на Кафку ... все еще изо всех сил пытаюсь вписать это в мои требования. Есть ли у меня тема для всех сообщений и диспетчер (мой термин) добавляет события для каждого RecordID в отдельные разделы (аналогично тому, как я описал очереди выше? Однако вы не можете удалять разделы. Я не хочу, чтобы потерянные разделы осталось после того, как я завершил обработку всех событий для RecordID_14, я также не хочу, чтобы Consumer_2 начал обрабатывать обновление для события Create, которым Consumer_1 все еще занят. Таким образом, один раздел с несколькими потребителями также отсутствует.
Во-первых, я почти уверен, что динамическое создание / удаление очередей - не лучшая идея, так как это, скорее всего, довольно дорогостоящие операции. Во-вторых, как вы заявили, одновременно не будет активных сотен записей. Вы можете постоянно выделять достаточное количество разделов, чтобы обеспечить наилучшую степень параллелизма, без необходимости удалять потерянные. Вам просто нужно стабильно маршрутизировать события в разделы, чтобы RecordID_N всегда переходил в раздел №X.
@yegodn - Спасибо за комментарии, я ценю вашу помощь. Так что единственная идея, которую я могу придумать, - это, возможно, 10 разделов. Затем каждый RecordID_XX, оканчивающийся на разные целые числа от 0 до 9, переходит в один из 10 разделов. Например. Все события для RecordID_00, 10, 20 попали в PartitionA, все события для RecordID_01,11,21 все идут в PartitionB, а все события для RecordID_02,12,22 идут в PartitionC и т. д. С одним потребителем на раздел ... Некоторый параллелизм а синхронная обработка сохранилась?
Если вы связываете одного потребителя с разделом, то да, порядок публикации сохраняется.




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