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