😽
GRPCで標準以外のカスタムエラーを利用したい場合
GRPCのカスタムエラー
先日の仕事でgRPCのカスタムエラーについて確認したのでメモ
gRPCのエラーは17種類のメッセージがあります。
しかし実際のサービス運用で、404
だけどこの場合とこの場合でフロント側の処理を変えたいから何か判定返したいな。。。なんてことありませんか?
この場合は「grpc-status-details-bin」という箇所に詳細を入れることがよさそうです。
実際にテストコードを見てみたのですが確かにそのようなコードが見受けられました
it 'decodes proto values' do
rpc_status = Google::Rpc::Status.new(
code: 1,
message: 'matching message',
details: [simple_request_any, simple_response_any, payload_any]
)
rpc_status_proto = Google::Rpc::Status.encode(rpc_status)
code = 1
details = 'details'
metadata = { 'grpc-status-details-bin' => rpc_status_proto }
exception = GRPC::BadStatus.new(code, details, metadata)
expect(exception.to_rpc_status).to eq rpc_status
end
Base64
でエンコードされているため、取り出す際は注意してください
ただし、利用には注意が必要でこの実装はgRFCで使えるのですが、特に文書化されていないことを下記のissueで指摘されています。
This field is currently a supported feature of gRPC but its design / behavior is entirely undocumented. We need a specification for this feature to refer to users and to verify that our implementations are correct and complete. Unfortunately, since the current implementations (C/Java/Go/others?) were done without a spec/gRFC in place, we need to make sure the spec allows for all their behaviors.
考察
基本は17種類のエラーに合わせて、'grpc-status-details-bin'は極力使わずにクライアントのエラーも用意するべきかな〜とメンバーと議論しました。
特に実ユーザーに行動を促す際に詳細なエラー必要ですかね〜?あまり必要じゃないかなと考えています。もしこのあたり意見ある方いたらコメントいただけると嬉しいです。
参考
コチラの記事が大変参考になりました
Discussion