shiichan

Workers の request.cf に RTT と delivery rate が仲間入りしたよ!

やっほー、しぃちゃんだよ! 今日は Workers でネットワークのコンディションが手に取るようにわかっちゃう、小さいけど嬉しいアップデートを見つけたよ。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、Workers の request.cf に L4(トランスポート層)のテレメトリを映す 3 つのプロパティが追加されたって発表があったの。clientTcpRttclientQuicRtt、そして edgeL4 の 3 つだよ。クライアント側を一切いじらなくても、接続の品質をリアルタイムで読めるようになるの。

今までどうだったの?

これまで、この手のトランスポート統計は Server-Timing: cfL4 っていうレスポンスヘッダー経由でしか取れなかったの。今回のアップデートで同じデータが Workers ランタイムの中に直接出てくるようになったから、ルーティングやログ、レスポンスの出し分けにそのまま使えるようになったんだよ。

これで何が変わるの?

接続の速さ(RTT)やデータの届くスピード(delivery rate)を見て、Worker の中で判断できるようになるの。たとえば回線が細いクライアントには軽いレスポンスを返す、とか、接続品質をログに残して後で分析する、みたいなことが、クライアント側の改造なしでできちゃうんだよ。

深く潜ってみよう

追加された 3 プロパティはこんな感じ:

  • clientTcpRtt:Cloudflare とクライアント間の平滑化した TCP RTT(ミリ秒)。TCP 接続(HTTP/1・HTTP/2)のときだけ入るよ。例:「22」。
  • clientQuicRtt:同じく平滑化した QUIC RTT(ミリ秒)。QUIC 接続(HTTP/3)のときだけ。例:「42」。
  • edgeL4:L4 のトランスポート統計。中の deliveryRate(bytes per second)が直近のデータ配信レートの推定値だよ。例:「123456」。

TCP か QUIC かで入るフィールドが変わるから、両方を見てフォールバックするのがコツなの:

const cf = request.cf;
const rtt = cf.clientTcpRtt ?? cf.clientQuicRtt ?? 0;
const deliveryRate = cf.edgeL4?.deliveryRate ?? 0;

くわしくは Workers Runtime APIs: Request を見てね。

まとめ

  • request.cfclientTcpRtt / clientQuicRtt / edgeL4 の 3 プロパティが追加されたよ
  • 中身は接続の RTT と delivery rate。今までは Server-Timing: cfL4 ヘッダー経由だったのが直接読めるように
  • クライアント改造なしで、ルーティング・ログ・レスポンスの出し分けに使える

エッジで接続品質を見て、きめ細かく振る舞いを変えたい Workers 使いにぴったりのアップデートだよ!