Я создал небольшой проект, который показывает, как использовать JBoss Infinispan с Apache Camel и Идемпотентный шаблон потребителя, чтобы гарантировать, что сообщение не будет обрабатываться дважды в кластерной среде.
Представьте, что у вас есть приложение, которое можно легко масштабировать, развернув его на нескольких контейнерах. Но приложение должно обрабатывать каждый уникальный запрос только один раз в кластере.
Решение простое: используйте Idempotent Consumer Pattern в Camel с хранилищем, которое можно легко масштабировать. Здесь Infinispan вступает в игру. Infinispan является чрезвычайно масштабируемым, высокодоступным хранилищем ключей / значений и сеткой данных. Если вы используете InfinispanIdempotentRepository с идемпотентным потребителем, он создаст кэш в памяти для хранения запросов, и в момент запуска другого экземпляра приложения экземпляры кэша синхронизируются, а идемпотентные потребители во всех приложениях не будут обрабатывать существующие запросы. больше
С помощью этого проекта (idempotent consumer demo5) вы можете запустить столько контейнеров, сколько хотите, каждый контейнер запустит конечную точку отдыха на новом порту, начиная с 8080 (http: // localhost: 8080 / idempotent / KEY), и если вы выполните запрос GET с ключом, последующие запросы с тем же ключом к любому другому контейнеру будут отклонены. За кулисами Infinispan реплицирует все обработанные ключи в кластере приложений Camel и обеспечивает согласованность.
Основой приложения является следующее определение маршрута, которое находит новый номер свободного порта для каждого экземпляра приложения:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public class IdempotentRoute extends RouteBuilder { private static final transient Logger LOGGER = LoggerFactory.getLogger(IdempotentRoute. class ); private InfinispanIdempotentRepository infinispanRepo; private int port; @Override public void configure() throws Exception { .idempotentConsumer(header( "key" ), infinispanRepo) .setBody(simple( "UNIQUE REQUEST ACCEPTED: ${header.key}" )) .stop() .end() .setBody(simple( "REQUEST REJECTED: ${header.key}" )); } public InfinispanIdempotentRepository getInfinispanRepo() { return infinispanRepo; } public void setInfinispanRepo(InfinispanIdempotentRepository infinispanRepo) { this .infinispanRepo = infinispanRepo; } public void start() { port = AvailablePortFinder.getNextAvailable( 8080 ); LOGGER.info( "Using port: " + port); } } |
Просто, не правда ли?
Ссылка: | Кластеризованная модель идемпотентного потребительского поведения с Infinispan от нашего партнера JCG Билгина Ибряма в блоге OFBIZian . |