Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

Redis Pub / Sub:イントロガイド

パブリッシュ/サブスクライブ(またはパブ/サブ )は、何十年にもわたって使用されてきたソフトウェアエンジニアリングのパターンですが、多くの場合、専用のメッセージングサーバーと専門知識が必要です。

Redis pub / subは、2.0リリース以降すべてのRedisサーバーの機能であるパブリッシュ/サブスクライブパターンの無駄のないシンプルな実装です。つまり、Redisがデプロイされている場所ならどこでも簡単に使用でき、Redisをデプロイすることで高速でシンプルなpub/subシステムをすばやく構築できます。

Redis pub / subがアプリに適しているかどうかを理解するには、まずpub / subの設計と目標を理解してから、Redis pub/subの実装の詳細を検討することが重要です。

パブ/サブの概要

パブ/サブデザイン:「パブリッシャー」と「サブスクライバー」の分離

依存関係を減らし、知識を区分化することは、スケーラブルなソフトウェアを設計する際の重要な目標です。パブリッシュ/サブスクライブメッセージングパターン、別名pub / subは、ソフトウェアのパブリッシュ部分を分離します。 作用するソフトウェアの部分からのメッセージ メッセージ。これをよりよく理解するために、いくつかの例を見てみましょう:

「パブリッシャー」の例
  • チャットルームにメッセージを送信できるアプリ
  • ヘルスまたはサービスを通知するDockerコンテナ
  • 株式取引の価格を発表するアプリ
  • 読書を発表する自宅の温度センサー
  • マルチユーザーゲームのメッセージ放送局(「エロンはグルーに食べられた」)
「サブスクライバー」の例
  • チャットルームでメッセージをリッスンするアプリ。
  • 通知をSlackに転送するアプリ
  • モバイルクライアントは、リアルタイムで何が起こっているかを確認するために使用されていました
  • 後で分析するためにイベントを記録するログサービス

pub / subパターンは、サブスクライバーについてあまり考えないようにするのに役立ちます。 パブリッシャーで作業する場合 、 およびその逆。上記の例では、いくつかのサブスクライバーが1つのパブリッシャーからのメッセージに関心を持っていることを想像できます。サブスクライバーは、すべてを聞きたいと思うかもしれません。 出版社。

pub / subでは、パブリッシャーはサブスクライバーについて知る必要はありません。メッセージをチャネルにプッシュします。 (トピックと呼ばれることもあります 他のシステムでは)そしてmoveson。メッセージが公開されたときにそのチャネルでたまたまリッスンしているサブスクライバーは、メッセージを受信します。

サブスクライバーは、1つ以上のチャネルをリッスンし、メッセージが着信したときにそれに反応するように設計されています。サブスクライバーが公開されたメッセージのペースに追いつかない場合、一部のメッセージを見逃します。これは便利な設計です。システムを低速のサブスクライバーの容量を超えて拡張できます。パブリッシャーは、サブスクライバーの動作によって速度が低下することなく、迅速に移行できます。

Pub / subの目標:ワークロードではなく配信のスケーリング

Pub / subは、スケーリングソフトウェアで使用されるパターンです。どのようなスケーリングが役立つかを理解することが重要です。重要な違いは、pub/subandメッセージのキューイングです。 。

キューイングパターンでは、キュー(またはリスト In Redis)は、ワーカーのプールがリストからアイテムをポップして処理している間、処理されるメッセージをバッファリングします。このモデルでは、ワーカーのプールのサイズをスケーリングすると、各メッセージが1人のワーカーにのみ渡されるため、キューを処理する速度がスケーリングされます。すべてのワーカーは、特定のメッセージをまったく同じ方法で処理します。

一方、pub / subでは、システムはすべてのチャンネルのメッセージをすべてのサブスクライバーに配信しようとします。これは多対多のパターンであり、さまざまなサブスクライバーがメッセージに対して独自の処理を行います。1つは永続的なログに書き込み、1つはSlackチャネルに送信し、もう1つはローカルセールスオフィスでベルを鳴らします。

>

つまり、pub/subはメッセージdeliveryをスケーリングします 、およびキューイングはメッセージをスケーリングしますワークロード処理 。 Redisは、これらの両方の目標に頻繁に使用されます。 Redisを使用したキューイングの一般的な例については、Sidekiqを参照してください。

Redis pub/subの詳細

Pub / subは非常に長い間存在しているパターンであり、コアパターンは同じですが、特定の機能は実装ごとに大幅に異なります。

Redis pub / subは、軽量で高速な実装です。その設計を最もよく理解するには、ないいくつかの機能を確認すると便利です。 Redis pub / subの一部:

  • 永続性や値のキャッシュはありません
  • 配達保証はありません
  • クラスターの最適化はありません…まだ

永続性なし:「しかし、チャットルームのようだと思った…」

ディスクに書き込まれる可能性のあるほとんどのRedis操作とは異なり、Redispub/subは非永続的です。公開されたメッセージはサブスクライバーに直接渡されてからドロップされ、Redisのメモリやディスク上にレコードは保持されません。

