Cloudflare Realtime SFU の DataChannel、順序なし・部分信頼配信が選べるようになったよ!
みんな、しぃちゃんだよ! 今日は WebRTC まわりの、地味だけどリアルタイム系アプリを作ってる人にはグッとくるアップデートを見つけたよ!
Cloudflare Changelogなにが発表されたの?
Cloudflare の Changelog で、Realtime SFU の DataChannel が「順序なし配信」と「部分的信頼性配信」に対応したって発表があったの。
Cloudflare Realtime SFU は、WebRTC の選択的転送ユニット(SFU)を Cloudflare のグローバルネットワーク上で動かしてくれるサービスで、音声・映像に加えて DataChannel と呼ばれるアプリケーションメッセージ用のチャネルも扱えるの。チャットメッセージ、ゲームの状態、センサーの値、制御イベントみたいな低遅延なペイロードを送るのに使われるんだって。
今回のアップデートで、この DataChannel の配信ポリシーを自分で選べるようになったよ。既存のチャネルはこれまで通り「信頼性あり・順序あり」がデフォルトのままだから、いきなり動作が変わっちゃう心配はないの。
今までどうだったの?
これまで DataChannel は「信頼性あり・順序あり」の配信しか選べなかったの。この配信方式だと、途中で遅延したメッセージが後から届いた新しいメッセージをブロックしちゃうんだよね。
チャットみたいに「順番通りに全部届く」ことが大事な用途なら問題ないんだけど、ゲームの状態やセンサーの値みたいに「ちょっと前のデータより、今の最新データの方が価値がある」ケースだと、この足止めがそのまま体感の遅延につながっちゃうの。
これで何が変わるの?
順序なし配信を選べば、遅れているメッセージを待たずに新しいメッセージをどんどん先に届けられるようになるの。さらに部分的信頼性の設定を組み合わせれば、「どこまで再送を試みるか」「どれくらいの時間で配信をあきらめるか」まで自分でコントロールできるようになるんだよ。
ゲーム状態の同期やセンサーデータのストリーミング、リアルタイム制御イベントを扱うアプリにとっては、「古いデータより新しいデータを優先したい」というニーズにそのまま応えられるアップデートだね。
深く潜ってみよう
配信ポリシーは、次の 3 つのパラメータの組み合わせで決めるの。
ordered— メッセージを順序通りに届けるかどうかmaxRetransmits— 再送信を試みる回数の上限maxPacketLifeTime— 配信をあきらめるまでの時間(ミリ秒)
組み合わせのパターンはこんな感じだよ。
- 信頼性あり・順序あり(デフォルト):
ordered/maxRetransmits/maxPacketLifeTimeをすべて省略。メッセージが有用で、かつ順番通りに届く必要がある場合に使う - 信頼性あり・順序なし:
ordered: falseのみ指定。順序は不要だけど、メッセージ自体はちゃんと届いてほしい場合 - 再送なし:
ordered: falseとmaxRetransmits: 0を指定。メッセージの取りこぼしを許容し、古い更新は捨てたい場合 - 再送回数を制限:
maxRetransmitsに回数を指定。短時間の回復だけ試みたい場合 - 配信時間を制限:
maxPacketLifeTimeに時間を指定。一定時間を過ぎると価値がなくなるデータの場合
注意したいのは、この設定は 1 か所だけ変えれば済むわけじゃない、という点。パブリッシャーがローカルチャネルを作るとき、各サブスクライバーがリモートチャネルを取得するとき、そしてクライアント側で createDataChannel() を呼ぶとき、それぞれで同じ設定を揃える必要があるの。DataChannel は交渉済みの ID を使う仕組みだから、ブラウザがリモートピアから配信設定を自動で受け取ってくれるわけじゃないんだって。地味だけど見落としやすいポイントだから、実装するときは要チェックだよ。
まとめ
- Cloudflare Realtime SFU の DataChannel が、順序なし配信と部分的信頼性配信に対応したよ
- 既存チャネルはこれまで通り信頼性あり・順序ありがデフォルトのまま
ordered/maxRetransmits/maxPacketLifeTimeの組み合わせで配信ポリシーを選べる- 設定はパブリッシャー・サブスクライバー・クライアントの全箇所で揃える必要がある
ゲーム状態やセンサーデータみたいに「最新値がいちばん大事」なリアルタイムアプリを作ってる人には、まさに刺さるアップデートだよ!