Cloudflare社はFoundationsのリリースを発表した。分散したプロダクショングレードのシステムを構築するための強力なRustライブラリだ。当初はOxyプロキシフレームワークの一部として開発されたFoundationsは、大規模なサービスのデプロイと管理の複雑さを簡素化するために設計された汎用的なライブラリへと進化した。現在GitHubで公開されているこのオープンソースプロジェクトは、エンジニアが複雑な本番運用のセットアップに煩わされることなく、コアのビジネスロジックに集中できるようにする。
Foundationsは、シンプルなローカル・プロトタイプからグローバルな本番環境で本格的なサービスに移行する際に現れる課題に対処する。主な差別化要因は、オブザーバビリティ、構成、セキュリティなどである。Cloudflareの数多くのサービス開発の経験に根ざしたFoundationsは、これらの重要な差別化に対する包括的なソリューションとして機能する。
Foundations開発の主要原則は以下の通りである。
-
高いモジュール性:Foundationsは高いモジュール性で設計されているため、チームはそれぞれのペースで個々の構成要素を採用でき、既存サービスへのスムーズな移行を促進する。
-
APIの人間工学:Foundationsはユーザーフレンドリーなインタラクションを優先しながら、Rustの手続き型マクロを活用しており、直感的で十分に文書化されたAPIを提供することで、使用上の摩擦を最小限に抑える。
-
セットアップと設定の簡素化:Foundationsは「プラグアンドプレイ」を目指しており、すぐに動作する必須機能を提供する一方で、微調整可能な設定を提供する。セットアップのしやすさに重点を置いており、本番環境でテストされた特定の環境向けに調整されている。
Foundationsが提供するコンポーネントは、ほとんどのサービスニーズに必要なものである。
-
ロギング:任意のテキスト情報を記録し、操作上のエラーを文書化するのに役立つ。
-
トレース:パフォーマンスボトルネックを特定するために、サービスコンポーネントの詳細なタイミングブレイクダウンを提供している。
-
メトリクス:システムの全体的な健全性とパフォーマンスを監視するために重要な定量的データポイントを提供している。
FoundationsのロギングAPIは、tokio/tracingと slogの上に構築され、階層的なロギングのコンテキスト情報を扱うための機能拡張を導入している。将来のインスツルメンテーション・マシナリーを活用し、Foundationsは、各リクエストに対して現在のロガーの暗黙的な受け渡しを可能にし、プロセスを合理化し、ビジネス・ロジックの妨害を防いでいる。
Foundationsのトレースは、tokio/tracingに似ているが、以下の点で異なる。
-
簡素化されたAPI:Foundationsは、最小限のアプローチを採用し、トレースのセットアッププロセスを合理化する。
-
強化されたトレースサンプリングの柔軟性:詳細な性能調査のために、特定のコードブランチにおけるサンプリング比率を選択的にオーバーライドできる。
-
分散トレースステッチング: 複数のサービスからのトレースデータの統合をサポートし、パイプライン全体の包括的なビューに貢献する。
-
トレース・フォーキング機能:多数の多重化されたリクエストによる長時間接続の課題に対処し、分析を簡素化してパフォーマンスを向上させる。
メトリクスについて、Foundationsは公式のPrometheus Rustクライアント・ライブラリを組み込んでいる。使いやすさを向上させ、型付けされたラベルを持つ新しいメトリクスの定義を簡素化するための手続き型マクロを導入している。例として、以下のコードを紹介する。
use foundations::telemetry::metrics::{metrics, Counter, Gauge};
use std::sync::Arc;
#[metrics]
pub(crate) mod http_server {
/// Number of active client connections.
pub fn active_connections(endpoint_name: &Arc<String>) -> Gauge;
/// Number of failed client connections.
pub fn failed_connections_total(endpoint_name: &Arc<String>) -> Counter;
/// Number of HTTP requests.
pub fn requests_total(endpoint_name: &Arc<String>) -> Counter;
/// Number of failed requests.
pub fn requests_failed_total(endpoint_name: &Arc<String>, status_code: u16) -> Counter;
}
メモリプロファイリングは、アクセス可能な統合のための簡単で安全なRust APIで、jemalloc メモリ割り当てを可能にするように実装されている。Foundationsは、カスタマイズ可能な組み込みの遠隔測定サーバー・エンドポイントも備えている。このサーバーは、ヘルスチェック、メトリクス収集、メモリプロファイリングなどの機能を自動化している。
Foundationsでは、seccompのための堅牢で人間工学的なAPIによってセキュリティが保証されている。seccompは、システムコール・サンドボックスのためのLinuxカーネル機能で、脅威に対するセキュリティのレイヤーを追加する。Foundationsは、システムコールを許可する簡単な方法を提供し、複数のリストを組み合わせできる。
use foundations::security::common_syscall_allow_lists::{ASYNC, NET_SOCKET_API, SERVICE_BASICS};
use foundations::security::{allow_list, enable_syscall_sandboxing, ViolationAction};
allow_list! {
static ALLOWED = [
..SERVICE_BASICS,
..ASYNC,
..NET_SOCKET_API
]
}
enable_syscall_sandboxing(ViolationAction::KillProcess, &ALLOWED)
Cloudflareチームは次のように述べている。
Foundationsは、開発の摩擦を減らすのに役立っています。
Cloudflareは、これがコミュニティにとって有用と考えている。これが、Foundationsライブラリをオープンソース化した理由である。