0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Xây dựng Pipeline Phân Tích Game Thời Gian Thực với SQL

Đăng vào 7 tháng trước

• 9 phút đọc

Giới thiệu

Ngành công nghiệp game đang phát triển nhanh chóng, với dữ liệu thời gian thực đóng vai trò trung tâm trong sự chuyển mình này. Dữ liệu thời gian thực giúp cải thiện:

  • Sự chìm đắm: Phản hồi nhanh và trải nghiệm chơi mượt mà.
  • Sự công bằng: Cập nhật đồng bộ cho tất cả người chơi.
  • Sự gắn kết: Cá nhân hóa dựa trên hành vi người dùng ngay lập tức.
  • Khả năng mở rộng: Hạ tầng phát triển song song cùng với lượng người dùng.

Tuy nhiên, việc xây dựng các pipeline thời gian thực thường phức tạp và tốn thời gian. Trong bài viết này, tôi sẽ hướng dẫn bạn cách xây dựng một pipeline dữ liệu thời gian thực cho game — giảm thời gian phát triển từ vài tuần xuống còn vài ngày — tập trung vào bảng xếp hạng và bảng điều khiển trực tiếp.

Bảng xếp hạng thời gian thực không chỉ là một tính năng phụ; chúng thúc đẩy sự cạnh tranh, giá trị chơi lại và độ tin cậy. Trong một trò chơi Battle Royale nhanh như Fortnite, điều này càng quan trọng hơn.

Kiến trúc

Dữ liệu người chơi được nhập vào một chủ đề Kafka, và RisingWave sẽ tiêu thụ dòng dữ liệu này để tạo ra các view vật lý cho phân tích thời gian thực. Sử dụng các công cụ BI như Superset hoặc Grafana, chúng ta sẽ xây dựng các bảng điều khiển để theo dõi hiệu suất người chơi và cung cấp bảng xếp hạng. Cuối cùng, tôi sẽ chỉ cho bạn cách gửi kết quả từ RisingWave đến các nền tảng phân tích như BigQuery, Snowflake hoặc StarRocks và các mô hình ML cho các ứng dụng hạ nguồn như cá nhân hóa.

Dữ liệu mẫu

Dữ liệu mẫu mà chúng ta sẽ nhập vào Kafka chứa các thống kê gameplay từ một phiên trong một trò chơi Battle Royale như Fortnite.

json Copy
{
  "player_name": "Jordan Smith",
  "mental_state": "tired",
  "match_id": 1,
  "total_kills": 1,
  "damage_dealt": 750,
  "distance_moved": 4764.25,
  "longest_kill": 349.8,
  "time_survived": 302,
  "player_rank": 7,
  "boosts_used": 2,
  "medkits_used": 0,
  "revives": 2,
  "headshot_kills": 3,
  "assists": 3,
  "team_placement": 34,
  "ts": "2024-07-15 21:05:15",
  "placed": 40,
  "eliminations": 3,
  "accuracy": 41.33,
  "hits": 42,
  "damage_taken": 100,
  "damage_to_players": 210,
  "damage_to_structures": 3627,
  "healing_done": 644,
  "items_collected": 31
}

Nhập và Xử lý Dữ liệu vào RisingWave

RisingWave đơn giản hóa việc triển khai bảng xếp hạng thời gian thực bằng cách sử dụng các view vật lý và xếp hạng theo khoảng thời gian với logic SQL đơn giản. Nó xử lý hàng trăm nghìn cập nhật mỗi giây với độ trễ truy vấn dưới một giây và giảm thời gian phát triển từ vài tuần xuống còn vài ngày.

Tạo Nguồn Dữ liệu

Khi bạn đã triển khai cụm RisingWave, dù là trên RisingWave Cloud hay cụm RisingWave tại chỗ, bạn có thể tạo một nguồn dữ liệu như sau:

