既存の TURN プロバイダーとして、顧客向けに Cloudflare Realtime TURN へ切り替えたい場合は、いくつか考慮点があります。
Cloudflare Realtime TURN サービスは、TURN サーバーに伴う有形・無形のコストを下げられます。
- サーバー費用(AWS EC2 など)
- 帯域費用(Egress、ロードバランシングなど)
- TURN プロセスの構築とサーバー保守にかかる時間と工数
- サーバーのスケールアップ/スケールダウン
- セキュリティと機能更新による TURN サーバーの維持
- 高可用性の維持
Cloudflare Realtime TURN サービスを大規模に使うときは、「testing」「staging」「production」などの環境を TURN キーで分けることを検討してください。アカウントあたり最大 1,000 個の TURN キーを作成でき、エンドユーザー資格情報の生成に使えます。
特定の TURN キーで作成できるエンドユーザー資格情報の数に上限はありません。
Cloudflare Realtime TURN サービスでは、次のように資格情報を生成するときに、各資格情報へカスタム識別子を付けられます。
curl https://rtc.live.cloudflare.com/v1/turn/keys/$TURN_KEY_ID/credentials/generate \
--header "Authorization: Bearer $TURN_KEY_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{"ttl": 864000, "customIdentifier": "user4523958"}'このフィールドで、特定のユーザーまたはユーザーグループの利用量を集計し、分析を取れます。
アカウント全体の利用量は GraphQL analytics API で監視できます。請求用の全体把握や、想定外の変化の確認に役立ちます。TURN analytics から、各種フィルタを付けた時系列データを取得できます。
TURN 資格情報をエンドユーザーと共有する場合、資格情報の不正利用が起こり得ます。各資格情報にカスタム識別子を付け、GraphQL analytics API でアプリケーション内の上位カスタム識別子を監視すると、不正利用を把握できます。
アプリケーションで TURN 利用量を請求するときは、TURN analytics の適応型サンプリングを理解し、考慮することが重要です。この仕組みは、大規模データセットを効率よく扱いながら精度を保つために適応型サンプリングを使います。
TURN analytics のサンプリングは次の 2 層で動きます。
- データ収集時: 利用量データポイントの生成が速すぎると、サンプリングされることがあります。
- クエリ時: クエリが複雑すぎる、または対象期間が長すぎると、追加のサンプリングがかかることがあります。
正確な請求のため、顧客ごと・期間ごとの TURN 利用量を合計し、単一の値を返すクエリを 1 本書いてください。複数顧客の利用量を同時に列挙するクエリは避けてください。
この指針に沿い、TURN analytics のサンプリングの扱いを理解すると、エンドユーザーの TURN 利用量に基づく請求をより正確にできます。
query{
viewer {
usage: accounts(filter: { accountTag: "8846293bd06d1af8c106d89ec1454fe6" }) {
callsTurnUsageAdaptiveGroups(
filter: {
datetimeMinute_gt: "2024-07-15T02:07:07Z"
datetimeMinute_lt: "2024-08-10T02:07:05Z"
}
limit: 100
orderBy: [customIdentifier_ASC]
) {
dimensions {
customIdentifier
}
sum {
egressBytes
}
}
}
}
}次は、1 顧客の利用量だけを取得するクエリです。
query{
viewer {
usage: accounts(filter: { accountTag: "8846293bd06d1af8c106d89ec1454fe6" }) {
callsTurnUsageAdaptiveGroups(
filter: {
datetimeMinute_gt: "2024-07-15T02:07:07Z"
datetimeMinute_lt: "2024-08-10T02:07:05Z"
customIdentifier: "myCustomer1111"
}
limit: 1
orderBy: [customIdentifier_ASC]
) {
dimensions {
customIdentifier
}
sum {
egressBytes
}
}
}
}
}