В чем разница между Kafka и Redis OSS?
Redis OSS – это хранилище данных типа «ключ – значение» в памяти. Apache Kafka – это движок потоковой обработки. Поскольку обе технологии можно использовать для создания системы рассылки сообщений о публикациях и подписках (издатель – подписчик), их можно сравнить. В современной облачной архитектуре приложения разделяют на небольшие независимые стандартные блоки – сервисы. Обмен сообщениями по модели Pub/Sub обеспечивает мгновенные уведомления о событиях для этих распределенных систем. Kafka поддерживает систему на основе технологии pull, в рамках которой издатели и подписчики совместно используют общую очередь сообщений, из которой подписчики извлекают сообщения по мере необходимости. Redis OSS поддерживает систему на основе технологии push, в рамках которой издатель рассылает сообщения всем подписчикам при возникновении события.
Особенности работы Redis и Kafka: Redis OSS pub/sub
Apache Kafka – это платформа потоковой передачи событий, которая позволяет нескольким приложениям передавать данные независимо друг от друга. Эти приложения, называемые производителями и потребителями, публикуют и подписывают информацию в определенных разделах данных, называемых темами, а также из них.
Между тем сервис Redis OSS представляет собой базу данных в памяти, поддерживающую передачу данных между приложениями с малой задержкой. Сервис хранит все сообщения в оперативной памяти, а не на жестком диске, чтобы сократить время чтения и записи данных. Как и в случае с Kafka, несколько пользователей могут подписаться на поток Redis OSS для получения сообщений.
Для рассылки сообщений по модели «издатель – подписчик» можно использовать как Kafka, так и Redis OSS, однако при этом стоит учитывать тот факт, что работают сервисы по-разному.
Рабочий процесс Kafka
Apache Kafka объединяет производителей и потребителей с помощью вычислительных кластеров. Каждый кластер состоит из нескольких брокеров Kafka, размещенных на разных серверах.
Kafka создает темы и разделы для таких целей:
- темы для группировки похожих данных, связанных с затрагиваемой темой, например электронная почта, платежи, пользователи и покупки;
- разделы между разными брокерами для репликации данных и обеспечения отказоустойчивости.
Производители публикуют сообщения для брокера. После получения сообщения брокер классифицирует данные по темам и сохраняет их в разделе. Потребители подключаются к соответствующей теме и извлекают данные из раздела.
Рабочий процесс Redis OSS
Redis OSS работает с архитектурой «клиент – сервер» в качестве системы баз данных NoSQL. Производители и потребители слабо связаны друг с другом: им не нужно знать друг друга при отправке сообщений.
Redis OSS использует ключи, первичные и вторичные узлы для описанных ниже целей.
- Ключи для группировки похожих сообщений. Например, «электронная почта» является ключом, указывающим на хранилище данных, в котором хранятся только сообщения электронной почты.
- Первичные и вторичные узлы для репликации сообщений.
Когда производитель отправляет сообщение определенному узлу, Redis OSS доставляет его всем подключенным подписчикам, проверяя ключ сообщения. Чтобы получать сообщения, потребителю следует обязательно установить и поддерживать активное соединение с сервером Redis OSS. Это семантика подключенной доставки.
Обработка сообщений в Redis и Kafka: Redis OSS pub/sub
Apache Kafka дает разработчикам высокомасштабируемые распределенные системы рассылки. Кроме того, Redis OSS предоставляет разнообразные структуры данных, которые дают возможность приложению быстро передавать данные на несколько узлов. У обеих систем имеется несколько различий в механизмах формирования очереди сообщений.
Размер сообщения
Kafka и Redis OSS достигают наивысшей продуктивности при передаче небольших пакетов данных между потребителями и подписчиками.
В частности, Redis OSS не подходит для обработки больших объемов данных без снижения пропускной способности. Кроме того, он не может хранить значительные объемы данных, так как объем оперативной памяти меньше, чем у дисковых систем.
В то же время сервис Kafka способен обрабатывать довольно большие сообщения, хотя и не предназначен для этого изначально. Kafka может принимать сообщения размером до 1 ГБ при использовании сжатия и настройке на многоуровневое хранение. Вместо сохранения всех сообщений в локальном хранилище Kafka применяет удаленное хранилище для размещения готовых файлов журнала.
Доставка сообщений
Потребители Kafka получают данные из очереди сообщений. Каждый потребитель Kafka отслеживает прочитанное сообщение по смещению, которое он обновляет для получения следующего сообщения. Потребители способны обнаруживать и отслеживать дубликаты сообщений.
В отличие от этого, Redis OSS автоматически передает сообщение подключенным подписчикам. Подписчики Redis OSS пассивно ожидают входящих сообщений, направляемых сервером. Поскольку доставка выполняется не более одного раза, подписчики Redis OSS не способны обнаруживать дубликаты сообщений.
Хранение сообщений
Kafka сохраняет сообщения после их прочтения потребителями. Таким образом, при потере полученных данных клиентским приложением эти данные могут быть повторно запрошены из раздела, на который подписано приложение. Настроив политику хранения сообщений, пользователи могут задать период хранения данных Kafka.
Redis OSS, напротив, не сохраняет сообщения после доставки. Если ни один подписчик не подключен к потоку, Redis OSS удаляет сообщения. Удаленные сообщения невозможно восстановить, даже если подписчик подключится к Redis OSS позже.
Обработка ошибок
Как Kafka, так и Redis OSS позволяют приложениям снизить риск ненадежной доставки сообщений, но делают это по-разному.
Обработка ошибок в Redis OSS сосредоточена на взаимодействии между клиентским приложением и сервисами Redis OSS. С помощью Redis OSS разработчики могут устранять такие ситуации, как тайм-ауты клиентов, переполнение буфера памяти и превышение лимитов подключений. Из-за архитектуры базы данных «ключ-значение» Redis OSS не способен обеспечить такую надежную обработку ошибок сообщений, как Kafka.
Разработчики Kafka могут сохранять события с ошибками в очереди недоставленных сообщений, повторно отправлять их или перенаправлять, чтобы гарантировать стабильную доставку клиентским приложениям. Разработчики также могут использовать API Kafka Connect для автоматического перезапуска задач коннектора при возникновении определенных ошибок.
Различия в эффективности Redis и Kafka: Redis OSS pub/sub
В целом Apache Kafka превосходит Redis OSS в рассылке сообщений по модели «издатель – подписчик», поскольку сервис был разработан специально для потоковой передачи данных. Сервис Redis OSS предусматривает несколько вариантов использования, в которых Kafka не может использоваться.
Параллелизм
Параллелизм – это возможность одновременного получения одного и того же сообщения несколькими потребителями.
Redis OSS не поддерживает параллелизм.
В отличие от него, Kafka позволяет рассылать одно и то же сообщение нескольким потребителям одновременно. Обычно потребители в группах Kafka получают новые сообщения из раздела по очереди. Если в нескольких группах потребителей есть только один потребитель, он будет получать все сообщения. Преимущества такой настройки и репликации разделов дают возможность назначать одного потребителя каждой группе на каждой реплике раздела. В результате все потребители получают сообщения в одинаковом порядке.
Пропускная способность сети
Пропускная способность показывает, сколько сообщений каждая система способна обрабатывать в секунду.
У Kafka этот показатель обычно выше, чем у модели «издатель – подписчик» Redis OSS. Kafka справляется с гораздо большими объемами данных, так как сервису не требуется дожидаться, пока каждый подписчик получит сообщение, прежде чем перейти к следующему. Вместо этого сообщения временно сохраняются в памяти и хранилище, что ускоряет чтение.
Однако, если потребители не успевают обработать сообщения достаточно быстро, производительность Kafka может снизиться, так как сообщения из памяти со временем удаляются. Тогда потребители читают данные с диска, что происходит медленнее.
В отличие от этого, Redis OSS ожидает подтверждение от каждого потребителя, что снижает пропускную способность по мере роста числа подключённых узлов. Обходной путь – отправка нескольких запросов посредством процесса под названием конвейерная обработка, однако стоит учесть, что это уменьшает задержку рассылки.
Задержка
Как Kafka, так и Redis OSS подходят для обработки данных с малой задержкой. Время рассылки с помощью Redis OSS меньше, оно исчисляется в миллисекундах, тогда как время рассылки с помощью Kafka в среднем составляет десятки миллисекунд.
Поскольку Redis OSS выполняет чтение и запись данных в основном в оперативной памяти, сервис, безусловно, опережает Kafka по показателям скорости. Однако Redis OSS может не поддерживать операции с данными со сверхнизкой задержкой при обработке больших сообщений. В то же время Kafka требуется больше времени на репликацию разделов на разных физических дисках для сохранения данных, что увеличивает время доставки сообщений.
Оптимизация задержек для Redis OSS и Kafka возможна, однако при этом следует соблюдать соответствующие меры предосторожности. Например, сообщения Kafka можно сжимать, чтобы уменьшить задержку, но при этом производителям и потребителям потребуется больше времени на их распаковку.
Задержка в Redis OSS может быть вызвана несколькими факторами, включая операционную среду, сетевые операции, медленные команды или ответвление. Чтобы сократить задержки при ответвлении, Redis OSS рекомендует запускать систему по модели «издатель – подписчик» на современных инстансах EC2 на базе аппаратной виртуальной машины.
Отказоустойчивость
Kafka записывает все данные на диск хранения ведущего брокера и реплицирует их на разные серверы. При сбое сервера несколько подписчиков извлекают данные из резервных разделов.
В отличие от Kafka, Redis OSS по умолчанию не создает резервные копии данных, поэтому пользователям приходится включать эту функцию вручную. Redis OSS использует хранилище данных в памяти, при выключении питания которого все данные утрачиваются. Во избежание таких инцидентов разработчики включили функцию сохранения базы данных Redis OSS, чтобы периодически делать снимки данных оперативной памяти и сохранять их на диске.
Что использовать – Kafka или Redis OSS pub/sub
Apache Kafka – лучший инструмент для создания приложений, обрабатывающих большие наборы данных и требующих высокой восстанавливаемости. Первоначально сервис был разработан как единый распределенный конвейер данных, способный обрабатывать триллионы проходящих сообщений. Kafka реплицирует разделы на разных серверах, чтобы предотвратить потерю данных в случае сбоя узла. Организации используют Kafka для поддержки связи в режиме реального времени между приложениями, мобильными устройствами Интернета вещей (IoT) и микросервисами. Это также лучший инструмент для агрегации журналов, потоковой обработки и других облачных задач интеграции данных.
Кроме того, Redis OSS обеспечивает распределение событий со сверхнизкой задержкой для приложений, требующих мгновенной передачи данных, но допускающих небольшие потери данных. Redis OSS обычно используется в качестве кэша сеансов для хранения часто используемых данных или доставки срочных сообщений. Сервис также подходит для хранения данных, связанных с играми, электронной коммерцией или социальными сетями, чтобы усовершенствовать взаимодействие с пользователем.
Краткое описание различий: Kafka и Redis OSS pub/sub
Apache Kafka |
Redis OSS |
|
Размер сообщения |
Поддерживает размер сообщений до 1 ГБ со сжатием и многоуровневым хранилищем. |
Поддерживает меньший размер сообщения. |
Доставка сообщений |
Подписчики извлекают сообщения из очереди. |
Сервер Redis OSS отправляет сообщения подключенным подписчикам. |
Хранение сообщений |
Сохраняет сообщения после извлечения. |
Не сохраняет сообщения. |
Обработка ошибок |
Надежная обработка ошибок на уровне сообщений. Очередь недоставленных писем, повторная попытка для события и перенаправление. |
Исключения Redis OSS необходимо обрабатывать на уровне приложений с применением тайм-аутов, ограничений клиентов и объемов буфера памяти. |
Параллелизм |
Kafka поддерживает параллелизм. Несколько потребителей могут одновременно получать одно и то же сообщение. |
Не поддерживает параллелизм. |
Пропускная способность сети |
Обладает более высокой пропускной способностью благодаря асинхронному чтению и записи. |
Пропускная способность снижается, поскольку серверу Redis OSS необходимо дождаться ответа, прежде чем отправлять сообщение другому подписчику. |
Задержка |
Низкая задержка. Скорость несколько снижается по сравнению с Redis OSS из-за репликации данных по умолчанию. |
Сверхнизкая задержка при рассылке сообщений меньшего размера. |
Отказоустойчивость |
Автоматическое резервное копирование разделов для разных брокеров. |
По умолчанию резервное копирование не выполняется. Пользователи могут включить постоянное хранение Redis OSS вручную. Риск потери небольших данных. |
Как AWS обеспечивает соответствие требованиям Kafka и Redis OSS?
Amazon Web Services (AWS) предоставляет масштабируемую и управляемую инфраструктуру для удовлетворения потребностей пользователей в рассылке сообщений о публикациях и подписках (издатель – подписчик).
Используйте управляемую потоковую передачу Amazon для Apache Kafka (Amazon MSK), чтобы легко принимать и обрабатывать большие объемы данных в режиме реального времени. Чтобы обеспечить высокую доступность потоковых узлов в любом масштабе, можно создать шину данных с частным доступом. Кроме того, существует возможность простого подключения к другим сервисам AWS, таким как AWS IoT Core, виртуальное частное облако Amazon (Amazon VPC) и управляемый сервис Amazon для Apache Flink.
Чтобы обеспечить высокодоступное хранилище в памяти для рабочих нагрузок Redis OSS, используйте Amazon MemoryDB. Чтобы отслеживать активность пользователей, можно запускать потоковые каналы данных с высокой многопоточностью. Кроме того, можно обрабатывать миллионы запросов в день на мультимедийные и развлекательные приложения.
Вместо Redis OSS или Kafka для создания системы рассылки сообщений по модели «издатель – подписчик» также можно использовать простой сервис уведомлений Amazon (Amazon SNS). Отправлять сообщения можно непосредственно из собственных приложений клиентам или другим приложениям масштабируемым и экономически эффективным способом. Функции Amazon SNS:
- высокая пропускная способность для обмена push-уведомлениями между распределенными системами, микросервисами и бессерверными приложениями на основе событий по модели «многие ко многим»;
- шифрование сообщений и конфиденциальность трафика;
- возможности распространения в разных категориях AWS, включая аналитику, вычисления, контейнеры, базы данных, Интернет вещей (IoT), машинное обучение, безопасность и хранение.
Начните рассылку сообщений по модели «издатель – подписчик», а также работу с Redis OSS и Kafka на AWS, создав аккаунт уже сегодня.