web-dev-qa-db-ja.com

Redis Streams vs Kafka Streams / NATS

Redisチームは、Redis 5.0の新しい Streams データ型を導入します。 Streamsは最初のビューからKafkaトピックのように見えるため、実際の使用例を見つけるのは奇妙に思えます。

streams intro では、Kafkaストリームと比較しています:

  1. ランタイムコンシューマグループの処理。たとえば、3人の消費者のうちの1人が永続的に失敗した場合、Redisは1番目と2番目の理由で引き続きサービスを提供します。
  2. Redisのストリーミングははるかに高速です。これらはメモリから保存および操作されるため、これはそのままです。

Kafka、RabbitMq、NATSのプロジェクトがあります。 Redisストリームを「pre kafka cache」として、また場合によってはKafka/NATSの代替として使用することを試みています。現在最も重要なポイントはレプリケーションです。

  1. AOFレプリケーションを使用して、すべてのデータをメモリに保存します。
  2. デフォルトでは、非同期レプリケーションはXADDコマンドまたはコンシューマグループの状態変更がレプリケートされることを保証しません。フェイルオーバー後、スレーブがマスターからデータを受信する能力によっては何かが失われる可能性があります。これは、高負荷でストリームを試すために興味を殺すポイントのように見えます。
  3. SentinelまたはRedis Clusterが操作するRedisフェールオーバープロセスは、ベストエフォートチェックのみを実行して、最も更新されたスレーブにフェールオーバーします。特定の特定の障害では、一部のデータのないスレーブが昇格する場合があります。

そして、キャップ戦略。 Redis Streamsの実際の「上限付きリソース」はメモリです。したがって、保存するアイテムの数や使用する上限付き戦略はそれほど重要ではありません。そのため、消費者が失敗するたびに、ピーク時のメモリ消費量またはキャップ付きのメッセージが失われます。

KafkaをRTBビッダーフロントエンドとして使用します。これは、最大120バイトのペイロードで1秒あたり最大1,100,000のメッセージを処理します。 Redisでは、書き込み時に約170 mb /秒のメモリ消費があり、512 gb RAMサーバーでは、約50分間のデータに対して「予約」を書き込みます。このため、処理システムがこの時間オフラインになるとクラッシュします。

現実世界でのRedis Streamsの使用について詳しく教えてください。自分で使用しようとする場合もありますか?または、Redis Streamsをそれほど多くないデータで使用できますか?

12
misterion

久しぶり。これはredis-dbメーリングリストに属する議論のように感じられますが、ユースケースは魅力的に聞こえます。

Redis Streamsは、Kafkaの置き換えを意図していないことに注意してください。類似点にもかかわらず、異なるプロパティと機能を提供します。レプリケーションの非同期性に関しては当然です。使用可能な量RAMを使用するには、クラスターの使用を検討し、期間ベースのキー名にストリームを分割する必要があります。

4
Itamar Haber