ここでは、Realtime Compute を使用してコアビデオメトリックをモニタリングする方法を、ユースケースを使用して説明します。

概要

インターネット技術の発展に伴い、ライブストリーミングの概念は広がりをみせています。 オンラインライブストリーミング、特にライブストリーミングのエコシステムに魅了される人がますます増えています。 インターネットに接続している限り、興味のあるスポーツの試合、主要なイベント、ニュースなどをオンラインで見ることができ、いつでもどこでもライブストリーミングの楽しさと便利さを体験することができます。

この体験を重視する時代では、不愉快な体験は大量のユーザー離れにつながります。 ライブストリーミング Web サイトプラットフォームの運営者は、ユーザー (配信者やファンを含む) の体験を重要視する必要があります。 主要なシステムメトリックには、オーディオ/ビデオフレームのフリーズ率、レイテンシ、パケット損失率などが含まれます。 ライブストリーミングのリアルタイム性の維持という要件を満たすためには、プラットフォーム運用者は周辺システムの障害をリアルタイムに検出し、ユーザー体験に影響が及ぶ前にその障害を修正する必要があります。 また、プラットフォーム運用者は、Web サイト全体の運用状況と人気のビデオプロダクトをタイムリーに追跡し、理解する必要があります。

次のユースケースでは、ライブストリーミング Web サイトプラットフォームが Realtime Compute を使用してシステムの安定性と運用状況をリアルタイムにモニタリングし表示する方法について説明しています。

ビジネス概要

高度にインタラクティブなユーザーコミュニティを構築し、より多くのライブストリーミングシナリオを網羅してより多くの利益を生み出すためには、プラットフォーム運用者は通常、ライブストリーミング Web サイトで複数の配信者を雇います。 配信者はそれぞれ 1 つのチャンネルでファンに対して動画を配信します。 ファンは配信者の動画配信を 1 つのチャンネルで視聴し、配信者の声を聞くことができます。 配信者は、チャンネルで複数のファンとプライベートチャットを行うことができます。

配信者とファンがそれぞれのデバイスで使用するライブストリーミングアプリは、追跡ログを 10 秒ごとにサーバーへ送信します。 サーバーはログをローカルディスクへ保存し、Log Service のログコレクターを使用して Log Service へログを送信します。 Realtime Compute はログをサブスクライブして、クライアントの動画の再生状況をリアルタイムで計算します。

次の図は、全体のプロセスを示しています。

ビジネス目標

クライアントアプリから送信された追跡ログに基づいて次のメトリックスを取得します。

  • フレームのフリーズ、フレームのドロップ、オーディオ/ビデオ信号のずれなど、チャンネル障害
  • リージョンごとに収集された平均 E2E レイテンシ
  • リアルタイムで収集されたフレームのフリーズ率 (フレームのフリーズを経験したオンラインユーザーの数 / オンラインユーザーの総数 × 100。 このメトリックは、現在フレームのフリーズを経験しているユーザーの範囲を測定するために使用します。)
  • ユーザーあたりのフレームのフリーズ回数 (オンラインフレームのフリーズ回数の合計 / オンラインユーザーの総数。 このメトリックは、フレームのフリーズ回数に基づいて、フレームのフリーズの全体的な重症度を測定するために使用します。)

Realtime Compute を使用して、前述のデータをリアルタイムに計算し、結果を RDS へ保存し、レポートとダッシュボードを使ってオンラインデータを表示します。 モニタリング中にトリガーされたアラートも表示されます。

データ形式

次の表は、クライアントアプリがサーバーへ送信する追跡ログのデータ形式について説明しています。

フィールド名 説明
ip クライアントの IP アドレス
agent クライアントのデバイスタイプ
roomid チャンネルの ID
userid ユーザーの ID
abytes オーディオのビットレート
afcnt オーディオフレームの数
adrop ドロップしたオーディオフレームの数
afts オーディオのタイムスタンプ
alat オーディオフレームの E2E レイテンシ
vbytes ビデオのビットレート
vfcnt ビデオフレームの数
vdrop ドロップしたビデオフレームの数
vfts ビデオのタイムスタンプ
vlat ビデオフレームの E2E レイテンシ
ublock アップストリームフレームがフリーズした回数
dblock ダウンストリームフレームがフリーズした回数
timestamp ログが生成された時刻
region アクションが実行されるリージョン

Log Service は、半構造化ストレージを使用して、前述のフィールドを次のログ形式を用いて表示します。

{
    "ip": "ip",
    "agent": "agent",
    "roomid": "123456789",
    "userid": "123456789",
    "abytes": "123456",
    "afcnt": "34",
    "adrop": "3",
    "afts": "1515922566",
    "alat": "123",
    "vbytes": "123456",
    "vfcnt": "34",
    "vdrop": "4",
    "vfts": "1515922566",
    "vlat": "123",
    "ublock": "1",
    "dblock": "2",
    "timestamp": "15151922566",
    "region": "hangzhou"
}
			

