Реализован ли шаблон Apache Camel — Idempotent Consumer с потокобезопасным jdbcMessageIdRepository?

Мне нужно реализовать идемпотентный потребительский шаблон в Camel (2.23.0), и я искал при возможных реализациях. В настоящее время я могу реализовать либо JdbcMessageIdRepository, либо JpaMessageIdRepository и интересуется, являются ли эти реализации потокобезопасными при обработке одновременных запросов? Я просмотрел исходный код этих классов в Camel Github, но не смог найти код, предотвращающий/обрабатывающий параллельный доступ.

Кто-нибудь может это подтвердить? Большое спасибо!


person Kim Zeevaarders    schedule 20.05.2019    source источник


Ответы (1)


Короткий ответ: Да (для таблицы БД с первичным ключом)


Подробный ответ: я попробовал это сегодня (используя подключаемый модуль Parallel Controller для JMeter) и заметил, что если я не установлю первичный ключ в таблице CAMEL_MESSAGEPROCESSED я получаю повторяющиеся записи при запуске нескольких одновременных HTTP-запросов. Однако, если я добавлю в эту таблицу первичный ключ (что также рекомендуется в документации по верблюдам), потребитель idempotent будет вести себя так, как ожидалось.

Можно ли с уверенностью сказать, что о синхронизации заботится механизм первичного ключа в таблице?

Я имею в виду, что только одному Request-thread удается добавить строку в таблицу CAMEL_MESSAGEPROCESSED, и из того, что я наблюдал во время своих тестов, это то, что другие Request помечены как дубликаты

Camel (exchangeProperty(Exchange.DUPLICATE_MESSAGE)=true)
person Kim Zeevaarders    schedule 21.05.2019
comment
Даже с нетерпеливым = true (по умолчанию) похоже, что на уровне кода Camel не может надежно предотвратить повторяющиеся вставки обменов, обрабатываемых в одно и то же время (например, в сценариях с высокой нагрузкой). Две биржи могли увидеть, что ключа еще нет в репо и сделать вставку. Чтобы надежно отфильтровать дубликаты, как вы выяснили, в поле messageId должно быть установлено уникальное ограничение/PK (в дополнение к энтузиасту=true). Я не смог найти рекомендацию сделать это в документах для camel-sql, а не для его идемпотентной потребительской функциональности. - person Sebastian3000; 21.05.2019
comment
@SebastianBrandt взгляните на параграф Использование идемпотентного репозитория на основе JDBC по следующему URL-адресу: camel.apache .org/sql-component.html. Где-то говорится, что мы рекомендуем иметь уникальное ограничение для столбцов имя_процессора и идентификатор_сообщения. Однако в нем прямо не указано, что это требуется для сценария параллельного доступа :) - person Kim Zeevaarders; 21.05.2019
comment
Спасибо, я пропустил это. - person Sebastian3000; 21.05.2019