Rustで、Hello Worldを卒業した?次は、gRPCだよね!
こんにちは、NTTの藤田です。
Rustには公式なgRPCサポートがありません。gRPCなAPIがないなら、何も実装する気になりません、クラウドネイティブ時代ですからね。公式なgRPCサポートがない代わりに、4種類も非公式な実装がありますので、安心です。安定性や、コミュニティの活発度など、様々な比較の観点がありますが、今回は、Rustへの信仰の強さ、という観点で比較しました。
信仰の強さの評価軸
他言語への依存度
Rust以外は言語にあらず。他言語の存在を許容するようでは、信仰が強いとはいえません。全てをRustで再実装するべきです。
最新の非同期処理への対応
今、Rust界の大きな話題といえば、11月のasync/awaitを利用した非同期処理を実現するためのFuture APIの安定化です。古い異端のコードを捨て、迅速に、定められた、正統な非同期処理の教えに従うのが、信仰の強さといえます。
実装比較
grpc-rs、grpc-rust、tower-grpc、tonic、4つの実装のうち、Rustへの信仰が最も強いtonicを選択すれば、後悔することはないでしょう。万が一、後悔することがあれば、あなたのRustへの信仰が足りないのでしょう。
gRPC-rs
「rust grpc」でググると、最初に、gRPC-rsに関する複数の記事が見つかります。しかし、gRPC-rsは、C++で実装されたgRPCのライブラリをラップしているものにすぎません。実行時にCのライブラリが必要だとか、Rustの実装と呼ぶのがはばかられるレベルです。もちろん、最新のFuture APIにも対応していません。
grpc-rust
protobufファイルから、Rustのネイティブコードを生成するコンパイラとして、C++で実装された本家のprotocコマンドを利用しており、信仰が強いといえません。GolangやPythonなどのgRPC実装も、同様に、protocコマンドを利用して、ネイティブのコードを生成しており、許容範囲ではないかという意見もあるかもしれませんが、Rustの信仰に妥協は許されません。最新のFuture APIにも対応していません。
Tower gRPC
protocコマンドを捨て、Rustで実装したprotobufコンパイラのprostを利用しています。残念ながら、最新のFuture APIには対応していません。
tonic
Tower gRPC同様、prostを利用しており、他言語に依存していません。さらに、最新のFuture APIにも対応済みです。あなたのコードも対応済みでしょうから、すぐにtonicを使うことができます!
tonicやprostは、Rustへの強い信仰のため、他言語のgRPCに慣れ親しんでいると、驚くことがあるかもしれません。
例えば、protobufで定義した変数名をそのまま使わず、型の名前がRust流儀にあわせて変更されます。下のように、protobufで、IPAddressという構造体名を定義していても、生成されたRustのコードでは、IpAddressと、IPがIpに変更されています。他言語との互換性がなくなるケースがある?Rust以外は言語にあらずです。
まとめ
全てをRustで再実装するべき。BGPの実装は始めました。NTTでは、その手の仕事に興味のある仲間を募集中です。連絡お待ちしています。