Разделение очереди JMS. Интеграция предприятия. Apache Camel

У меня есть стороннее приложение, которое помещает некоторые сообщения в очередь JMS. Также у меня есть приложение, которое читает сообщения из этой очереди. В зависимости от типа сообщения я сохраняю это сообщение в БД или отправляю в сторонний сервис. Также мы не должны превышать фиксированный лимит звонков в секунду, чтобы не перегружать сторонних.

В настоящее время мне пришло в голову два решения для этого варианта использования.

Первый - попросить третью сторону отправить некоторые настраиваемые заголовки, чтобы потребитель JMS мог фильтровать сообщения с помощью селекторов JMS. Итак, в этом случае мы сможем создать двух потребителей, первый сможет читать сообщения и сохранять их в БД, а второй будет использовать некоторый механизм дросселирования / опроса для отправки сообщений третьей стороне при определенной нагрузке. . Но этот подход не сработает для меня, потому что третьим лицам потребуется много времени, чтобы добавить эти настраиваемые заголовки. Что-то вроде этого в Camel:

from("jms:queue?selector=firstSelector")
    .bean(dbSaver);

from("jms:queue?selector=secondSelector")
    .throttle(10)
    .bean(httpClient);

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

from("jms:parentQueue")
    .choice()
        .when(body().contains(...))
            .to("jms:fistChildQueue")
        .otherwise()
            .to("jms:secondChildQueue")
    .end()

from("jms:fistChildQueue")
    .bean(dbSaver);

from("jms:secondChildQueue")
    .throttle(10)
    .bean(httpClient);

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

Может ли кто-нибудь предложить архитектурный дизайн для этого варианта использования? Было бы здорово увидеть его в стиле Camel Route.


person StasKolodyuk    schedule 10.08.2016    source источник
comment
Наличие двух дополнительных очередей не составляет большого труда, брокеры JMS созданы для обработки тысяч очередей. При этом вариант №1 Дариуса имеет больше смысла, если вы не хотите выполнять группировку вставок.   -  person Miloš Milivojević    schedule 12.08.2016


Ответы (1)


1. Вам действительно нужна очередь для потока в БД? Вы можете использовать bean-компонент (dbSaver) в первом маршруте или абстрагировать его до «прямого» маршрута вместо маршрута, потребляющего jms. Таким образом, у вас будет две очереди вместо трех.

2. Второй подход: если у вас есть контроль над БД, вы можете записать второй тип сообщения в другую таблицу. Затем sql-потребитель может опрашивать записи и удалять их по мере их использования и передавать их службе http. Однако стол действует как «бросьте свой Q». Вероятно, больше работы за небольшую окупаемость, так что, может быть, вторая очередь лучше.

3. Наконец, мне интересно, можно ли повторно использовать ту же очередь. Я вижу вариант, который позволит вам писать обратно в ту же очередь. Вы можете добавить заголовок и написать определенное сообщение. Это может сбивать с толку, а ошибка может создать бесконечный цикл.

Если вы уже используете JPA, это можно было бы немного упростить, используя компонент camel-jpa. В качестве потребителя он выполняет чтение и удаление записей (поведение по умолчанию). Я не думаю, что в компонентах SQL / JDBC есть что-то подобное из коробки.

person Darius X.    schedule 10.08.2016
comment
Спасибо за ответ. Первый вариант пока кажется наиболее подходящим. Также я подумал о третьем варианте, но он может привести к действительно запутанному громоздкому коду, но в случае, если Camel предоставляет такую ​​функциональность из коробки, это было бы здорово. Может ты мне с этим поможешь? - person StasKolodyuk; 11.08.2016
comment
Если вы используете JPA, это сделает №3 проще. Я отредактировал ответ, - person Darius X.; 11.08.2016
comment
Я бы выбрал №1, он самый разумный и масштабируемый. - person Miloš Milivojević; 12.08.2016