Pinterestは、汎用PubSubクライアントライブラリであるPSCをオープンソース化した。PSCは1年半前から実際に幅広く利用されている。このライブラリは、開発者の速度を向上させ、それを使用するサービスのスケーラビリティと安定性を高めることで、エンジニアリングチームを支援している。Javaアプリケーションの90%以上が、最小限の変更でPSCに移行している。
Pinterestは、Apache Kafka、Apache Flink、MemQなど、プラットフォーム全体でメッセージング・インフラストラクチャを使用している。Pinterestのソフトウェア・エンジニアであるJeff Xiang氏は、異なるメッセージング・バックエンドを使用することから生じるいくつかの課題についてまとめている。
長年の運用経験から、プラットフォームチームが所有し保守する統一されたPubSubインターフェイスがあれば、アプリケーション開発者はクライアントとサーバーの接続問題のデバッグに貴重な時間を費やすことなく、アプリケーションのロジックに集中できるため、ユーザーやビジネスにとって大きなメリットがあることが分かりました。
同社は、統一された抽象化とネイティブクライアントライブラリと比較して強化された機能を提供する汎用PubSubクライアントライブラリを作成した。PSCは、自動化されたサービス検出、最適化された設定、自動化されたエラー処理、インターセプター、メトリクス、および最適化された設定をサポートする。ライブラリは2つの主要なインターフェースを提供している。PSCプロデューサーとPSCコンシューマーで、それぞれ1つまたは複数のバックエンドのプロデューサーまたはコンシューマーを管理できる。
PubSubクライアントのアーキテクチャ(出典:PSC GitHubリポジトリ)
ライブラリは、メッセージングトピックの自動サービス検出をサポートするためにリソース名(RNs)を導入した。トピック参照では、ブローカー接続の確立に必要なすべての情報を含む完全修飾RN文字列を使用する。例えば、secure:/rn:kafka:prod:aws_us-west-1:shopping:transaction
は、クライアントが接続する必要のあるトピック、クラスタ、リージョン、バックエンド(Kafka)を指定する。このアプローチにより、無効なホスト/ポートの組み合わせ、SSL設定オプションと認証情報、不正なリージョンなどを持つネイティブクライアントを使用した偶発的な構成ミスを防止する。
エンジニアは、Flinkベースのワークロードのシームレスな移行を可能にするFlink-PSCコネクタを開発した。主な移行課題は、新しく移行したジョブがFlinkチェックポイントファイルからジョブ状態を回復できるようにすることだった。
PubSubクライアントはネイティブクライアントと100%同等の機能とAPIを備えているため、Pinterestはコードベースの変更を最小限に抑えながら、Javaアプリケーションの90%以上をPSCに移行できた。移行作業には通常、インポートや参照の置き換え、新しいリソース名(RN)文字列を含むPSCのものを活用したクライアント設定の更新などが含まれる。
PSCのロールアウトがFlinkのジョブ再起動に与える影響(出典:Pinterest Engineering Blog)
Pinterestは、期限切れのSSL証明書の検出と更新など、より改善可能なエラーに対する自動エラー処理など、PSCにさらなる機能強化を導入する予定だ。同社はまた、PythonのロードマップにあるC++バージョンに取り組んでいる。最後に、プラットフォーム・チームは、インフラ・コストをプロジェクトやチームに帰属させることができるよう、クライアントのチャージバックをサポートするクライアント追跡機能の活用を検討している。
LinkedInの投稿に対して、Aaron Lee氏は次のようにコメントしている。
よくやった!このようなインフラの中核となる部分について、うまく設計された統一クライアントがどれほど下流に影響を与えられるか注目したい。他の大規模なエンジニアリングチームも、活用することで多くのメリットを得られると思います。