Статьи

Apache Camel встречает Редиса

Магазины Lamborghini Key-Value

Camel — лучшая инфраструктура интеграции хлеба, и в этой статье я покажу вам, как сделать ее еще более мощной, используя еще один замечательный проект — Redis .

Скоро выйдет Camel 2.11 с множеством новых функций, исправлений ошибок и компонентов. Я создал пару этих новых компонентов, мой любимый — redis-component . Redis — хранилище ключей и ценностей — это удивительное итальянское программное обеспечение, разработанное для скорости (так же, как Lamborghini — двухместная итальянская машина, разработанная для

скорость). Написанная на С и имеющая память, близкую к металлической природе, Redis очень хорошо работает (девиз Ламборджини — «Ближе к дороге»). Redis часто называют сервером структуры данных, поскольку ключи могут содержать строки, хэши, списки и отсортированные наборы. Быстрая и легкая структура данных сервера, как супер спортивные машины для разработчиков программного обеспечения — она ​​просто летает. Если вы хотите узнать больше об уникальных характеристиках производительности Redis и Lamborghini, поищите в Google, и вы убедитесь сами.

Начать работать с Redis очень просто: скачайте, создайте и запустите redis-сервер. После этих шагов вы готовы использовать его из вашего приложения Camel. Компонент использует внутренне Spring Data, который, в свою очередь, использует драйвер Jedis, но с возможностью переключения на другие драйверы Redis. Вот несколько случаев, когда компонент camel-redis хорошо подходит:

Идемпотентный репозиторий

Термин идемпотент используется в математике для описания функции, которая дает тот же результат, если он применяется к самому себе. В обмене сообщениями это понятие переводится в сообщение, которое имеет одинаковый эффект, независимо от того, получено ли оно один или несколько раз. В Camel этот шаблон реализован с использованием класса IdempotentConsumer, который использует выражение для вычисления уникальной строки идентификатора сообщения для данного обмена сообщениями; затем этот идентификатор можно найти в IdempotentRepository, чтобы увидеть, был ли он виден ранее; если оно имеет сообщение потребляется; если нет, то сообщение обрабатывается и идентификатор добавляется в хранилище. RedisIdempotentRepository использует заданную структуру для хранения и проверки существующих идентификаторов.

01
02
03
04
05
06
07
08
09
10
11
<bean id="idempotentRepository" class="org.apache.camel.component.redis.processor.idempotent.RedisIdempotentRepository">
<constructor-arg value="test-repo"/>
</bean>
  
<route>
<from uri="direct:start"/>
<idempotentConsumer messageIdRepositoryRef="idempotentRepository">
<simple>${in.body.id}</simple>
<to uri="mock:result"/>
</idempotentConsumer>
</route>

Кэширование

Одним из основных применений Redis является LRU-кеш . Он может хранить данные памяти в виде Memcached или может быть настроен на долговременную очистку данных в файл журнала, который может быть воспроизведен при перезапуске узла. Различные политики при достижении maxmemory позволяют создавать кэши для определенных потребностей:

  • volatile-lru удаляет ключ из числа с установленным сроком действия, пытаясь удалить ключи, которые недавно не использовались.
  • volatile-ttl удаляет ключ из числа с установленным сроком действия, пытаясь удалить ключи с коротким оставшимся временем жизни.
  • volatile-random удалить случайный ключ из тех, у которых установлен срок действия.
  • allkeys-lru похож на volatile-lru, но удалит все виды ключей, как обычных, так и ключей с установленным сроком действия.
  • allkeys-random, как volatile-random, но удалит все виды ключей, как обычные, так и ключи с установленным сроком действия.

Как только ваш сервер Redis настроен с правильными политиками и запущен, вам нужно выполнить следующие действия: SET и GET:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<route>
<from uri="direct:start"/>
<setHeader headerName="CamelRedis.Command">
<constant>SET</constant>
</setHeader>
<setHeader headerName="CamelRedis.Key">
<constant>keyOne</constant>
</setHeader>
<setHeader headerName="CamelRedis.Value">
<constant>valueOne</constant>
</setHeader>
<to uri="redis://localhost:6379"/>
</route>

Интерап паб / саб с Redis

Верблюд имеет различные компоненты для взаимодействия между маршрутами:

прямой : обеспечивает прямой, синхронный вызов в том же контексте верблюда.
seda : асинхронное поведение, при котором сообщения обмениваются в BlockingQueue, снова в том же контексте верблюда.
vm : асинхронное поведение, подобное seda, но также поддерживает связь через CamelContext, если они находятся в одной JVM. Сложные приложения обычно состоят из нескольких отдельных экземпляров Camel, работающих на разных компьютерах. Для таких сценариев Camel предоставляет jms, activemq , комбинацию AWS SNS и SQS для обмена сообщениями между экземплярами.
Redis предлагает более простое решение для парадигмы обмена сообщениями публикации / подписки. Подписчики подписываются на один или несколько каналов, указав названия каналов или используя сопоставление с образцом для получения сообщений из нескольких каналов. Затем издатель публикует сообщения на канал, а Redis следит за тем, чтобы он достиг всех соответствующих подписчиков.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route startupOrder="1">
<from uri="redis://localhost:6379?command=SUBSCRIBE&channels=testChannel"/>
<to uri="mock:result"/>
</route>
  
<route startupOrder="2">
<from uri="direct:start"/>
<setHeader headerName="CamelRedis.Command">
<constant>PUBLISH</constant>
</setHeader>
<setHeader headerName="CamelRedis.CHANNEL">
<constant>testChannel</constant>
</setHeader>
<setHeader headerName="CamelRedis.MESSAGE">
<constant>Test Message</constant>
</setHeader>
<to uri="redis://localhost:6379"/>
</route>
</camelContext>

Другие использования

Гарантированная доставка : Camel поддерживает этот EIP с использованием JMS, File, JPA и нескольких других компонентов. Здесь Redis можно использовать в качестве облегченного постоянного хранилища значений ключей с поддержкой транзакций.

Проверка утверждений из шаблонов EIP позволяет заменить содержимое сообщения проверкой утверждений (уникальным ключом), которую можно использовать для получения содержимого сообщения позднее. Содержимое сообщения может быть временно сохранено в Redis.

Redis также очень популярен для реализации счетчиков, списков лидеров, систем тегов и многих других функций. Теперь, когда под вашим поясом находятся два швейцарских армейских ножа, интеграция, которую можно сделать, ограничена только вашим воображением.

Ссылка: Apache Camel встречает Redis от нашего партнера по JCG Билгина Ибряма в блоге OFBIZian .