sql Copy
CREATE SOURCE fortnite_source (
    player_name VARCHAR,
    mental_state VARCHAR,
    match_id INT,
    total_kills INT,
    damage_dealt INT,
    distance_moved DOUBLE PRECISION,
    longest_kill DOUBLE PRECISION,
    time_survived INT,
    player_rank INT,
    boosts_used INT,
    medkits_used INT,
    revives INT,
    headshot_kills INT,
    assists INT,
    team_placement INT,
    ts TIMESTAMP,
    placed INT,
    eliminations INT,
    accuracy DOUBLE PRECISION,
    hits INT,
    damage_taken INT,
    damage_to_players INT,
    damage_to_structures DOUBLE PRECISION,
    healing_done INT,
    items_collected INT
)
WITH(
connector='kafka',
topic ='fortnite_topic',
properties.bootstrap.server ='xxxxx:9092',
properties.sasl.mechanism = 'SCRAM-SHA-256',
properties.security.protocol = 'SASL_SSL',
properties.sasl.username = 'xxxxxxx',
properties.sasl.password = 'xxxxxxx',
scan.startup.mode ='earliest'
)FORMAT PLAIN ENCODE JSON;

Tính Toán Hiệu Suất Người Chơi Trong Khoảng Thời Gian 1 Phút

Truy vấn này tính toán trung bình sát thương, trung bình số lần giết và tổng số trận đã chơi của mỗi người chơi trong khoảng thời gian 1 phút từ bảng fortnite_source, nhóm theo tên người chơi và khoảng thời gian.

sql Copy
SELECT
  player_name,
  AVG(damage_dealt) AS avg_damage_dealt,
  AVG(total_kills) AS avg_kills,
  COUNT(match_id) AS matches_played,
  window_start, window_end
FROM TUMBLE (fortnite_source, ts, INTERVAL '1 minute')
GROUP BY player_name, window_start, window_end;

Top 3 Người Chơi Theo Số Lần Giết Trong Khoảng Thời Gian 1 Phút

Truy vấn này xác định top 3 người chơi có số lần giết cao nhất trong mỗi khoảng thời gian 1 phút từ bảng fortnite_source. Nó đầu tiên tổng hợp số lần giết của mỗi người chơi trong mỗi khoảng thời gian, xếp hạng người chơi theo số lần giết và sau đó chọn 3 người chơi đứng đầu cho mỗi khoảng thời gian, sắp xếp kết quả theo thời gian bắt đầu khoảng.

sql Copy
WITH PlayerKillsPerWindow AS (
    SELECT
        player_name,
        window_start,
        window_end,
        SUM(total_kills) AS total_kills
    FROM
        TUMBLE (fortnite_source, ts, INTERVAL '1 minute')
    GROUP BY
        player_name,
        window_start,
        window_end
),
RankedPlayerKills AS (
    SELECT
        player_name,
        window_start,
        window_end,
        total_kills,
        ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY total_kills DESC) AS rank
    FROM
        PlayerKillsPerWindow
)
SELECT
    player_name,
    total_kills,
    window_start,
    window_end
FROM
    RankedPlayerKills
WHERE
    rank <= 3
ORDER BY window_start;

Top 3 Người Chơi Theo Thời Gian Sinh Tồn Trung Bình Trong Khoảng Thời Gian 1 Phút

Truy vấn này xác định top 3 người chơi có thời gian sinh tồn trung bình cao nhất trong mỗi khoảng thời gian 1 phút từ bảng fortnite_source. Nó tính toán thời gian sinh tồn trung bình cho mỗi người chơi trong khoảng thời gian, xếp hạng người chơi theo thời gian sinh tồn trung bình và sau đó chọn 3 người chơi đứng đầu cho mỗi khoảng thời gian, sắp xếp kết quả theo thời gian bắt đầu khoảng.

sql Copy
WITH PlayerSurvivalTimePerWindow AS (
    SELECT
        player_name,
        window_start,
        window_end,
        AVG(time_survived) AS avg_survival_time
    FROM
        TUMBLE (fortnite_source, ts, INTERVAL '1 minute')
    GROUP BY
        player_name,
        window_start,
        window_end
),
RankedPlayerSurvivalTime AS (
    SELECT
        player_name,
        avg_survival_time,
        window_start,
        window_end,
        ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY avg_survival_time DESC) AS rank
    FROM
        PlayerSurvivalTimePerWindow
)
SELECT
    player_name,
    avg_survival_time,
    window_start,
    window_end
