2016-11-15 2 views
0

Проблема:Сообщение процесса Секвенциален с конкурирующими потребителями

  • Получает сообщения (говорят заказы) на очереди в определенной последовательности (FIFO)
  • Я конкурирующие потребитель на очереди
  • Для дальнейшего добавления к сложности, потребитель может интересоваться только конкретными версиями заказа в зависимости от его состояния. (Скажем, версия1, версия 2 и версия5)
  • Номер версии заказа доступен в заказе, но не может использоваться для последовательности, поскольку мой слушатель может не интересоваться все версии (потребитель может быть заинтересован только в версиях Say version1, version 2 и version5)

Как обеспечить, чтобы я обрабатывал сообщения через потребителей в том порядке, в котором я их получил?

ответ

0

Вы не можете использовать несколько потребителей, по крайней мере, не базовые JMS. Вам нужно будет предоставить логику.

Решения, о которых я думаю, все сосать, потому что он принимает красоту асинхронной интеграции и пытается сделать его синхронным. Для каждого «объекта» или «сообщения» или «типа», имеющего прикрепленную к нему версию, вы можете отслеживать, какие версии вы получили, и попытаться гарантировать их обработку в порядке. Если потребитель получает их не по порядку, потребитель может просто остановиться на своем пути или может переупорядочить сообщение, но у любого решения есть какая-то гадость.

Если существует конечный набор объектов, которые имеют версию, и вы, возможно, видите объекты несколько раз, вы можете использовать селектор сообщений, чтобы гарантировать, что данный потребитель является единственным, кто видит сообщения этого конкретного идентификатора.

Если ваш JMS-провайдер поддерживает приоритетные очереди, вы можете назначить разные приоритеты и надеяться, что это даст их в соответствующем порядке, но даже это, похоже, связано с условием гонки.

Снова я задам вопрос: используете ли вы правильную технологию?

+0

Спасибо за ответ scott. Я действительно думал о распределенном хранилище, чтобы определить, какую версию мы обрабатываем, но он не будет работать для идентификации первого события. (представьте, что версия 1 обрабатывается Listener 1 и версией 2, обрабатываемой Listener 2. мы не можем гарантировать, что приказ гарантирует, что оба они могут не найти запись при поиске). В нашем случае это тоже не конечное множество. Нам нужна очередь для FIFO и гарантированной доставки и другой механизм переключения при сбое. хотел бы услышать ваши мысли по любой другой технологии, которая может считаться – user7161330

+0

Помимо сериализации через одного потребителя, не знаю, есть ли решение, если вы не можете определить состояние (т. е. v2 может/не может быть первым событие для обработки, и нет возможности проверить), то не уверен, что существует жизнеспособное решение. Прежде чем пытаться закодировать, есть диаграмма состояния, которую вам нужно собрать ... –

Смежные вопросы