ttrpc
問題
無駄なリソースをさらに削減できる点では活用したいですが、公式のマニュアルなどが揃ってない、個人的にはわかりにくいサンプルコードから少しハードルを感じているかと思いました。実際やってみたところ想定以上時間がかかったため、手順など残しておきたいと考えてます。
ゴール
ttrpcのサンプルコードを変形してわかりやすく+すぐ動くようにチュートリアルを作りました。
動作確認と使っているライブラリなど確認できればと思います。
開発環境・ライブラリ
go 1.21.0
github.com/containerd/ttrpc v1.2.3
ttrpcのprotoファイル生成(プラグイン)
protoc-gen-go
とprotoc-gen-go-grpc
はインストール前提とします。
下記のコマンドからrrtpc
生成のためのプラグインをインストールします。
go install github.com/containerd/ttrpc/cmd/protoc-gen-go-ttrpc@v1.2.3
go install github.com/containerd/ttrpc/cmd/protoc-gen-gogottrpc@v1.2.3
指定しているv1.2.3
は最新バージョンとなります。
サーバーサンプル
ファイル構成
-server
| go.mod
| go.sum
| main.go
+ interfaces
| example.proto
| example.pd.go
| exmaple_ttrpc.pd.go
main.go(一部抜粋)
func server() error {
s, err := ttrpc.NewServer(
ttrpc.WithServerHandshaker(nil),
ttrpc.WithUnaryServerInterceptor(serverIntercept),
)
if err != nil {
return err
}
defer s.Close()
example.RegisterExampleService(s, &exampleServer{})
l, err := net.Listen("unix", socket)
if err != nil {
return err
}
defer func() {
l.Close()
os.Remove(socket)
}()
return s.Serve(context.Background(), l)
}
基本的な使い方はgRPCと違いないですが、サーバを開始する際に提供ライブラリを使います。
主にhttpサーバーのために記載かと思いますが、今回に関してはローカル環境のことで特別なファイルを扱います。
unix
タイプのファイルですが、詳しい説明は割愛あします。Posix関連書籍かマニュアルから確認可能です。
また、ネットワークポートの指定ではないため、ファイルパースを渡すことになります。
そのため、os.Remove
から使い終わったファイルを削除いてます。
クライアントサンプル
ファイル構成
-server
| go.mod
| go.sum
| main.go
+ interfaces
| example.proto
| example.pd.go
| exmaple_ttrpc.pd.go
main.go(一部抜粋)
func client() error {
conn, err := net.Dial("unix", socket)
if err != nil {
return err
}
defer conn.Close()
tc := ttrpc.NewClient(conn, ttrpc.WithUnaryClientInterceptor(clientIntercept))
client := example.NewExampleClient(tc)
r := &example.Method1Request{
Foo: "Foo",
Bar: "Bar",
}
ctx := context.Background()
md := ttrpc.MD{}
md.Set("name", "koye")
ctx = ttrpc.WithMetadata(ctx, md)
resp, err := client.Method1(ctx, r)
if err != nil {
log.Println("error")
return err
}
return json.NewEncoder(os.Stdout).Encode(resp)
}
クライアントもサーバー同様、gRPCと変わらないですが、接続部が異なります。
サーバー側で指定しているインタフェースとファイルパスを入れることで接続ができます。
動作確認
サーバー、クライアントから下記の結果が確認できました。
@iMac server % go run main.go
2024/05/04 21:05:28 server start
2024/05/04 21:05:34 server interceptor
map[name:[koye]]
{"name":["koye"]}
method1 call
クライアントから受け取ったパラメータを出力してます。
@iMac client % go run main.go
2024/05/04 21:05:34 client start
2024/05/04 21:05:34 client interceptor
map[name:[koye]]
{"name":["koye"]}
{"foo":"Foo","bar":"Bar"}
サーバー側にパラメータを送り、そのレスポンスを出力してます。
注意
ネットワーク通しのrpcではなく、主にローカルrpcを目的として使われるライブラリとなります。
もし、ネットワーク環境、セキュリティー要件などがある場合には通常のgRPCが適合しているかと思います。
protoインタフェースの全てではないと記載があったかと(確かではない)ので、一部、使えないインタフェースがあるかもです。
終わり
k8sランタイムの役割を行うcontainerd
のプロジェクトから作成されたライブラリとなります。
クラウド環境の運用業務を経験した方には見覚えのあるキーワードになるかと。
次は実際にどのぐらいコンピューター資源を軽減できるかも確認してみたいと考えてます。
今回使ったソースは下記のリポジトリとなります。ご参考にできればと思います。
あと、接続については一応、ローカル向けのrpcですが、ネットワーク通しでも使えます。
イントラー環境ならセキュリティー要件をクリアした前提ならアリかなと思います。