サーバーレスメトリクスのスケーラビリティを実現するためのアプローチ:Shopifyの実踐

はじめに

現代のクラウドネイティブアーキテクチャにおいて、サーバーレスコンピューティングはコスト効率とスケーラビリティの観點から注目されています。しかし、サーバーレス環境では、従來の仮想マシンやコンテナと異なり、リソースのライフサイクルが短く、メトリクスの収集と観測が複雑化します。本記事では、グローバルなECプラットフォームであるShopifyが、サーバーレス環境におけるメトリクスの観測性を高めるためのアプローチと技術的課題を解説します。特に、メトリクスインストルメンテーション、メトリクスインギッション、メトリクスプラットフォームの設計、CNCF(クラウドネイティブコンピューティングファウンデーション)との統合について深く掘り下げます。

サーバーレスメトリクスの課題と解決策

グローバルなビジネスニーズとスケーラビリティの要求

Shopifyは、世界中の小売業者向けにサービスを提供しており、Black Fridayやサイバーマンデーなどのピーク時に毎秒100GBのログ、1200萬のスパン、3.5億のメトリクスサンプルを処理する必要があります。このようなスケーラビリティの要求に対応するため、メトリクスの観測性を強化するためのアーキテクチャ設計が不可欠です。

サーバーレス環境におけるメトリクスの課題

ShopifyはKubernetesをベースにGoogle Cloud上でサービスを展開しており、Cloud Runを活用したサーバーレスアーキテクチャを採用しています。このアプローチでは、各アプリケーションが獨立したデータベースやKafkaコンシューマーを持つことで、自動スケーリングとゼロコストの実現が可能ですが、ネットワークの隔離、データ転送効率、ノードの制御性といった課題が生じます。

メトリクスインストルメンテーションとインギッションの設計

メトリクスプロトコルの選択と統合

既存のRubyアプリケーションではStatsD(テキストベースのプロトコル)が使用されていましたが、新規サービスではOpenTelemetry(OTLP)プロトコルを採用しています。この統合には、StatsDとOTLPの相互変換が必要であり、自前のotel-collectorブランチを開発し、StatsDのデータをOTLP形式に変換する機能を実裝しました。その後、この変換ロジックはupstreamに統合されました。

サイドカー構造とデータ転送

Cloud Runアプリケーションでは、サイドカーを介してメトリクスを収集します。StatsDはUDPで送信され、OTLPはループバックインターフェースを通じて処理されます。データはサイドカーでバッチ処理とアグリゲーションが行われ、その後、公共ネットワークを介して送信されます。Protobufと圧縮技術を用いることで、転送効率を向上させています。

メトリクスルーターとカーディナリティ制御

メトリクスルーターはKubernetesクラスターに統合され、StatsDのデータをPrometheus互換形式に変換します。D-Sketchアルゴリズムを採用することで、複數のソースからのヒストグラムデータをマージし、カーディナリティ問題を軽減しています。また、OpenTelemetryのOTLPデータをD-Sketch形式に変換するためのライブラリも導入されています。

チャレンジと解決策

ネットワークとデータ転送の課題

Cloud Runサービスは非peeredネットワークに配置されるため、ネットワーク隔離が問題となります。また、StatsDのデータ量が大きい(毎秒6.5MB)ため、転送効率が低下する可能性があります。さらに、Cloud Runコンテナが終了する際の10秒のgrace periodにより、データの喪失リスクが生じる可能性があります。

システムの安定性と信頼性

otel-collectorのリフレッシュ間隔を短縮し、コンテナの起動順序を制御することで、アプリケーションが正常に起動するまでコレクターを待機させます。また、データのアグリゲーション戦略として、敏感な情報を削除し、ラベルの數を制限することで、システムの安定性を向上させています。

拡張性と今後の方向性

可観測性の拡張

Cloud Runに日誌プラットフォーム(observe)を統合し、MTLSによる自動認証を導入することで、セキュリティを強化しています。また、メトリクス処理フローを最適化し、otel-collectorでカーディナリティ制御を直接実行することで、Prometheusとの統合を簡略化しています。

メトリクスパイプラインの改善

背圧処理メカニズムを強化し、イベント駆動型の自動スケーリング(KDA)を改善することで、異常なトラフィック下でもシステムの安定性を確保しています。さらに、ログ、トレース、メトリクスを統合した完全なメトリクスパイプラインの構築を目指しています。

技術的詳細

D-Sketchとカーディナリティ制御

D-Sketchはメモリベースのアルゴリズムであり、複數のソースからのヒストグラムデータをマージするための効率的な方法です。カーディナリティ制御では、otel-collectorで冗長なラベルを削除し、必要なラベルのみを保持することで、メトリクスの複雑さを抑えることができます。

デルタストレージと時系列処理

メトリクスの時系列処理では、累積値ではなくデルタ値を用いることで、データの喪失を防ぎ、正確な時系列分析が可能になります。

OTLP変換とサイドカー構成

OTLPデータはOpenTelemetryマッピングライブラリを用いてD-Sketch形式に変換され、トレースとメトリクスの処理がサイドカーで行われます。トレースではOTLP入力→リソース検出→データクリーンアップ→バッチ処理→OTLP出力のフローが構築され、メトリクスではStatsD/OTLP入力→リソース検出→ラベルマッピング→累積→デルタ→バッチ処理→出力のフローが実裝されています。

結論

Shopifyのサーバーレスメトリクスアーキテクチャは、ネットワーク隔離、データ転送効率、カーディナリティ制御といった課題を克服するため、サイドカー、D-Sketch、OTLP変換などの技術を統合しています。CNCFの標準に準拠することで、拡張性と保守性を確保しています。今後は、背圧処理の強化やメトリクスパイプラインの完全な統合により、さらなるスケーラビリティと信頼性を追求していくことが重要です。