sano11o1

gRPCを使ってクライアントストリーミングを試してみる

公開日:

以前から名前は知っていたけど触ったことのなかったgRPCを触ってみたので備忘として残しておきます。

Zennの本を読みました。これさえ読めば大体概要は掴めると思います。
https://zenn.dev/hsaki/books/golang-grpc-starting

個人的なポイントは以下の通り

  • クライアントストリーミング、サーバーストリーミング、双方向通信を手軽に実装できる。
  • protoファイルを書いてprotocコマンドを実行するとProcedureを生成してくれる。
  • ストリーミング、通信の基盤となるロジックは生成されるので、ビジネスロジックを書くことに集中できる。


Zennの本を読み終わって自分でも何か作ってみたいと思ったので、ChatGPTに題材を考えてもらいました。



なかなか面白そう、、

というわけで、ログをクライアントストリーミングでサーバーに送信するコードを書いてみました。

リポジトリ -> https://github.com/sano11o1/snack_logger/

(Zennのコードちょっといじっただけじゃない??ってツッコミがありそう。それはそう)

おおまかな処理を書くと以下のようになる。

  • echoサーバーを起動する
  • echoサーバーがリクエストごとにストリームを作成、Handlerが吐き出すログをクライアントストリーミングし、サーバーに送信する
  • echoサーバーがレスポンスを返す直前にストリームを閉じ、それまでログを受け付けていたサーバーがechoサーバーにレスポンスを返し、echoサーバーがレスポンスを返す



(左がechoサーバー、右がログを受け取るサーバー)


一点問題があって、ログを送信する際にechoサーバー側では以下のように明示的にログ出力のためのメソッドを呼ぶ必要があり大変不便である。

if err := Info(fmt.Sprintf("Hello, World! %d", i), stream); err != nil {
      return err
 }


この問題を解決するにはechoサーバーの標準出力を監視する何らかの仕組みが必要になります。
例えばAWS Lambdaで吐き出したログは自動的にCloudWatchに転送されるけど、どういった仕組みになっているんでしょうかね、、
これはもはやgRPC関係ないですが面白そうなのでいつか試してみたいです。
それでは、また