Статьи

Apache Camel встречается с Redis

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 использует заданную структуру для хранения и проверки существующих идентификаторов.

<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>

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

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

прямой : обеспечивает прямой, синхронный вызов в том же контексте верблюда.

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>

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

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