2016-09-12 2 views
3

Я работаю с Java rabbitmq API. Это как мое приложение выглядит следующим образом: enter image description hereСинхронизация очереди

Издатель A посылает задания на Q1, то многие потребители B сделать работу и создать новое задание и отправить его в Q2, где многие потребительские C сделать работу.

Я хочу удостовериться, что никакие дублированные задания не отправляются на Q2, как я могу это достичь?

Прими во внимании два сценария:

  1. B аварии после отправки задания на Q2, но перед отправкой подтверждения Q1, что он завершил работу
  2. B аварии после отправки подтверждения Q1 но перед отправкой задания на Q2
+0

Использование 'reddis' или' memcached', чтобы проверить, если задание было представлено уже? –

+0

@AvihooMamka Я не понимаю. Можете ли вы дать полный ответ, пожалуйста, –

+0

Можете ли вы сделать какую-то систему, которая управляет двойными записями или будет потреблять слишком много времени? Я представляю что-то вроде этого: Q1 дает каждой записи все большее число, Q2 хранит список с этими номерами в порядке (каждый раз, когда что-то входит в Q2, в этот список помещается номер).Предполагая, что обычно порядок, в котором B обрабатывает задания, не слишком сильно скрещивает числа, вопрос о том, есть ли что-то в списке или нет, должен быть быстрым, потому что нужно пройти лишь небольшую часть списка. – Aziuth

ответ

1

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

вы не можете. даже не на Q1.

Характер распределенных систем и теорема CAP (https://en.wikipedia.org/wiki/CAP_theorem) говорят, что это невозможно, даже если цель достигается подавляющее большинство времени.

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

Наиболее распространенный метод - это своего рода идемпотентность (https://en.wikipedia.org/wiki/Idempotence) - способ гарантировать, что одно и то же сообщение будет обработано только один раз. или, может быть, более точно, способ сказать, что одно и то же сообщение может обрабатываться неограниченное количество раз, но будет только вызывать изменение/иметь влияние на систему один раз.


в целом, однако, ваша ситуация с несколькими очередями и потребителей, которые должны обрабатывать вещи в порядке призывает к «Саге» или «Process Manager» - это давно работает, асинхронный рабочий процесс.

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

+0

Я не могу найти запрос диспетчера процессов для java, что мне искать? –

+0

Я не в своей глубине с Java, к сожалению ... у меня есть статья, охватывающая концепцию в JavaScript. это может быть полезно в качестве руководства, хотя технология/реализация будет отличаться: https://derickbailey.com/2015/08/10/managing-workflow-in-long-running-javascript-processes/ –

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