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 использует заданную структуру для хранения и проверки существующих идентификаторов.
<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:
<?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>
Верблюд имеет различные компоненты для взаимодействия между маршрутами:
прямой : обеспечивает прямой, синхронный вызов в том же контексте верблюда.
seda : асинхронное поведение, при котором сообщения обмениваются в BlockingQueue, снова в том же контексте верблюда.
vm : асинхронное поведение, подобное seda, но также поддерживает связь через CamelContext, если они находятся в одной JVM.
Сложные приложения обычно состоят из нескольких отдельных экземпляров Camel, работающих на разных компьютерах. Для таких сценариев Camel предоставляет
jms, activemq , комбинацию
AWS SNS и SQS для обмена сообщениями между экземплярами.
Redisимеет более простое решение для парадигмы обмена сообщениями публикации / подписки. Подписчики подписываются на один или несколько каналов, указав названия каналов или используя сопоставление с образцом для получения сообщений из нескольких каналов. Затем издатель публикует сообщения на канал, а Redis следит за тем, чтобы он достиг всех соответствующих подписчиков.
<?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>
Претензия Проверка от шаблонов EIP позволяет заменить содержимое сообщения с проверкой претензии (уникальный ключ), который может быть использован для извлечения содержимого сообщения в более позднее время. Содержимое сообщения может быть временно сохранено в Redis.
Redis также очень популярен для реализации
счетчиков, списков лидеров, систем тегов и многих других функций. Теперь, когда под вашим поясом находятся два швейцарских армейских ножа, интеграция, которую можно сделать, ограничена только вашим воображением.