🐁

Go × gRPC を使って複数の画像を送受信する

2024/04/21に公開

はじめに

Go で実装されたサーバーにおいて画像を GET / POST (REST) する機能がありました。
REST を gRPC に置き換えようとしたとき、画像のような大きなサイズのデータのやりとりを行うとエラーが発生します。それを回避するために gRPC の stream を使うことにしました。が、複数画像の送受信を行う方法がわかりませんでした。そこで実際に手を動かして確かめたので備忘録として記事化しました。

gRPC

https://grpc.io/

gRPC は .proto ファイルとして仕様を定義しそこからサーバー・クライアントに必要なコードの雛形を生成します。実装においてあたかもローカル・オブジェクトであるかのように、別のマシンにあるサーバ・アプリケーションのメソッドを直接呼び出すことができます。

install tool version

go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

単数の送受信

以下のブログを参考にして実装させていただきました。

https://christina04.hatenablog.com/entry/handle-large-data-via-grpc

server

https://github.com/otakakot/sample-go-grpc-stream/blob/main/main.go#L60-L137

client

https://github.com/otakakot/sample-go-grpc-stream/blob/main/main_test.go#L17-L133

複数の送受信

単数の場合は分割でデータを送信してもどのデータであるか判別できます。しかし、複数となると判別できないのでは?と困りました。
が、シンプルに分割したデータであってもどのデータであるか判別できるように ID を振り分類して受信するようにと実装しました。

server

https://github.com/otakakot/sample-go-grpc-stream/blob/main/main_test.go#L17-L133

client

https://github.com/otakakot/sample-go-grpc-stream/blob/main/main_test.go#L17-L133

テストコードにてオリジナルの画像データがサーバーでの送信・受信 / クライアントでの送信・受信のデータと同じであることを検証しています。

おわりに

今回実装したコードは以下に置いておきます。

https://github.com/otakakot/sample-go-grpc-stream

Discussion