GCPのCloud Pub/Subを使ってMessageのPulishとSubscribeをしてみる。
Cloud PubSubについては以下の公式ページに記載されている。
https://cloud.google.com/pubsub/overview
意訳したものを以下にまとめる。図などは公式ページから引用。
Cloud Pub/Subはスケーラブルでフレキシブル、そして信頼性のあるエンタープライズのメッセージングミドルウェア。多対多の非同期メッセージグングによってセキュアで高可用性のあるアプリケーションを開発できる。
パブリッシャーアプリケーションはメッセージを作成しTopicへメッセージを送信する。
サブスクライバーアプリケーションはTopicからメッセージを取得するためにサブスクリプションを作成する。
1対多や多対1、多対多のコミュニケーションが可能である。
- パブリッシャーアプリケーションはトピックを生成し、トピックへメッセージを送信する。メッセージはペイロードとオプションの属性を含む。
- メッセージはサブスクライバーからackが返されるまでmessage storeに保管される。
- Pub/Subサービスはトピックからのメッセージを各サブスクリプションにフォワードする。各サブスクリプションはメッセージをPub/SubからのPushもしくはサブスクライバーからのPullでメッセージを受取る。
- サブスクライバーはメッセージを受取り、ackをPub/Subサービスへ返す
- サブスクライバーからackが返されると、メッセージキューからメッセージが削除される。
メッセージの登録、取得、削除
Pub/SubのAPIは以下を参照
https://cloud.google.com/sdk/gcloud/reference/alpha/pubsub/
メッセージの登録
$ sudo gcloud components install alpha
$ sudo gcloud components install pubsub-emulator
GCPコンソール経由でCloud Pub/Subのトピックページにアクセスし、 トピックを作成する。
$ gcloud alpha pubsub topics create projects/{プロジェクト名}/topics/XXXX
サブスクリプションの登録
$ gcloud alpha pubsub subscriptions create projects/{プロジェクト名}/subscriptions/YYYY --topic projects/{プロジェクト名}/topics/XXXX --topic-project {プロジェクト名}
トピックへメッセージを登録
$ gcloud alpha pubsub topics publish {トピック名} '{"message":"Hello World!"}'
1 message(s) published.
- messageId: メッセージID
サブスクリプションからメッセージをpull
$ gcloud alpha pubsub subscriptions pull {サブスクリプション名}
┌────────────────────────────┬────────────────┬────────────┬───────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │
ACK_ID │
├────────────────────────────┼────────────────┼────────────┼───────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ {"message":"Hello World!"} │ 35010637313331 │ │ M0VBXkASTDoGRElTK0MLKlgRTgQhIT4wPkVTRFAGFixdRkhRNxkIaF
EOT14jPzUgKEUSAAgUBXx9cV9UdV1YGgdRDRlyfGRwawxCUwVMBypVWxENQGx-SwRUDRhye2JyaVsQAgFEe7DsyqM8Zhs9XxJLLD5-MQ │
└────────────────────────────┴────────────────┴────────────┴───────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────────────────────────┘
ACK IDを指定してトピックからメッセージを削除する。
$ gcloud alpha pubsub subscriptions ack {サブスクリプション名} {ACK ID}
1 message(s) acknowledged for subscription xxx
$ gcloud alpha pubsub subscriptions pull {サブスクリプション名}
Listed 0 items.
サブスクリプションからPULLするときに自動でACKを返して削除する。
$ gcloud alpha pubsub subscriptions pull --auto-ack {サブスクリプション名}
┌────────────────────────────┬────────────────┬────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │
├────────────────────────────┼────────────────┼────────────┤
│ {"message":"Hello World!"} │ 35009734804951 │ │
└────────────────────────────┴────────────────┴────────────┘
$ gcloud alpha pubsub subscriptions pull --auto-ack {サブスクリプション名}
Listed 0 items.