RedisとKafkaの違い[クローズ]


91

Redisは、Kafkaと同じようにリアルタイムのpub-subとして使用できます。

どちらをいつ使うか迷っています。

どんなユースケースでも大いに役立ちます。


15
この質問が「意見ベース」としてクローズされた理由がわかりませんか?2つの間に客観的な技術的な違いがあり、既存の回答はそれらの違いを明確に概説しています。
デビッドアンダーソン

回答:


143

Redis pub-subは、ほとんどの場合、作成したすべてのメッセージがすべてのコンシューマーに一度に配信され、データがどこにも保存されないファイアアンドフォーゲットシステムのようなものです。Redisに関してメモリに制限があります。また、プロデューサーとコンシューマーの数がRedisのパフォーマンスに影響を与える可能性があります。

一方、Kafkaは、キューとして使用できる高スループットの分散ログです。ここでは、任意の数のユーザーが生産でき、消費者はいつでも好きなときに消費できます。また、キューを介して送信されるメッセージの永続性も提供します。

ファイナルテイク:

Redisを使用する:

  1. 火事が必要で、作成したすべてのメッセージが即座に消費者に配信されるようなシステムを忘れた場合。
  2. 速度が最も懸念される場合。
  3. データの損失に耐えられるかどうか。
  4. 送信されたメッセージをシステムに保持させたくない場合。
  5. 処理されるデータの量は膨大ではありません。

kafkaを使用する:

  1. 信頼性が必要な場合。
  2. 消費後も送信されたメッセージのコピーをシステムに持たせたい場合。
  3. データの損失に対応できない場合。
  4. 速度が大きな問題ではない場合。
  5. データサイズが大きい

74
主な違いの1つは、Redis Pub / Subがプッシュベースであるのに対し、Kafka Pub / Subはプルベースであるということです。つまり、Redisに公開されたメッセージは自動的にサブスクライバーに即座に配信されますが、Kafkaではデータ/メッセージがコンシューマーにプッシュされることはなく、コンシューマーはメッセージを処理する準備ができたときにメッセージを要求します。cloudkarafka.com/blog/... kafka.apache.org/documentation.html#design_pull

これを読む:redis.io/topics/persistence送信されたメッセージを保持することは私には可能であるように思われます。私が間違っている?
デビッド・D.

1
@DavidD:提供したリンクredisは、送信れたがまだ処理れていないメッセージがの再起動後に失われないように構成する方法を説明していますredis。それは可能ですが、箱から出しredis保持する(または@Karthikeyanの単語を再利用し続ける)ことはできません。
ヨウネス

12

Redis 5.0以降のバージョンは、ストリームデータ構造を提供します。これは、配信が保証されたログデータ構造と見なすことができます。これは、コンシューマーがプロデューサーによってストリームに追加された新しいデータを待機できるようにする一連のブロッキング操作を提供し、それに加えて、コンシューマーグループと呼ばれる概念を提供します。

基本的に、ストリーム構造はKafkaと同じ機能を提供します。

これがドキュメントhttps://redis.io/topics/streams-introです

この機能をサポートする最も人気のあるJavaクライアントは2つあります。RedissonとJedisです。


1
ニキータ自身:)エレガントなライブラリ!使い始めたばかりです。よく構成され、考え抜かれた!あなたは天才です!
MMM

@mmmありがとうございます!
NikitaKoksharov20年

適切な使用とそうでないことに関していくつか質問がありますが、間違った仮定をすることを恐れていますか?おそらく、SOでここに追加した2つの質問を確認できます。また、Skypeにあなたを追加して、問題がなければ時々気になることもあります。私はそれをどのように使いたいかについての洞察を提供することができます。完全な初心者ではありません:)
mmm20年

たとえば、私は現在、cachableマップを作成しています...ランタイムIDをキーとして使用し、システムが現在処理しているもののリストをdequeから追加しています...リスト、私は推測するためにArrayListを作成できます、redissonは内部で変換すると思いますが、変換せずにredisslonリストを作成する場合は、名前を付ける必要があります。それでは、そのリストに内部的にどのような名前を付けますか?ランダムID?APIにはユースケースがあるので、createList、createMapなどの少ないパラメーターも提供しないでください。
MMM

確かに私はrandomUuidを送ることができますが、redissonが良い名前ジェネレーターを持っていることを知っておくといいでしょう。また、「取得された」要素を含むマップによってバックアップされた、redissondequeを含むバッチジョブを処理するための独自のDequeを作成しています。8つのスレッドごとにキューを処理する10のシステムがあり、核爆弾が発生した場合、それらは取得されたが完全には処理されていないため、すべて失われ、未処理のままになります。
MMM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.