BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース LinkedIn、マイクロサービス統合にプロトコルバッファを採用し、レイテンシを最大60%削減

LinkedIn、マイクロサービス統合にプロトコルバッファを採用し、レイテンシを最大60%削減

原文リンク(2023-07-19)

LinkedInは、プラットフォーム全体でマイクロサービス間のデータ交換を効率化するためにProtocol Buffersを採用し、オープンソースのRESTフレームワークであるRest.liと統合した。全社的な展開後、レイテンシを最大60%削減し、同時にリソース利用率も向上した。

LinkedInのプラットフォームはマイクロサービス・アーキテクチャを採用しており、ここ数年、LinkedInのマイクロサービスによって公開される5万以上のAPIエンドポイントのシリアライズ形式としてJSONが使用されている。サービス間の一貫したインタラクションを構築するチームを支援するために、同社はRest.liと呼ばれるJavaフレームワークを作成し、オープンソース化した。

このフレームワークは、RESTスタイルの通信を使用するサーバーとクライアントの作成を支援し、ネットワーキング、シリアライゼーション、サービス・ディスカバリーを含むデータ交換の多くの側面を抽象化する。主にJavaとPythonをサポートしているが、Scala、Kotlin、JavaScript、Goなどでも動作する。

Rest.liサーバーとクライアント間のデータと制御フロー(出典:Rest.liドキュメント)

JSONはRest.liのデフォルトのシリアライズフォーマットであり、幅広い言語をサポートし、人間が読めるという理由で選択されている。最後の特性は、有益ではあるが、パフォーマンス(特にレイテンシ)の観点から問題がある。

LinkedInのエンジニアであるKarthik Ramgopal氏Aman Gupta氏は、サービス間通信にJSONを使用する際の課題を共有している。

最初の課題は、JSONがテキスト形式であるため、冗長になりがちであることだ。その結果、ネットワーク帯域幅の使用量が増加し、レイテンシが高くなり、理想的とは言えません。私たちが直面した2つ目の課題は、JSONがテキスト形式であるため、シリアライズとデシリアライズのレイテンシとスループットが最適ではないということだ。

チームは、JSONに代わるものを検討し、コンパクトなペイロードサイズと高いシリアライズ効率で、レイテンシを減らし、スループットを向上させるものを探していた。また、サポートする言語スタックの数を制限したり、新しいシリアライゼーションメカニズムを Rest.li に統合することで、段階的な移行を可能にしたりすることも望んでいませんでした。最終的に、包括的な検討の結果、定義された基準に基づいてもっとも高いスコアを得たプロトコルバッファ(Protobuf)を採用することに決めた。

Protocol BuffersをRest.liに統合する際の主な問題は、フレームワークのカスタムスキーマ定義システムPDLに基づく動的スキーマ生成であった。解決策としては、Protobufスキーマ定義を動的に生成するために使用されるシンボルテーブルを生成することだったが、シンボルテーブルを配信する方法はクライアントの種類によって異なっていた。バックエンドクライアントはオンデマンドでシンボルテーブルをフェッチしてキャッシュするが、ウェブ/モバイルアプリでは、シンボルテーブルはビルド時に生成され、バージョン管理された依存関係として含まれる。

フレームワークへの変更がロールアウトされた後、チームはHTTPヘッダーを使用してJSONの代わりにProtobufを有効にするようにクライアントを徐々に再設定した。Protocol Buffersを採用した結果、スループットがレスポンスで平均6.25%、リクエストで平均1.77%向上した。また、ペイロードが大きい場合、最大60%のレイテンシ削減が確認された。

JSONとProtobufのレイテンシ比較(出典:LinkedIn、Protocol BuffersをLinkedInに統合LinkedIn、マイクロサービスのパフォーマンス向上のため、Protocol BuffersをRest.liと統合)

Protocol Buffersのロールアウトから得られた学習に基づいて、チームはRest.liからgRPCへの移行を計画している。gRPCもProtocol Buffersを使用するが、さらにストリーミングをサポートし、大規模なコミュニティが背後にある。

InfoQ Podcastも参照のこと、API対決:REST vs. GraphQL vs. gRPC - どちらを使うべきか?

作者について

この記事に星をつける

おすすめ度
スタイル

BT