新しいブログのリンクはこちらになります。 はてなブログでも不自由はないのですが、自分でホスティングしてみたいのが理由で移転を決意しました。
宜しくお願い致します。
「おれは プルリクエストが送られてきたと思ったら いつのまにかスカウトメッセージを読んでいた」な… 何を言っているのか わからねーと思うが、おれも 何をされたのか わからなかった…頭がどうにかなりそうだった… Linkdinだとかスカウトメールだとかそんなチャチなもんじゃあ 断じてねえ もっと恐ろしいものの片鱗を 味わったぜ…
私の GitHub repository に中国企業からスカウト Pull Request が届いた。
送り主の contribution を見ると 1 日で 700 件以上(8/31 21:43 現在)の contribute に成功してる。
Web アプリケーションで error code, error message を返したくなる時があるはずです。HTTP JSON API とかでたまに見るのは status code が 200 なのに error が返ってくるものです。gRPC ではどうすれば良いのでしょうか。基本をおさらいしつつ浅く考えてみます。
成功すると response と status code OK
が返ってきます。
何かしらのエラーが発生すると OK
以外のエラー status code が返ってきます。statuscodes.md にも記載されてますが、これらのコードは必ずしも server から返るわけではなく、client 自身が返す場合もあります。
基本的には gRPC アプリケーションで発生したエラーによって status code を変更するような設計にするかと思います。しかし、時には gRPC server (low level) で発生したエラーとアプリケーションのロジックで発生したエラーを分けたい & client にそのエラーの詳細を伝えたいといった事があるかと思います。そのような時は Richer error model を採用しましょう。
Google では開発に使用しているエラーモデルが存在します。このモデルに記述されている details
がどんなエラーが発生していたのかを詳しく表現できるようなフィールドになってます。Google では一般的なエラーのニーズ(リトライ情報、不正なパラメータの情報など)をカバーできるように proto が定義されてます。これらのような proto を details
のフィールドへ格納することで表現することができます。
gRPC ではこのモデルに沿ってエラーを返せるようになってます。エラー詳細は response に付属される metadata 内に details
というキーに対して格納されて返ってきます。
{"metadata":{},"code":5,"details":"sql: no rows in result set"}
details
というキーに対して格納されて返ってくるもちろん Google が定義した proto メッセージではなく、自前で proto を定義するのもありでしょう。
OK
以外はエラーとして扱うことを推奨されてるgRPC の server, client の挙動の確認ができる testing-grpc というものを作りました。このプロジェクトは grpc/grpc-go を使って開発されてますが、他の言語で(例えば PHP)実装された gRPC server, client にも同様の知識を応用できるのではないかと考えてます。
(もし宜しければ github star をお待ちしてます)
mac を開発端末にしたいけど xcode をインストールしたくないという場合、xcode を appstore からインストールするのではなく、command line tools のみをインストールする必要がある。
インストールするために xcode-select -- install
を実行する。これをやることで mac 上で homebrew が使えるようになったりする。
私の環境には homebrew 経由でインストールした lldb (/usr/local/opt/llvm/bin/lldb
) があった。最近 neovim のコードを読むことにハマってるので久しぶりにデバッグするしようとしたら次のエラーメッセージが表示された。
$ lldb -p $(pgrep nvim) (lldb) process attach --pid 35912 error: attach failed: unable to locate debugserver
今まで xcode をインストールした状態でデバッグを行ってたので、このケースに初めて遭遇した。debugserver がないとのこと。検索すると command line tools をインストールしてるなら /Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver
に存在するという情報を入手した。(確かにあった)
それで今度はこの debugserver を lldb に認識して貰う必要があるが、検索してもなかなかヒットせずかなり困った。
続きを読む