サーバー間通信でgRPCを採用しているProductも増えてる中で、BFFとbackendサービスを分けてマイクロサービス化を進めてる最近ですが。
直近2日程ハマった事象があり、同じ事象に遭遇した人の助けになればと思い書かせて頂きます。
環境
- 仕様言語: TypeScript
- Framework: nest.js v7.x
- 実行環境: docker(node:16)
発生した事象
普段はMacで開発しているのですが、諸事象によりWindows環境で開発をここ数日している中で発生しました。
ただし開発はrepositoryにコミットしてあるdocker内で開発するので特に問題はないはずでした。
開発の流れは以下に流れになります。
1. dockerで開発環境を作成(この時にgrpc関連と開発に必要なパッケージはインストールされます)
2. protoファイルに修正がある場合は修正を行う
3. ts-protoでprotoファイルからtsファイルを自動生成する
上記の3まで完了しgitの差分を確認した時に不思議な事が発生しました。
-import { Metadata } from "grpc";
+import { Metadata } from "@grpc/grpc-js";
意図しない差分が発生していて、調査をしてみると @grpc/grpc-js
は nest.js v8.x からの対応となっていました。
本番稼働しているシステムのフレームワークのメジャーバーションを上げるわけにもいかず、どうにか grpcパッケージ を指定できないか調査をしていた時に、一週間前にmacで同じ手順の作業をした時は問題がなかった事を思い出しました。
ts-protoで何か変更が直近発生した??
→ ありました原因が。(しかも一週間以内にリリースされていた...)
https://github.com/stephenh/ts-proto/releases/tag/v1.83.1
Bug Fixes
deprecated grpc and replace with @grpc/grpc-js (#362) (1a11b97)
対応作業
- packageのversionを固定して再インストールを実施
※npmの場合は適時読み替えて下さい
yarn global remove ts-proto
yarn global add ts-proto@1.83.0
- 再度protoからtsファイルを作成 → 差分なし
結論
nest.js v7.x系もしくは以下を使用していて、ts-protoでprotoファイルからtsファイルを作成している場合は、ts-protoのversionを v1.83.0 までで固定した方が良さそうです。
nest.js v8.x系の場合は、@grpc/grpc-js
を サポート しているので特に問題はなさそうですが。
それでも、ts-protoのversionは固定しておいた方が良さそうです。
特にdocker環境でチームメンバーに配布するなら特に良いかなと思いまいた。
※ grpcパッケージはdeprecatedステータスで @grpc/grpc-js への乗り換えが推奨されているので特別な理由がない限り乗り換えた方が良さそうです。
https://www.npmjs.com/package/grpc