NATSのアーキテクチャをサクッと理解する:シンプル・高性能・セキュア・スケーラブルなpub/subミドルウェア
NATSとは、シンプル・高性能・セキュア・スケーラブルなpub/subミドルウェアです。国内ではMirrativなどで導入事例があります(公開情報による)。
本記事では、このNATSのアーキテクチャについて、公式ドキュメントに基づき簡潔に説明します。
NATSを構成する2つのコンポーネント
NATSはCore NATSとJetStreamからなります。Core NATSはat-most-onceなpub/subで、JetStreamはat-least-onceなpub/subです。なおメッセージの永続化は後者によって実現されており、これによってat-least-onceが担保されていると言えます。
※at-most-onceとat-least-onceの違いについてはこちらをご参照ください。
Core NATS
NATSクライアントとNATSサーバーの通信
Image from nats-io/nats-general, Apache Licensed, available at https://github.com/nats-io/nats-general/blob/main/architecture/images/simple1.jpg.
NATSクライアント間のpub/subはNATSサーバーによって仲介されます。
NATSクライアントとサーバーはTCPを介して通信し、アプリケーション層ではNATSプロトコルが使用されます。通常、この通信にはクライアントライブラリが用いられ、数多くの言語向けにこれが用意されています。
NATSサーバーのクラスタリング
Image from nats-io/nats-general, Apache Licensed, available at https://github.com/nats-io/nats-general/blob/main/architecture/images/cluster.jpg.
高可用性とスケーラビリティのために、NATSサーバーはフルメッシュなクラスタリングをサポートしています。
NATSサーバーのクラスタリングに用いられるプロトコルは、クラスターのトポロジとその変更を、そのクラスタのサーバーとクライアントにリアルタイムで伝播することを可能にしています。
NATSクライアントからするとクラスターは単一の存在のようなものです。NATSクライアントはクラスターのうち1つのサーバーに接続しますが、前述のプロトコルによって完全なクラスタートポロジを受信します。これにより、もし接続サーバーがクラッシュしたりネットワーク分断が生じた場合、クライアントは他の健全なサーバーに接続します(フェイルオーバー)。
JetStream
※本記事の基となっている公式ドキュメントではat-least-onceなpub/subを実現するコンポーネントをNATS streamingと呼称していますが、現在ではJetStreamと改称されています。
Image from nats-io/nats-general, Apache Licensed, available at https://github.com/nats-io/nats-general/blob/main/architecture/images/streaming1.jpg.
JetStreamクライアント間のpub/subは、Core NATSをインフラストラクチャとして、JetStreamサーバーによって仲介されます。JetStreamサーバーはCore NATSの文脈ではいちNATSクライアントであり、いわばJetStreamはCore NATSを下部層とした上部層のコンポーネントです。
なお、JetStreamサーバーはプロセス空間内にNATSサーバーを起動するため、スタンドアロンで稼働することもできます。
JetStreamクライアントがpublishまたはsubscribeすると、at-least-onceを担保するために、JetStreamサーバーは永続化が完了した確認応答を返します。メッセージの永続化は、JetStreamサーバーが責務を負っています。
Discussion