行先ボードでも作ってみるか⑨ – 内部設計(gRPC調査)

プロセス間通信。あまり良い思い出がありません。

  • ファイルによるリアルタイム共有
  • 共有メモリ
  • メモリマップトファイル
  • セマフォ

ネットワーク越しのプロセス間通信もなかなかです。

  • .NETリモーティング
  • WCF

2016年にGoogleがリリースしたgRPC。
ちょっと使ってみたかったので今回この技術を採用しようと思います。
調査結果というほどでもないですが、おおまかな手順とちょっと使ってみた感想について述べます。

おおまかな手順

  1. 必要なパッケージをインストール
  2. クラスライブラリのプロジェクトを作成
  3. プロジェクトファイルに.protoの使用を記載する
  4. .protoファイルの作成
  5. ビルド(通信周りの処理が自動生成される)
  6. 必要な処理を書く

①以下のライブラリをNugetでインストール

  • Grpc.Core
  • Grpc.Tools
  • Google.Protobuf

②クラスライブラリのプロジェクトを準備(GUIアプリでgRPCを使用する場合のみ。コンソールアプリは特に不要。)

※ここが少しハマる。gRPC用のプロジェクトをクラスライブラリで分けないと以下のエラーが出ます。

エラー CS0246:型または名前空間の名前 'XXXXX' が見つかりませんでした 
(using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)
  • クラスライブラリの追加方法: 右クリック → 追加 → 新しいプロジェクト

  • クラスライブラリの追加方法:「クラスライブラリ」を選択

  • クラスライブラリ追加後の様子

③プロジェクトファイルの編集

以下の一行を追加する。

  <ItemGroup>
    (省略)
    <Protobuf Include="**/*.proto" OutputDir="%(RelativePath)" CompileOutputs="false" GrpcServices="Server" />
  </ItemGroup>

※GrpcServicesの種類は以下のとおり。
自動生成の際に作成される処理が変わります。
役割に応じて設定します。

  • Both (存在しない場合の既定値)
  • Server
  • Client
  • None

プロジェクトファイルの編集はこの辺から編集します。

④.protoファイルを作成する

テキストファイルなどでクラスライブラリ側に追加します。

この辺は他のページにお任せします。

⑤ビルド(通信周りの処理が自動生成される)

ビルドすると勝手に出来上がります。
ビルド後は削除しても勝手に作られます。
自動生成のファイルは修正してはいけないということですね。

⑥必要な処理を書く

この辺も他のページにお任せします。

所感

①別プロセスのサブルーチンを呼び出せる
これはRPC(リモートプロシージャコール)全般に言えることですが楽ですね。
関数使用を書いておけば再利用性が高まります。

②通信周りを自動生成してくれる
.protoを書くだけで自動生成。
ものすごく楽です。

③対応している言語が多い

それぞれ得意な言語がありますしね。
別の言語で作ったものでも相手側の処理を再利用できるのはうれしいです。
インターフェースをうまく活用することで開発コストを下げられそうです。

対応言語。

Android Java, C#, C++, Dart, Go, Java, Kotlin/JVM, Node.js, Objective-C, PHP, Python, Ruby

まとめ

難しいことを言い始めればもっと嬉しさがあるんでしょうね。
まぁ、そこは使ってみて、ということで。

gRPCで行けそうです。

おわり

コメントする

メールアドレスが公開されることはありません。