Kafka と Redis の相違点は何ですか?

Redis はインメモリ key-value データストアであり、Apache Kafka はストリーム処理エンジンです。しかし、この 2 つのテクノロジーを比較することは可能です。なぜなら、両方とも、パブリッシュ/サブスクライブ (pub/sub) メッセージングシステムを作成するために利用できるからです。モダンクラウドアーキテクチャでは、アプリケーションはサービスと呼ばれる、より小さな独立したビルディングブロックに分離されます。Pub/Sub メッセージングは、これらの分散システムに即時のイベント通知を提供します。Kafka は、パブリッシャーとサブスクライバーが共通のメッセージキューを共有し、サブスクライバーが必要に応じてそこからメッセージをプルするプルベースのシステムをサポートします。Redis は、イベントが発生したときにパブリッシャーがすべてのサブスクライバーにメッセージを配信するプッシュベースのシステムをサポートします。

Kafka について読む »

Redis について読む »

仕組み: Kafka とRedis Pub/Sub

Apache Kafka は、複数のアプリケーションが互いに独立してデータをストリーミングできるようにするイベントストリーミングプラットフォームです。プロデューサーコンシューマーと呼ばれるこれらのアプリケーションは、トピックと呼ばれる特定のデータパーティションに対して情報を公開したり、トピックから情報をサブスクライブしたりします。

一方、Redis は、アプリケーション間の低レイテンシーのデータ転送をサポートするインメモリデータベースとして設計されています。すべてのメッセージをハードディスクではなく RAM に保存して、データの読み書き時間を短縮します。Kafka と同様に、複数のコンシューマーが Redis ストリームをサブスクライブしてメッセージを取得できます。

どちらも Pub/Sub メッセージングに使用できますが、Kafka と Redis の動作は異なります。

Kafka のワークフロー

Apache Kafka は、コンピュートクラスターを通じてプロデューサーとコンシューマーを接続します。各クラスターは、異なるサーバーにある複数の Kafka ブローカーで構成されています。

Kafka は以下の目的でトピックとパーティションを作成します。

  • E メール、支払い、ユーザー、購入など、関心のあるテーマに属する類似データをグループ化するためのトピック
  • データの複製と耐障害性を実現するために、さまざまなブローカーにまたがるパーティション

プロデューサーはメッセージをブローカーに公開します。ブローカーはメッセージを受信すると、データをトピックに分類し、データをパーティションに保存します。コンシューマーは関連するトピックに接続し、そのパーティションからデータを抽出します。

Redis のワークフロー

Redis は、NoSQL データベースシステムとしてクライアント/サーバーアーキテクチャで動作します。プロデューサーとコンシューマーは疎結合であり、メッセージを送信するときに互いを認識する必要はありません。

Redis は以下の目的でキーとプライマリ/セカンダリノードを使用します。

  • 類似のメッセージをグループ化するためのキー。たとえば、「E メール」は E メールメッセージのみを保持するデータストアを指すキーです。 
  • メッセージ複製用のプライマリ/セカンダリノード。

プロデューサーが特定のノードにメッセージを送信すると、Redis はメッセージキーを確認して、接続しているすべてのサブスクライバーにメッセージを配信します。コンシューマーがメッセージを受信するには、常に Redis サーバーとのアクティブな接続を開始して維持する必要があります。これは接続配信セマンティックとして知られています。

Pub/Sub メッセージングについて読む »

メッセージ処理: Kafka とRedis Pub/Sub

Apache Kafka は、デベロッパーに非常にスケーラブルな分散型メッセージングシステムを提供します。一方、Redis が提供する豊富なデータ構造により、アプリケーションはデータを複数のノードにすばやくプッシュできます。どちらのシステムにも、メッセージキューの仕組みにいくつかの相違点があります。

メッセージサイズ

Kafka と Redis は、コンシューマーとサブスクライバーの間で小さなサイズのデータパケットを送信する場合に最も効果的です。

特に Redis は、スループットを犠牲にすることなく大きなデータサイズを処理するようには設計されていません。また、RAM はディスクストレージよりも容量が小さいため、大量のデータを保存することもできません。 

一方、Kafka は、特にそのように構築されていないにも関わらず、ある程度大きなメッセージをサポートできます。Kafka は、メッセージを圧縮して階層型ストレージ用に設定した場合、最大 1 GB のメッセージを処理できます。すべてのメッセージをローカルストレージに保存する代わりに、リモートストレージを使用して完全なログファイルを保存します。 

メッセージの配信

Kafka コンシューマーはメッセージキューからデータを取得します。各 Kafka コンシューマーは、読み取ったメッセージをオフセット付きで追跡し、それを更新して次のメッセージを取得します。コンシューマーは重複したメッセージを検出して追跡できます。

一方、Redis は接続されたサブスクライバーにメッセージを自動的にプッシュします。Redis サブスクライバーは、サーバーからの受信メッセージを受動的に待機します。一回限りの配信設定であるため、Redis サブスクライバーは重複メッセージを検出できません。