SQL 文

  • データクレンジング

    Realtime Compute でソーステーブルを宣言します。

    CREATE TABLE app_heartbeat_stream_source (
        ip VARCHAR,
        agent VARCHAR,
        roomid VARCHAR,
        userid VARCHAR,
        abytes VARCHAR,
        afcnt VARCHAR,
        adrop VARCHAR,
        afts VARCHAR,
        alat VARCHAR,
        vbytes VARCHAR,
        vfcnt VARCHAR,
        vdrop VARCHAR,
        vfts VARCHAR,
        vlat VARCHAR,
        ublock VARCHAR,
        dblock VARCHAR,
        `timestamp` VARCHAR,
        app_ts AS TO_TIMESTAMP(CAST(`timestamp` AS BIGINT)), -- Specify the fields for generating a watermark.
        WATERMARK FOR app_ts AS withOffset(app_ts, 10000) -- Add an offset of 10 seconds to define a watermark.
    ) WITH (
        type ='sls',
        endPoint ='http://cn-hangzhou-corp.sls.aliyuncs.com',
        accessId ='yourAccessId',
        accessKey ='yourAccessSecret',
        project ='yourProjectName',
        logStore ='app_heartbeat_stream_source',
    );

    ビジネスの便宜上、ソーステーブルではすべてのデータを VARCHAR 型として処理します。 続く処理を容易にするため、次の目的でソーステーブルのデータをクレンジングします。

    1. フォーマット変換:一部のデータのフォーマットを VARCHAR から BIGINT へ変換します。
    2. ビジネスデータの補完:たとえば、リージョンデータの入力などです。

    例:

    CREATE VIEW view_app_heartbeat_stream AS
    SELECT
        ip,
        agent,
        CAST(roomid AS BIGINT),
        CAST(userid AS BIGINT),
        CAST(abytes AS BIGINT),
        CAST(afcnt AS BIGINT),
        CAST(adrop AS BIGINT),
        CAST(afts AS BIGINT),
        CAST(alat AS BIGINT),
        CAST(vbytes AS BIGINT),
        CAST(vfcnt AS BIGINT),
        CAST(vdrop AS BIGINT),
        CAST(vfts AS BIGINT),
        CAST(vlat AS BIGINT),
        CAST(ublock AS BIGINT),
        CAST(dblock AS BIGINT),
        app_ts,    
        region
    FROM
        app_heartbeat_stream_source;
  • チャンネル障害の統計

    10 分ごとに新しいウィンドウを使用してチャンネル障害に関する統計を収集します。フレームのフリーズ、ドロップ、オーディオ/ビデオ信号のずれなどが含まれます。

    CREATE VIEW room_error_statistics_10min AS
    SELECT
        CAST(TUMBLE_START(app_ts, INTERVAL '10' MINUTE) as VARCHAR) as app_ts,
        roomid,
        SUM(ublock) as ublock, -- Collect statistics on the number of upstream frame freezing times in the last 10 minutes.
        SUM(dblock) as dblock, -- Collect statistics on the number of downstream frame freezing times in the last 10 minutes.
        SUM(adrop) as adrop, -- Collect statistics on the number of audio packets dropped in the last 10 minutes.
        SUM(vdrop) as vdrop, -- Collect statistics on the number of video packets dropped in the last 10 minutes.
        SUM(alat) as alat, -- Collect statistics on the audio latency in the last 10 minutes.
        SUM(vlat) as vlat, -- Collect statistics on the video latency in the last 10 minutes.
    FROM
        view_app_heartbeat_stream
    GROUP BY
        TUMBLE(app_ts, INTERVAL '10' MINUTE), roomid
  • リージョンごとに収集された待ち時間の統計

    オーディオ/ビデオデータの平均 E2E レイテンシに関する統計を、リージョン別に 10 分ごとに収集します。

    CREATE VIEW region_lat_statistics_10min AS
    SELECT 
        CAST(TUMBLE_START(app_ts, INTERVAL '10' MINUTE) as VARCHAR) as app_ts,
        region,
        SUM(alat)/COUNT(alat) as alat,
        SUM(vlat)/COUNT(vlat) as vlat,
    FROM
        view_app_heartbeat_stream
    GROUP BY
        TUMBLE(app_ts, INTERVAL '10' MINUTE), region;
  • リアルタイムで収集されたフレームのフリーズ率

    次の式に従って、全体的なフレームのフリーズ率を計算します。フレームのフリーズを経験したユーザーの数 / オンラインユーザーの総数 × 100%。 このメトリックは、フレームのフリーズを経験したユーザーの範囲を測定するために使用します。

    CREATE VIEW block_total_statistics_10min AS
    SELECT
        CAST(TUMBLE_START(app_ts, INTERVAL '10' MINUTE) as VARCHAR) as app_ts,
        SUM(IF(ublock <> 0 OR dblock <> 0, 1, 0)) / CAST(COUNT(DISTINCT userid) AS DOUBLE) as block_rate, -- COUNT(DISTINCT) is supported only in Realtime Compute V1.4.4 and later.
    FROM
        view_app_heartbeat_stream
    GROUP BY
        TUMBLE(app_ts, INTERVAL '10' MINUTE);
  • ユーザーあたりのフレームのフリーズ回数

    次の式に従って、ユーザーあたりのフレームのフリーズ回数を計算します。フレームがフリーズした合計回数 / オンラインユーザーの総数。 このメトリックは、フレームのフリーズ回数に基づいて、フレームがフリーズした全体的な重症度を測定するために使用します。)

    CREATE VIEW block_peruser_statistics_10min AS
    SELECT
        CAST(TUMBLE_START(app_ts, INTERVAL '10' MINUTE) as VARCHAR) as app_ts,
        SUM(ublock+dblock) / CAST(COUNT(DISTINCT userid) AS DOUBLE) as block_peruser, -- COUNT(DISTINCT) is supported only in Realtime Compute V1.4.4 and later.
    FROM
        view_app_heartbeat_stream
    GROUP BY
        TUMBLE(app_ts, INTERVAL '10' MINUTE);

デモコードとソースコード

Alibaba Cloud チームでは、デモコードを作成しました。このデモコードには、上記のコアビデオメトリックモニタリングソリューションに使用することができる完全なリンクが含まれています。

  • ソーステーブルとして、DataHub インスタンスへ CSV ファイルをアップロードします。
  • RDS 結果テーブルを作成します。

デモコードを参照して、入力データと出力データを登録することで、ご自身のコアビデオメトリックモニタリングソリューションを開発します。 添付資料をクリックし、デモコードをダウンロードします。