Skip to main content

直播流量指标分析

概览

直播已成为一种流行的娱乐形式,主播可以实时与观众互动。主播不仅希望能有较高的观看量,还希望能保持直播的质量,确保观众的观看体验。

在维持稳定直播时,有许多指标需要跟踪。最常见的指标之一是直播卡顿的时长。主播和观众都不希望直播卡顿太久,因为这会破坏观看体验。

在本教程中,您将学习如何使用 RisingWave 监控直播流量指标,例如视频质量和观看量。我们为本教程设置了一个演示集群,以便您可以轻松尝试。

开始之前

  • 确保您的环境中安装了 DockerDocker Compose。请注意,Docker Compose 包含在 Windows 和 macOS 的 Docker Desktop 中。如果您使用 Docker Desktop,请确保在启动演示集群之前已经运行。
  • 确保 PostgreSQL 交互式终端 psql 已安装在您的环境中。有关详细说明,请参阅 下载 PostgreSQL

第 1 步:启动演示集群

在演示集群中,我们打包了 RisingWave 和一个工作负载生成器。一旦集群启动,工作负载生成器将开始生成随机流量并将它们发送到 Kafka。

首先,将 risingwave 仓库克隆到环境中。

git clone https://github.com/risingwavelabs/risingwave.git

导航到 integration_tests/livestream 目录,并从 docker compose 文件启动演示集群。

cd risingwave/integration_tests/livestream
docker compose up -d
命令未找到?

Compose V2 中的默认命令行句法以 docker compose 开头。详见 Docker 文档

如果您使用的是 Compose V1,请改用 docker-compose

必要的 RisingWave 组件将被启动,包括 Frontend 节点、compute 节点、Meta 节点和 MinIO。工作负载生成器将开始生成随机数据并将它们发送到 Kafka topic。在这个演示集群中,物化视图的数据将存储在 MinIO 实例中。

连接到 RisingWave 以管理数据流并执行数据分析。

psql -h localhost -p 4566 -d dev -U root

第 2 步:将 RisingWave 连接到数据流

我们已经使用演示集群在 Kafka 中设置了数据流(以 JSON 格式),我们可以使用以下 SQL 语句连接到这些流。数据包含了视频流量指标的信息以及每个流的独特观众数量。

CREATE SOURCE live_stream_metrics (
client_ip VARCHAR,
user_agent VARCHAR,
user_id VARCHAR,
room_id VARCHAR,
video_bps BIGINT,
video_fps BIGINT,
video_rtt BIGINT,
video_lost_pps BIGINT,
video_total_freeze_duration BIGINT,
report_timestamp TIMESTAMP WITH TIME ZONE,
country VARCHAR
) WITH (
connector = 'kafka',
topic = 'live_stream_metrics',
properties.bootstrap.server = 'message_queue:29092',
scan.startup.mode = 'earliest'
) FORMAT PLAIN ENCODE JSON;

RisingWave 已连接到流,但尚未开始消费数据。要处理数据,我们需要定义物化视图。创建物化视图后,RisingWave 将从指定的偏移量开始消费数据。

第 3 步:创建物化视图

在本教程中,我们将创建不同的物化视图,用于跟踪视频流量性能和观众数量。

设置直播流量性能的物化视图

第一个物化视图将总结每个流每 10 分钟的流量性能。为了创建它,我们将使用 tumble 函数将每个事件映射到一个 10 分钟的窗口,并根据每个房间聚合以计算流卡顿的时长、每秒平均丢包数和平均往返时间。

CREATE MATERIALIZED VIEW live_video_qos_10min AS
SELECT
window_start AS report_ts,
room_id,
SUM(video_total_freeze_duration) AS video_total_freeze_duration,
AVG(video_lost_pps) AS video_lost_pps,
AVG(video_rtt) AS video_rtt
FROM
TUMBLE(
live_stream_metrics,
report_timestamp,
INTERVAL '10' MINUTE
)
GROUP BY
window_start,
room_id;

我们可以使用以下 SQL 语句查询结果。

SELECT * FROM live_video_qos_10min ORDER BY room_id, report_ts;

这里是一个示例结果。

        report_ts         |   room_id  | video_total_freeze_duration | video_lost_pps |  video_rtt
--------------------------+------------+-----------------------------+----------------+-----------
2022-10-19 11:30:00+00:00 | 3998783950 | 1528 | 4.64286 | 196.21429
2022-10-19 11:40:00+00:00 | 3998783950 | 3635 | 4.66667 | 196.53333
2022-10-19 11:50:00+00:00 | 3998783950 | 603 | 4.09091 | 175.18182
2022-10-19 11:30:00+00:00 | 658508327 | 1431 | 4.32143 | 201.35714
2022-10-19 11:40:00+00:00 | 658508327 | 3619 | 5.23333 | 191.86667

设置观众数量的物化视图

接下来,我们将设置两个物化视图来跟踪观众数量。

第一个物化视图将每分钟跟踪整个直播网站的独特观众数量。我们将使用 tumble 函数将每个事件映射到一个一分钟的窗口,并计算每个时间窗口内的不同观众数量。

-- 实时总 UV 数据看板。
CREATE MATERIALIZED VIEW total_user_visit_1min AS
SELECT
window_start AS report_ts,
COUNT(DISTINCT user_id) AS uv
FROM
TUMBLE(
live_stream_metrics,
report_timestamp,
INTERVAL '1' MINUTE
)
GROUP BY
window_start;

我们可以使用以下 SQL 语句查询结果。

SELECT * FROM total_user_visit_1min ORDER BY report_ts;

这里是一个示例结果。

        report_ts         | uv
--------------------------+----
2022-10-19 11:35:00+00:00 | 2
2022-10-19 11:36:00+00:00 | 2
2022-10-19 11:37:00+00:00 | 2
2022-10-19 11:38:00+00:00 | 2
2022-10-19 11:39:00+00:00 | 2

第二个物化视图将每分钟跟踪每个主播的独特观众数量。我们将使用 tumble 函数将每个事件映射到一个一分钟的窗口,然后按 room_id 分组,计算每个主播的独特观众数量。

CREATE MATERIALIZED VIEW room_user_visit_1min AS
SELECT
window_start AS report_ts,
COUNT(DISTINCT user_id) AS uv,
room_id
FROM
TUMBLE(
live_stream_metrics,
report_timestamp,
INTERVAL '1' MINUTE
)
GROUP BY
window_start,
room_id;

我们可以使用以下 SQL 语句查询结果。

SELECT * FROM room_user_visit_1min ORDER BY room_id, report_ts;

这里是一个示例结果。

        report_ts         | uv |  room_id
--------------------------+----+-----------
2022-10-19 11:35:00+00:00 | 1 | 3998783950
2022-10-19 11:36:00+00:00 | 1 | 3998783950
2022-10-19 11:37:00+00:00 | 1 | 3998783950
2022-10-19 11:38:00+00:00 | 1 | 3998783950
2022-10-19 11:39:00+00:00 | 1 | 3998783950

完成后,运行以下命令以断开 RisingWave 的连接。

\q

可选:要删除容器和生成的数据,请使用以下命令。

docker compose down -v

总结

在本教程中,我们学到了:

  • 如何分析视频流量指标。
  • 如何设置实时数据看板以跟踪独特观众数量。