これは、Redis pub/subがチャットルームの実装によく使用されると聞いた新しいユーザーにとっては混乱を招く可能性があります。私たちの多くは、Slackのようなツールをチャットルームと考えています。ログインして最近のメッセージを確認してから、すべての新しいメッセージを受信します。実際、「最近のメッセージを表示する」はpub / subの一部ではなく、別の方法で処理する必要があります。 Pub / subは、新しいメッセージの配信のみを容易にします。この意味で、pub / subはライブストリームのようなものです。オンにすると情報を取得し始めますが、オンにする前に何が起こったのかについては何も学びません。余談ですが、インターネットリレーチャット(IRC)は、履歴やメッセージの保持が組み込まれていないpub / subモデルを使用します。そのため、チャットルームのメタファーは非常に一般的です。

実際、Redisとpub/subを使用してチャットルームを実装することもできます。そうすることで、メッセージが公開されるだけでなく、リストにもプッシュされるようになります。 ユーザーがメッセージ履歴を確認できるようにします。

配達保証なし

サブスクライバーは、pub/subモデルでメッセージを受信することが保証されていません。サブスクライバーにネットワークの問題がある場合、メッセージを十分に速く読み取れない場合、またはメッセージが公開されたときに添付されていないように見える場合は、メッセージを受信しません。サブスクライバーがリッスンしていない場合でも、パブリッシャーはチャネルにメッセージを送信できます。これらのメッセージはドロップされます。

他の特定のメッセージングシステムは、開封確認または「確認応答」を使用するか、短期間の切断を防ぐためにサブスクライバー用のバッファーを保存する場合があります。Redisはここで簡単なオプションを選択します。メッセージを見逃した場合、メッセージを見逃したことになります。 必須のメッセージ 受信者に到達するには、他の方法で配信する必要があります。

このトレードオフは、実際よりも悪いように聞こえます。メッセージの確認応答とサブスクライバー固有のバッファリングを削除すると、Redis pub/subはメッセージを非常に処理できます。 迅速に、そして晴天のメッセージ配信から恩恵を受ける多くのシステムがあります。

今のところ、非効率的なクラスタースケーリング…

Pub / subはスケーリングのソリューションであるため、メッセージだけでなく、メッセージの配信に使用しているサービスもスケーリングすることを検討することが重要です。RabbitMQやKafkaを含む多くのメッセージングシステムは、高可用性と妥当なスケーリングプロパティを実現するように設計されています。メッセージングサービスのセットアップが拡大します。

Redisクラスター(3.0以降のRedisの一部)には、Redis pub / subのサポートが組み込まれていますが、重要な注意事項があります。公開されたすべてのメッセージは、Redisクラスターのすべてのメンバーにブロードキャストされるため、大規模なクラスターがトラフィックに圧倒される可能性があります。

これに対する簡単な答えは、個々のRedisサーバーまたは小さなpub/sub固有のクラスターでのみpub/subを使用することです。これらのオプションはどちらも、多数のメッセージを処理できます。長期的なRedisClusterには、必要な場合にのみメッセージをルーティングするためのよりスマートな機能がありますが、その機能はまだ設計段階にあります。

まとめ

全体として、Redis pub / subは、ソフトウェアをスケーリングするための便利なツールです。上記で確認した各機能がないことは設計上のトレードオフであり、すべてのメッセージング目的の万能薬であるという犠牲を払って、Redisのシンプルさとスピードをもたらします。

Redisの他の多くの部分と同様に、すべての特殊なユースケースに合わせて調整されているわけではありませんが、少し理解すれば長い道のりを歩むことができます。 Redisの他の機能と組み合わせると、開発者のツールベルトで非常に強力なツールになります。

その高レベルの概要が完了したら、おそらくいくつかのpub/subコードの例を見る準備ができています。 Redis Pub / Sub:HowTonextをご覧ください。


  1. Redis SUBSCRIBE – redis pub/subで複数のチャネルをサブスクライブする方法

    このチュートリアルでは、redis-cliを使用してredisメッセージブローカーシステムで複数のチャネルをサブスクライブする方法について学習します。 SUBSCRIBEコマンド SUBSCRIBEコマンドは、redisメッセージブローカーシステムで指定された1つ以上のチャネルにクライアントをサブスクライブするために使用されます。クライアントがサブスクライブコマンドを実行すると、サブスクライブされたチャネルをリッスンするサブスクライブ状態になります。他のクライアントによって指定されたチャネルに公開されたメッセージは、redisによってサブスクライブされたすべてのクライアントにプッシュされま

  2. Redis Jedis pubsub-jedisライブラリを使用してpub/subシステムを実装する方法

    このチュートリアルでは、Jedisライブラリを使用してredispubサブシステムを実装する方法について学習します。 ジェダイライブラリ Jedisは、redisデータストア用のJavaクライアントライブラリです。小さくて非常に使いやすく、redis 2.8.x、3.x.x以降のデータストアと完全に互換性があります。 jedisライブラリの詳細についてはこちらをご覧ください。 Redis Pub / Sub System Redisは、パブリッシュ/サブスクライブメッセージングパラダイムを実装します。このメッセージングパラダイムによれば、メッセージの送信者(発行者)は、メッセージ