GAE の SocketAPI とは何か?

存在は知っていたが、
普段 GAE を利用する上で特に利用する機会がなかったので、
SocketAPI について調べてみた。

SocketAPI

ドキュメントは以下。
https://cloud.google.com/appengine/docs/standard/go/sockets/

なぜか java は日本語。
https://cloud.google.com/appengine/docs/standard/java/sockets/

ドキュメントに書いてあるので説明不要だと思うが、
SocketAPI は、その名の通りソケット通信をする際に利用する API のこと。

java ドキュメントの一部を抜粋する。

・リッスンソケットは作成できません。作成できるのはアウトバウンドソケットだけです。
FTP はサポートされません。
・使用できるのは TCPUDP だけで、任意のプロトコルを使用できるわけではありません。

で、これは何に使うのか?
自分は普段 GAE を使っているものの使ったことがない。

利用用途としてパッと思いつたのが、
GAE から 外部環境の DB に接続する用途。
*あまりないケースだと思うけど・・・

ググってみると、それっぽいのが引っかかる。
https://groups.google.com/forum/#!topic/google-appengine/hmXkSr_EVvQ

以下は上記のスレッドで紹介されている mysql driver で、
GAE から外部の DB に接続するためのものらしい。
https://github.com/pjebs/GAE-Toolkit-Go/tree/master/sql

接続時に SocketAPI が利用されている。
https://github.com/pjebs/GAE-Toolkit-Go/blob/master/sql/sql.go#L44

少し古い記事だけど、
redis に接続する記事もあった。
http://www.xhroot.com/blog/2013/04/12/accessing-redis-from-google-app-engine/

GAE で外部通信といえば、
urlfetch パッケージを利用するが、
これは HTTP しか扱えないので、
その他の通信は SocketAPI を利用することになるのかな。

とはいえ、自分は GCP 上のサービスしか利用しないので、
あまり利用する機会はないかなーと思っている。


クオータ

クオータは以下になる。
https://cloud.google.com/appengine/quotas?hl=en#Sockets

SocketAPI を明示的に利用していないせいもあって、
クオータを意識したことはない。


GCPサービスとSocketAPI

最近知ったのだが、
GAE が GCP サービスと通信する場合、
内部で SocketAPI が利用されるケースがあるらしい。

パッと調べた限り、
以下の2つのパッケージを GAE で利用したところ、
SocketAPI のクオータが消費されていた。
*なぜこのパッケージを選択したのかは謎

1.cloud.google.com/go/datastore
2.cloud.google.com/go/logging

以前、
GAE Datastore と Cloud Datastore の golang パッケージって、
両方 GAE で使えそうなのに何が違うのだろう?
と思ったことがあった。

Cloud Datastore パッケージには、
Transaction.Commit(), Transaction.Rollback() のような、
GAE Datastore パッケージには存在しない API が実装されているので、
Cloud Datastore の方が高機能なパッケージだと思っていたが、
SocketAPI 経由でアクセスするかどうかの違いがあるみたい。

GAE では GAE Datastore パッケージを使った方がよさそう。

ところが、
全てのGCPサービスが SocketAPI 経由でコールされるわけではない。

試しに GAE から BigQuery にアクセスしても、
SocketAPI のクオータに変化はなかった。

BigQuery のソースをザックリと grep したところ、
BigQuery は urlfetch 経由でアクセスしているっぽい。
https://github.com/google/google-api-go-client/blob/3d8027ad5aac1c3f32ad0eeae4458a5d69682263/bigquery/v2/bigquery-gen.go#L6225-L6246

BigQuery アクセス後に urlfetch のクオータを確認してみると、変化があった。

一方、Cloud Datastore は grpc 経由でアクセスしていた。
https://github.com/google/go-genproto/blob/891aceb7c239e72692819142dfca057bdcbfcb96/googleapis/datastore/v1/datastore.pb.go#L1376-L1383

grpc を利用したアクセスだと、
SocketAPI が利用される or Socket利用 とみなされるみたい。

ザックリ grep しただけなので、
見当違いのコードを提示しているかもしれません。

この grep が正しいとした場合、
他のサービスは確認していないが、
以下のリポジトリ内にライブラリが存在するサービスは grpc 経由でアクセスしていると考えていいのだろうか?
https://github.com/google/go-genproto/tree/master/googleapis

リポジトリ内には pubsub パッケージがある。
pubsub は性質上、高トラフィックになりやすいと思うので、
注意した方がいいのかもしれない。

GAE から Cloud pubsub をガンガン利用する場合、
クオータを意識したことない とも言ってられない。

課金してないとエラー

ドキュメントにも明記してあるが、SocketAPI は課金を有効にしないと利用できない。

詳しくは覚えていないが、
課金無効状態で利用しようとすると、
TransientFailure 的なエラーが発生した気がする。

ついに自分も課金ユーザーになった。


まとめ

特にないです。
間違っていたら、twitter or この記事にコメントいただければと思います。