つかびーの技術日記

情報系修士卒のWeb系技術日記です。現在のフォーカス分野はアドテクです。

Google Cloud Pub/Sub Java Client Library 入門 (サンプルはScala)

      2017/07/18

今回はGoogle Cloud Pub/SubのJava Client Libraryについてまとめていきます。これを使って実際にPub/Subを操作します。

前回:Google Cloud Pub/Sub 入門

クイックスタートのサンプルコード

クイックスタート: gcloud コマンドライン ツールの使用

クイックスタートにJavaコードが載っていますが、部分的なので完璧ではありません。SDKに慣れている人には良いのですが、自分の場合、認証からわからなかったのでいろいろ調べました。

その辺りから説明します。

ライブラリの解説とビルド

Cloud Pub/Sub Client Libraries

まずは詳しく解説しているページがあるのでこちらをご覧ください。

Client Libraryのコードは以下で公開されています。Issueも管理されているので困ったら調べると良いかもしれません。

https://github.com/GoogleCloudPlatform/google-cloud-java

PubSubはこちらです。

https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-pubsub

mavenはこちらです。

https://mvnrepository.com/artifact/com.google.cloud/google-cloud-pubsub

自分のユーザによる認証あるいはサービスアカウントのcredentialファイルによる認証

コードを書く前にまずは認証について説明します。

PubSub Topicにメッセージを送信するコードを動かす時、当然ですが、認証が必要です。GCE上などの場合はインスタンスのロール(?)によって認証突破しますが、自分のローカルPC上やオンプレミス環境ではそうはいきません。

そこで、上記のページでも解説されていますが、以下のコマンドを実行します。

credentialファイルが生成されます。これによってClient libraryが認証を突破できるようになります。(Client Libraryを使う時、上記のapplication_default_credentials.jsonを自動で読み込む)

この方法はローカルPC上での開発には良いですが、STGやPRD環境には向きません。このようなケースではサービスアカウントを使います。

ちなみに認証なしでプログラムを実行すると以下のような例外が出て、GCE上で実行するかGOOGLE_APPLICATION_CREDENTIALS環境変数を設定しろと言ってきます。この環境変数に設定するものがサービスアカウントのcredentialファイルのパスです。

サービスアカウントの作成はこのあたりを参照してください。

https://cloud.google.com/iam/docs/creating-managing-service-accounts?hl=ja

それほど難しくないのでGUI上でやっても良いと思います。

以下のように必要事項を入力して作成します。

サービスアカウント名はpubsubとしましたが、本来はこのアカウントを利用するアプリケーション名が良いと思います。(アプリごとに権限を分けるはずなので)

役割はPub/Sub管理者としておき、絞っておきます。(他のGCEなどを操作する権限は不要なので)

秘密鍵をJSONで生成します。credentialファイルをDLできるはずなので、DLしたらローカルPC上の適当な場所に保存し

というように、DLしたファイルのパスを指定して環境変数を作ります。

これで認証は完了です。

あとは予めTopicとSubscriptionを作成しておきます。

次から実際にコードを書いていきます。

Publisherコード

maven, gradle, sbtなどでclient libraryの依存を書いて、以下のようにコードを書きます。以下はScalaですが、Javaなどでもほぼ同じです。

実行結果。

publishできました。

Subscriberコード

実行結果。

取れました。簡単ですね。

解説

特にありませんが一応少し補足します。

これはOAuth2によってaccess tokenを得る時に、権限をpubsubだけに絞っています。・・・がscopeの指定はレガシーな方式で、現在ではGCPにもIAMがありますので(実際今回Roleを使った)、必ずしも必要ではないようです。

これは内部的にはcom.google.api.core、つまりGoogle Guavaです。詳細はリンク先のGitHubからどうぞ。

Subscriberの方でconsumer.ack()を行っています。これを忘れるとデータが再送され続けてしまうのでご注意ください。

Publisherの方でデータを流し続けている状態でSubscriberを停止しようとしてもなかなかアプリが停止しないと思います。(SIGTERMを受け付けてもすぐに停止しない)

これはどうやらバグのようで以下のようなIssueがあがってました。

Cannot stop subscriber

その他

Kinesis Client Libraryよりも簡単に書けそうな印象を受けました。Kinesis Client Libraryの方がモデルが少し複雑です。CheckpointのタイミングやShutdown時の処理、Workerの概念と何を行っているか把握する必要があるなど注意点が多かった覚えがあります。Pub/Sub Client Libraryは運用してはいませんが、調べた限りでは特に罠もなく、使いやすい印象を受けました。あえて言うならアプリの処理内容によってackを返すタイミングと応答受付期限に気をつける必要があるくらいでしょうか。まあ期限内、かつ最後にack返すだけですが・・・。

今回は使いませんでしたが、Topicを作成する操作なども行えるようです。

まとめ

Pub/Sub Client Libraryの紹介やリファレンス、認証、簡単な使い方について説明しました。

次回は複数のProject間でのPub/Subの操作・認証について解説していきます。

次回:Google Cloud Pub/Sub を複数のProjectにまたがって利用する。またそのときの課金について

 - Scala, クラウドサービス, ライブラリ , ,