時雨堂のWebRTC SFU Sora ではクライアントの接続状況を確認し続ける仕組みが入っています。ICE コネクションステートと呼ばれる機能です、この機能はすごく簡単にいってしまえば、Ping/Pong 機能です。
SFU からクライアントに対して定期的に Ping/Pong を送ります。このクライアントの通信状態確認機能は基本的に UDP で行われます。そのため TCP のように確実に届くという仕組みではありません。
また、一定間隔ではなく「通信がうまくいっている間は 2.5 秒に1 回」なんか応答が返ってこなくなったら「1 秒に 1 回を 5 秒間」、そして全く反応がなくなったら「50 ミリ秒に 1 回を 10 秒間」という可変式の状態確認機能になっています。
WebRTC は主な通信が UDP ということもあり、相手のネットワークが瞬断したりする場合でも継続的に通信が行える必要があります。そのため、Sora にはこのような機能が組み込まれています。一時的に切断状態になっても再度接続状態に戻れる仕組みです。
この仕組みについてお客様から「無通信状態になっていた時間を取得できるようにできないか?」というお問い合わせを頂きました。
理由はシンプルで、時間課金のサービスのため「無通信時間の課金を行わないようにしたい」というものでした。
この仕組みはもともとサーバー側で何かクライアントに問題があると判断した際にグレイスフルシャットダウンをするための仕組みとしていれたものなのですが、無通信時間も取ろうと思えばとれます。反応がなくなって復帰するまでの時間をため込んでおけばいいわけです。
Sora では 1 分に 1 回クライアントの状態をウェブフックで送信します。そこに「無通信時間」を入れておけば、クライアントがどのような状態なのかもわかりやすくなります。
total_checking_duration_ms
1 秒間隔で 5 秒間の ping/pong を送って反応がなかった合計時間。
total_disconnected_duration_ms
50 ミリ秒間隔で 10 秒間 ping/pong を送って反応がなかった合計時間。
これらをウェブフックに含めることで、どれだけ無通信時間があったかを簡単に取得できるようになりました。この状態の変化や回数などは統計情報として取得していたのですが、無通信時間を取得可能にすることは思いついていませんでした。
この機能は 2023 年 12 月リリース予定の Sora に搭載される予定です。
ちなみに checkig や disconnected といった状態名は W3C WebRTC の RTCIceTransportState をそのまま流用しています。