メッセージ保持

Kafka は、コンシューマーのメッセージ読み取り後もメッセージを保持します。そのため、クライアントアプリケーションが取得したデータを失った場合でも、サブスクライブしているパーティションからそのデータを再度要求できます。メッセージ保持ポリシーを設定することで、ユーザーは Kafka がデータを保持する期間を決定できます。 

一方、Redis は配信後にメッセージを保存しません。ストリームにサブスクライバーが接続されていない場合、Redis はメッセージを破棄します。破棄されたメッセージは、サブスクライバーが後で Redis に接続し復元することはできません。  

エラー処理

Kafka と Redis はどちらも、アプリケーションが信頼性の低いメッセージ配信を軽減できるようにしますが、その方法は異なります。

Redis のエラー処理は、クライアントアプリケーションと Redis サービス間の相互作用に重点を置いています。Redis を使用すると、デベロッパーはクライアントのタイムアウト、メモリバッファの超過、クライアントの最大制限などの状況に対処できます。キーと値のペアのデータベースアーキテクチャにより、Redis は Kafka のように堅牢なメッセージエラー処理を提供できません。 

Kafka のデベロッパーは、エラーのあるイベントをデッドレターキューに保存したり、再試行したり、リダイレクトしたりして、クライアントアプリケーションに一貫したメッセージ配信を行うことができます。デベロッパーは Kafka Connect API を使用して、特定のエラーが発生した場合にコネクタタスクを自動的に再起動することもできます。

デッドレターキューについて読む »

パフォーマンスの相違点: Kafka とRedis Pub/Sub

全体として、Pub/Sub メッセージングでは Apache Kafka は Redis よりも優れています。これは、Kafka がデータストリーミング専用に設計されているためです。Redis には、Kafka を使用できないさまざまなユースケースがあります。 

並列処理

並列処理とは、複数のコンシューマーが同じメッセージを同時に受信できることです。

Redis は並列処理をサポートしていません。

一方、Kafka では、同じメッセージを複数のコンシューマーに同時に配信できます。 Kafka は通常、コンシューマーグループのコンシューマーは順番にパーティションから新しいメッセージを取得します。複数のコンシューマーグループにコンシューマーが 1 人しかいない場合は、すべてのメッセージが取得されます。この設定とパーティションレプリケーションを利用することで、各パーティションレプリカの各コンシューマーグループに 1 人のコンシューマーを割り当てることができます。これにより、すべてのコンシューマーが同様のメッセージシーケンスを取得できます。 

スループット

スループットは、各システムが 1 秒あたりに処理できるメッセージ数を測定します。

Kafka は通常、Redis の Pub/Sub よりもスループットが高くなります。Kafka は、各サブスクライバーのメッセージの受信を確認してから別のサブスクライバーに移動する必要がないため、はるかに大量のデータを処理できます。その代わりに、現在のメッセージをメモリキャッシュとストレージに保存し、読み取り速度を最適化します。 

ただし、コンシューマーがメッセージを十分な速度で取得しない場合、キャッシュ上の未読メッセージが最終的に削除されるため、Kafka のパフォーマンスが低下する可能性があります。この場合、コンシューマーはディスクから読み取る必要がありますが、速度は遅くなります。

一方、Redis は各コンシューマーの確認を待つ必要があるため、接続されたノードが増えるとスループットが大幅に低下します。回避策は、パイプラインと呼ばれるプロセスで複数のリクエストを送信することですが、これによりメッセージのレイテンシーが短縮されます。 

レイテンシー

Kafka と Redis はどちらも低レイテンシーのデータ処理に適しています。Kafka が平均数十ミリ秒であるのに対し、Redis のメッセージング時間はミリ秒単位と短いです。

Redis は主に RAM 上でデータの読み取りと書き込みを行っているため、速度は当然ながら Kafka よりも遅くなります。ただし、Redis が大量のメッセージを処理する場合、超低レイテンシーのデータ操作を維持できない場合があります。一方、Kafka はデータを永続化するために異なる物理ドライブ上のパーティションを複製するのにより多くの時間を必要とするため、メッセージ配信時間のオーバーヘッドが増加します。

Redis と Kafka のレイテンシーを最適化することは可能ですが、慎重に行う必要があります。たとえば、Kafka メッセージを圧縮してレイテンシーを減らすことはできますが、プロデューサーとコンシューマーがそれらを解凍するためにより多くの時間が必要になります。

Redis のレイテンシーは、動作環境、ネットワーク操作、低速なコマンド、フォークなど、いくつかの要因によって引き起こされる可能性があります。フォークの遅延を減らすため、Redis ではハードウェア仮想マシン (HVM) ベースの最新の EC2 インスタンスで Pub/Sub 配信システムを実行することを推奨しています。

耐障害性

Kafka はすべてのデータを主要なブローカーのストレージディスクに書き込み、それをさまざまなサーバーに複製します。サーバに障害が発生すると、複数のサブスクライバーがバックアップパーティションからデータを取得します。 