FROM
    RankedPlayerSurvivalTime
WHERE
    rank <= 3
ORDER BY window_start;

Top 3 Người Chơi Theo Độ Chính Xác Trong Khoảng Thời Gian 1 Phút

Truy vấn này xác định top 3 người chơi có độ chính xác cao nhất trong mỗi khoảng thời gian 1 phút từ bảng fortnite_source. Nó lấy độ chính xác của người chơi trong mỗi khoảng thời gian, xếp hạng người chơi theo độ chính xác và sau đó chọn 3 người chơi đứng đầu cho mỗi khoảng thời gian, sắp xếp kết quả theo thời gian bắt đầu khoảng.

sql Copy
WITH PlayerAccuracyPercentagePerWindow AS (
    SELECT
        player_name,
        window_start,
        window_end,
        accuracy
    FROM
        TUMBLE (fortnite_source, ts, INTERVAL '1 minute')
    GROUP BY
        player_name,
        window_start,
        window_end
),
RankedPlayerAccuracyPercentage AS (
    SELECT
        player_name,
        window_start,
        window_end,
        accuracy,
        ROW_NUMBER() OVER (PARTITION BY window_start, window_end ORDER BY accuracy DESC) AS rank
    FROM
        PlayerAccuracyPercentagePerWindow
)
SELECT
    player_name,
    accuracy,
    window_start,
    window_end
FROM
    RankedPlayerAccuracyPercentage
WHERE
    rank <= 3
ORDER BY window_start;

Trực Quan Hóa Dữ Liệu Thời Gian Thực với Superset hoặc Grafana

Sau khi xây dựng các view vật lý thời gian thực trong RisingWave, bước tiếp theo là trực quan hóa. Bạn có thể kết nối RisingWave như một nguồn dữ liệu đến Apache Superset hoặc Grafana, và sử dụng nó để xây dựng các bảng điều khiển tương tác từ các bảng và view.

Khi đã kết nối, bạn có thể thêm các view vật lý như các tập dữ liệu để xây dựng bảng, biểu đồ và các bảng điều khiển thời gian thực thống nhất, cho phép bạn theo dõi các chỉ số game, bảng xếp hạng và xu hướng một cách trực quan và ngay lập tức.

Tích Hợp Phân Tích Game Thời Gian Thực và Machine Learning

Trong các kiến trúc game hiện đại, bảng xếp hạng thời gian thực không chỉ là độc lập — chúng thường cung cấp dữ liệu cho các nền tảng phân tích hạ nguồn và quy trình AI/ML để nâng cao trải nghiệm người chơi.

  • Nền tảng phân tích: Các công cụ như BigQuery, Snowflake hoặc StarRocks thường được sử dụng để phân tích hành vi người chơi, giám sát KPI và phát hiện xu hướng gameplay theo thời gian thực.
  • Quy trình AI/ML: Dữ liệu streaming có thể được sử dụng để cung cấp mô hình thông minh cho: Cá nhân hóa trong game và gợi ý; Điều chỉnh độ khó động; Mô hình hành vi dự đoán.

Lợi ích chiến lược: Sự kết hợp giữa dữ liệu thời gian thực và machine learning cho phép trải nghiệm game thích ứng và cá nhân hóa dựa trên hành động của người chơi.

Kết luận

Chúng ta đã đi qua cách xây dựng một pipeline dữ liệu thời gian thực cho game sử dụng Kafka và SQL — cung cấp bảng xếp hạng và bảng điều khiển trực tiếp mà không cần mã streaming phức tạp. Các sự kiện người chơi chảy vào Kafka, được tổng hợp với các view vật lý và các hàm khoảng thời gian, và trở thành có thể truy vấn ngay lập tức để theo dõi và xếp hạng.

Điểm mấu chốt: bạn không cần hàng tuần mã streaming tùy chỉnh để cung cấp cập nhật trong mili giây. Một pipeline SQL-first giúp bạn có thể giao hàng nhanh hơn, giữ người chơi gắn bó và mở rộng cùng một mô hình đến các nền tảng phân tích hoặc các mô hình ML cho cá nhân hóa và trải nghiệm game thông minh hơn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào