Open28

connect-goとかSpannerとか

takayatakaya

自分でconnectサーバーを作ろうとしたときに詰まったのでこちらでアウトプットしながら進めていく

takayatakaya

前提としてconnect-goを使う
protoファイルを作成し、そこからGoのインタフェースなどを自動生成
main.goでそれらを参照してサーバーを立ち上げる

takayatakaya

protoファイルは以下のような内容

syntax = "proto3";
package greet.v1;
option go_package = "example/gen/greet/v1;greetv1";
message GreetRequest {
  string name = 1;
}
message GreetResponse {
  string greeting = 1;
}
service GreetService {
  rpc Greet(GreetRequest) returns (GreetResponse) {}
}
takayatakaya

buf mod initbuf.yaml を作成後、buf.gen.yaml を自分で作成する

takayatakaya

なぜ buf.gen.yaml を自動生成するコマンドはないか

takayatakaya

buf.gen.yaml だけ作成すれば buf generate に成功した
buf.yaml を作成するのは必須ではなさそう

takayatakaya

とりあえず go mod init exampleexample を使えば問題なさそう

takayatakaya

connectサーバーを起動できた
全体的な流れはだいたい以下

  1. protoファイルを作成
  2. buf.gen.yaml を作って buf generate を実行し、xxx.connect.go と xxx.pb.go を作成
  3. 中身を実装した構造体を用意
  4. greetv1connect.NewGreetServiceHandler みたいなのに渡してhttpサーバー起動
  5. localhost:8080/greet.v1.GreetServer/Greet などにリクエスト
takayatakaya

xxx.pb.go にはやり取りするデータの型が定義されている
xxx.connect.go にはサーバーの実体を作る関数などが定義されている(ルーティングとか)

takayatakaya

xxx.connect.go は基本的に NewXXXServiceHandler() を使う目的でしかインポートしなさそう
xxx.pb.go はものすごく頻繁に使う)

takayatakaya

チュートリアルを進めただけなので自分で一から作ろうとすると躓く部分がありそう
けどそれは一旦スルーしてCloud Runにデプロイしてみる

takayatakaya

Spanner はもしかして重い?
Spanner のテーブルにデータを追加するだけで 200ms くらいかかった

takayatakaya

90日間無料のインスタンスだから何か制限されている?

takayatakaya

とりあえず Cloud Run にデプロイしても同じ結果になるかどうかを確認する

takayatakaya

Cloud Run にデプロイしても同じくらい時間がかかった
もともと100万件くらいのレコードが存在しているから重くなっている?
あまり関係なさそうだけどどうだろう
とりあえず全件削除して再計測してみる

takayatakaya

100万件を一気に削除することはできなさそう
(削除の場合は 80,000 件が上限)
Spanner という感じの制限
DELETE 文に WHERE が必須なのもなんか好き
あと WHERE 1 は構文エラーで、WHERE TRUE と書く必要がある(boolじゃないといけない)

takayatakaya

一旦テーブルを削除して再生成、その後レコードを挿入したが、やはり200msかかった
Goのコードの書き方が悪い?

takayatakaya

公式が「GORM で Spanner を使える」と言っている
https://cloud.google.com/spanner/docs/use-gorm?hl=ja
公式が GORM に言及しているのが意外だった

takayatakaya

ネストされたトランザクションがサポートされていないのが少し残念
Spanner は仕組みが複雑だから仕方がない気もする

takayatakaya

Spanner の DML とミューテーションはどう違う?

takayatakaya

DML だと早いのかと思ったけどそうでもなさそう
ミューテーションと同じで200msくらい

takayatakaya

DML の実行に100ms、トランザクションのコミットとかで100msかかっているっぽい

takayatakaya

Cloudコンソールで実行すると3msくらい
なぜこんなに差があるんだろう