ALTURA XでのgRPC活用事例

はじめに

はじめまして、ALTURA X株式会社でバックエンドエンジニアを担当している秋山です。
gRPCの概要および弊社でのgRPCの利用方法について説明していきます。

gRPCとは

オープンソースのRPCシステムで、Googleによって開発されたものです。
gRPCを使用すると、クライアントはローカルオブジェクトを使用するかのようにして、別のマシンで起動しているサーバーアプリケーションのメソッドを直接呼び出すことができます。 gRPCでは、インターフェース記述言語(IDL)として標準でProtocol Buffersという技術を使用しており、これを使用してデータ構造の定義やデータのシリアライズを行います。
実際に実装する場合は、Protocol Buffersの定義をもとにgRPCクライアントとgRPCサーバーの生成を行い、生成されたサーバー用インターフェースの実装を行うことでgRPCサーバーを実装することができます。
gRPCクライアントは生成されたメソッドを呼び出すことによって使用でき、メソッドの呼び出しによってクライアントとサーバーの間で通信が行われます。

ライブラリ選定

問題発生時の対応のしやすさを重視し、情報量と事例数の多いGoogle製のライブラリを選択しました。
gRPC-goConnect
情報量多い少ない
事例多い少ない
実装独自実装のHTTP/2Go標準パッケージのnet/http
コード生成量多い少ない
Webサポートプロキシが必要プロキシが不要
サポート言語C#,C++,Dart,Go,Java,Kotlin,Node,Object-C,PHP,Python,RubyGo,Web,Node,Swift,Kotlin
開発元GoogleBuf

弊社でどのように使っているか

ALTURA Xでは、通知機能を提供するためにサービスを使用しています。 すべての通知は通知サービスを介して行われます。
通知サービスは以下の機能を提供します。
  • 通知
  • 一斉通知
通知サービスと連携するために、通知先返却サービスを機能ごとにCHECKUP環境に設置しています。通知サービスが一斉通知を行う際には、通知先返却サービスを使用して通知先を取得します。
通知先返却サービスはgRPCを使用して提供されており、通知サービスから使用する際には通信先のポートを切り替えることで、通知先返却サービスとの通信を行います。
通知先返却サービスを通知サービスと分けた理由は、通知先の取得数を制限するためです。通知サービスで事前に通知先を持つ場合、通知の登録時に対象のユーザーを登録する必要があります。
対象のユーザーが100万人いる場合、一度に登録するには時間がかかるだけでなく、性能の確保も難しいという懸念があります。そのため、通知先返却サービスを通じて通知先を随時取得する形にしました。
機能ごとに設置した通知先返却サービスは、共通のインターフェースを使用し、通知サービスから呼び出す際には共通のメソッドを使用して通知先を取得できるようにしています。

テストコード

ここでは、通知先返却サービスの実装方法について説明します。

サーバーの実装

protoファイルでの定義
上記のprotoファイルからは、インターフェースが自動的に生成されます。
通知先返却サービスは、生成されたインターフェースを実装し、gRPCサーバーインスタンスに登録します。
 
通知先返却サービス1の実装
protoファイルで定義した通知先取得メソッドのインターフェースを実装します。
 
通知先返却サービス2の実装
通知先返却サービス1と同様に、protoファイルで定義された通知先取得メソッドのインターフェースを実装します。
 
サーバー起動
通知先返却サービスの実装とポートは一緒に保持し、同一サーバーで起動するようにしました。
同一サーバーで通知先返却サービスを起動することにより、新しい通知先返却サービスを追加する際は、実装とポートの設定だけで登録できるようにしています。

クライアントの実装

共通のインターフェースを実装しているため、対象の通知先返却サービスのアドレスを渡すことで、使用する通知先返却サービスのクライアントを切り替えることができます。
通知先返却サービス1を使用したい場合は 、通知先返却サービス2を使用したい場合は を指定して利用することができます。
クライアント使用例

最後に

弊社でのgRPCの利用方法についてお話させていただきました。
gRPCは共通したインターフェースで実装できるため、複数のサービスで分けた場合でも使用する側でシンプルに切り替えることができます。これはgRPCを使用する上でのメリットの一つだと実感しました。
サービス間通信でgRPCを選定する際に参考になれば幸いです。