Rustで、Hello Worldを卒業した?次は、gRPCだよね!

FUJITA Tomonori
nttlabs
Published in
4 min readDec 9, 2019

--

こんにちは、NTTの藤田です。

Rustには公式なgRPCサポートがありません。gRPCなAPIがないなら、何も実装する気になりません、クラウドネイティブ時代ですからね。公式なgRPCサポートがない代わりに、4種類も非公式な実装がありますので、安心です。安定性や、コミュニティの活発度など、様々な比較の観点がありますが、今回は、Rustへの信仰の強さ、という観点で比較しました。

Rustには公式なgRPCサポートがない

信仰の強さの評価軸

他言語への依存度

Rust以外は言語にあらず。他言語の存在を許容するようでは、信仰が強いとはいえません。全てをRustで再実装するべきです。

最新の非同期処理への対応

今、Rust界の大きな話題といえば、11月のasync/awaitを利用した非同期処理を実現するためのFuture APIの安定化です。古い異端のコードを捨て、迅速に、定められた、正統な非同期処理の教えに従うのが、信仰の強さといえます。

実装比較

grpc-rsgrpc-rusttower-grpctonic、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以外は言語にあらずです。

protobufから生成されたコードの違い

まとめ

全てをRustで再実装するべき。BGPの実装は始めました。NTTでは、その手の仕事に興味のある仲間を募集中です。連絡お待ちしています。

--

--

FUJITA Tomonori
nttlabs

Janitor at the 34th floor of NTT Tamachi office, had worked on Linux kernel, founded GoBGP, TGT, Ryu, RustyBGP, etc. https://twitter.com/brewaddict