Kafka とは異なり、Redis はデフォルトではデータをバックアップしないため、ユーザーはこの機能を手動で有効にする必要があります。Redis はインメモリデータストアを使用するため、電源を切るとすべてのデータが失われます。これを回避するために、デベロッパーは Redis Database (RDB) の永続性を有効にして、RAM データのスナップショットを定期的にキャプチャしてディスクに保存します。 

使用場面の比較: Kafka とRedis Pub/Sub

大規模なデータセットをストリーミングし、高い復元性を必要とするアプリケーションを構築するには、Apache Kafka が適しています。Kafka は当初、通過する何兆ものメッセージを処理できる単一の分散データパイプラインとして開発されました。Kafka は、ノードに障害が発生した場合のデータ損失を防ぐために、異なるサーバーにパーティションを複製します。アプリケーション、モバイルのモノのインターネット (IoT) デバイス、およびマイクロサービス間のリアルタイム通信をサポートするため、組織は Kafka を使用します。また、ログ集約、ストリーム処理、その他のクラウドベースのデータ統合タスクにも適しています。

一方、Redis は、瞬時のデータ転送を必要とするが、わずかなデータ損失は許容できるアプリケーション向けに、超低レイテンシーのイベント配信を提供します。Redis は通常、頻繁にアクセスされるデータを保存したり、緊急のメッセージを配信したりするためのセッションキャッシュとして使用されます。また、ゲーム、e コマース、ソーシャルメディアのデータを保存するのにも適しており、よりスムーズなユーザーエクスペリエンスを実現します。

相違点の要約: Kafka とRedis Pub/Sub

 

Apache Kafka

Redis

メッセージサイズ

圧縮と階層型ストレージで最大 1 GB のメッセージサイズをサポートします。

より小さいメッセージサイズをサポートします。

メッセージの配信

サブスクライバーはキューからメッセージを取得します。

Redis サーバーは、接続されているサブスクライバーにメッセージをプッシュします。

メッセージ保持

取得後もメッセージを保持します。 

メッセージは保持されません。

エラー処理

メッセージングレベルでの堅牢なエラー処理。デッドレターキュー、イベント再試行、リダイレクト。

Redis 例外は、タイムアウト、クライアント制限、およびメモリバッファ容量を含むアプリケーションレベルで処理する必要があります。 

並列処理

Kafka は並列処理をサポートしています。複数のコンシューマーが同じメッセージを同時に取得できます。 

並列処理はサポートしていません。

スループット

非同期の読み取り/書き込みのため、高いスループットです。 

Redis サーバーが別のサブスクライバーにメッセージを送信する前に返信を待つ必要があるため、低いスループットです。 

レイテンシー

低レイテンシー。デフォルトではデータレプリケーションのため、Redis よりもわずかに遅いです。 

小さいサイズのメッセージを配信する際は超低レイテンシーです。

耐障害性

パーティションを異なるブローカーに自動的にバックアップします。 

デフォルトではバックアップされません。ユーザーは Redis の永続性を手動で有効にできます。小さなデータ損失のリスクがあります。 

AWS は Kafka と Redis の要件をどのようにサポートできますか?

Amazon Web Services (AWS) は、パブリッシュ/サブスクライブ (Pub/Sub) メッセージング要件をサポートする、スケーラブルで管理されたインフラストラクチャを提供します。 

Amazon Managed Streaming for Apache Kafka (Amazon MSK) を使用すると、大量のデータを簡単にリアルタイムで取り込んで処理できます。プライベートアクセス可能なデータバスを構築して、可用性の高いストリーミングノードを大規模に提供できます。また、AWS IoT CoreAmazon Virtual Private Cloud (Amazon VPC)Amazon Managed Service for Apache Flink など、他の AWS サービスとシームレスに接続できます。

Amazon MemoryDB を使用すると、Redis のワークロードに可用性の高いインメモリストレージを提供できます。同時実行数の多いストリーミングデータフィードを実行して、ユーザーアクティビティを取り込むことができます。また、1 日あたり数百万件のメディアとエンターテイメントアプリケーションのリクエストに対応できます。

Redis や Kafka の代わりに、Amazon Simple Notification Service (Amazon SNS) を使用して Pub/Sub メッセージングシステムを構築することもできます。スケーラブルで費用対効果の高い方法で、アプリケーションからお客様または他のアプリケーションに直接メッセージを送信できます。Amazon SNS には以下のような機能があります。

  • 分散システム、マイクロサービス、イベント駆動型サーバーレスアプリケーション間の高スループット、プッシュベース、多対多のメッセージング。
  • メッセージの暗号化とトラフィックのプライバシー。
  • AWS カテゴリ全体にわたるファンアウト機能。これには、分析、コンピューティング、コンテナ、データベース、モノのインターネット (IoT)、機械学習 (ML)、セキュリティ、およびストレージが含まれます。

今すぐアカウントを作成して、AWS で Pub/Sub、Redis、Kafka の使用を開始しましょう。