💬

[GCP] Pub / Subを例え話を用いて解説してみた

2024/01/25に公開

GCPのサービスとしてしばしばPub/Subという名前が出てきます。
こやつが一体なんなのかということを今回は完璧に理解してやろうと思います。

Pub/Subの全体像

ということで何もわからない状態からPub/Subというものがなんなのかを調べていくと、
異なるアプリケーションやサービス間でメッセージをリアルタイムに配信するためのメッセージングサービスと書かれています。

メッセージングサービス???

メッセージングサービスってなんや?

さらに調べていくと、メッセージングサービスとは非同期で一時的にデータを溜めておくことができる場所ですと。。。

少し稚拙な解釈ですが、郵便局のようなものと理解しましょう。

AさんとBさんが直接やりとりしているよりかは、Aさんが送りたいものは一旦郵便局に送っちゃいましょう!というようなものですね。
そこで一時的に預かってくれるのが郵便局=Pub/Subです。

届け先であるBさんには自動で後ほど届けられます。← これをPub/Subでは非同期のpush型の処理になります。
逆にBさんが郵便局にとりにいくこともできます。たまに郵便局で預けられているものをとりに行くことがありますよね?← これをPub/Subでは非同期のPull型の処理になります。

なんとなく分かってきましたね。

Pub/Subの重要性

じゃあこの郵便局であるPub/Subが何故必要になってくるのか?

Pub/Subでよく言われるキーワードとして、"疎結合"という言葉が用いられます。

んま結合しているようで、結合していないという状態ですね。

これをアーキテクチャで言うと、システムAとシステムBがあった時に、どちらも結合されていてお互いに制御しあっていると言う関係性の場合、拡張性、保守性、可用性という観点でいくつか課題が生じるわけですねー。

もう少し詳しく解説します!

拡張性の観点でいうと、システムAとBが疎結合の場合、いわゆる結合していそうで結合していないので、Bだけを拡張する!もしくは刷新する。新しいバージョンに上げる等がしやすくなります。

ビルで例えると分かりやすいかもですね、下の画像のようなAとBがはほとんどくっついた状態のビルを想定してみましょう!
お互いに行き来しやすいビルなんですが、どちらか一方を改装したり、増築したりするのはかなり難しくなります。

しかし、AとBがそれぞれ異なる棟として存在した場合はどちらか一方を増築したりするのがかなり容易になります。そんな疎結合な状態を保ってくれるのがPub/Subというわけです。

この例からわかるように、保守性や可用性も上がってくるわけです。

ビルAがもし焼けてしまっても、ビルBは残り続けるので、最低限のサービスレベルを保証することができる。

そんなところがPub/Subのいいところなわけです。

コンポーネントの説明

それではどのように疎結合を実現しているのか

主要コンポーネント

、Pub/Subのコンポーネントを見ていきましょう!
以下の図のように、Publisher (Producerとも呼ばれる) 、Topic (Queueとも呼ばれる)、Subscriber(Consumerとも呼ばれる)の3つに分かれます。むしろこの3つだけ覚えておけばOKデス ← いきなり外国人www

トピックとは
Queueとも呼ばれるものですが、例えていうと、掲示板みたいなものです。
掲示板には名前があって、そこにメッセージを書き込むことができ、複数の人が同じ掲示板に書き込みしたり読んだりすることができるわけです。

サブスクライバー
掲示板の新着メッセージを受け取る人のことで、複数の人が同じ掲示板の新着メッセージを受け取ることができます。
新着メッセージを受け取るだけではなく、直接掲示板に見に行くこともできます。
受け取ったメッセージは、自分の好きなように処理できる。そんな感じのものです。

そして、サブスクライバーと一緒に覚えておきたいのが、サブスクリプションというワード!
サブスクリプションとは掲示板のお知らせ機能みたいなもので、自分が興味のある掲示板の新着メッセージを自動的に受け取る設定ができると言ったものです。複数のお知らせ設定を作って、特定の条件に合致するメッセージだけを受け取るみたいなことも可能なわけです。← 想像しやすくなってきた!

パブリッシャー
要は掲示板に書き込みをする人で、基本書いていいよという権限がある人は誰でもこの掲示板にメッセージを同時に残すことができます。ただし、ルールを守ってねということで、例えば、文字、画像、動画、音声などが書き込めます。

その他のコンポーネント

クライアントライブラリ
クライアントライブラリとは、コーディングをしているときにあっPub/Subからこの情報を取得したいなー。どうやってプログラムの中に組み込もうかなーと迷った時に使えるものです。
クライアントライブラリを使用すると、誰でも簡単に掲示板に書き込みしたり新着メッセージを受け取ったりすることができるものです。いろんなプログラミング言語に対応した説明書があるわけです。

エンドポイント
掲示板への入り口。掲示板にアクセスするには、この入り口を通る必要がある。
複数の入り口があって、それぞれ使い方が違う場合もあり。

プロジェクト
これはいわゆるGCPのプロジェクトで、複数の掲示板をまとめて管理するための単位であります。
掲示板の作成、削除、アクセス権限の設定などをプロジェクト単位で行う。

クォータ
掲示板への書き込み数や新着メッセージ受け取り数に上限を設けることができます。
上限を超えると、書き込みや受け取りが制限される。プロジェクトごとに設定される。

サブスクリプションタイプ

上でも言ったように、サブスクリプションとは掲示板のお知らせ機能でしたね。
このサブスクリプションには3つのタイプがあります。

・Pushタイプ
・Pullタイプ
・エクスポートタイプ

  • BigQuery サブスクリプション
  • GCS サブスクリプション

参考URl

https://blog.g-gen.co.jp/entry/understanding-loosely-coupled-architecture#保守性の向上

Discussion