弾幕システムアップデートの血と涙

弾幕システムアップデートの血と涙

2016年はライブ放送の波が高まった最初の年であり、多くのインターネット企業がライブ放送コンテンツモジュールに取り組み始めました。現在の会社で私が最初に引き受けた仕事は、生放送事業における集中砲火システムの最適化でした。同社の生放送事業の変化に伴い、弾幕システムも初期バージョンから3~4バージョンにわたって最適化されていった。このプロセスは約1年続きました。この記事では、まず当社の初期の弾幕システムから始め、アップデートプロセス全体の「血と涙」を紹介します。

初期の弾丸スクリーンシステム

1. 基本状況

1. PHP + Gatewayフレームワークで書かれた

2. すべてのクライアントIDはRedisに保存されます

3. 当初、LVSシステムの後ろに3台のマシンが設置され、サービスを提供した。

4. マルチプロセスモードを使用して複数のワーカープロセスを開き、メッセージ配信コンテンツを処理します。

2. 既存の問題

1. メモリ使用量が膨大です。 1 台のマシン (4 コア、8G 構成) で約 500 のクライアントをサポートすると、メモリ制限に達します。

2. メッセージが送信されるたびに、各マシンは Redis から対応する部屋のすべてのクライアント ID を取得する必要があります。同時実行性が高い場合、Redis の単一プロセス処理効率とイントラネット帯域幅がボトルネックになります。

3. 単一マシンの同時処理能力は、メッセージ処理のワーカープロセスの数によって制限されます。同時にあまりにも多くのプロセスを開始すると、システム リソースが無駄になります。

4. 1 つの部屋に 2,000 人以上が集まると、メッセージの遅延が 1 分程度に達する可能性があり、これは非常に深刻な問題です。

3. 一時的な変化

解決すべき問題は非常に緊急であったため、論理的な変更とビジネス レベルのトレードオフをすぐに行いました。

1. Redis インスタンスは 2 台のマシンに分割され、1 台のマシンに 4 つのインスタンスが配置され、Redis への負荷が分散されました。

2. メッセージ処理ワーカープロセスのロジックにいくつかの変更が加えられ、単位時間あたりにブロードキャストされるメッセージ数が制限され、超過したメッセージは破棄されるようになりました。

3. ライブ放送が完了し、オンデマンド状態になった部屋では、トラフィックを迂回するための追加の集中砲火システムが有効になります。

4. メッセージ処理のために 1 つの部屋を複数の部屋に分割します。

4. 変換後の効果

1. Redisの圧力が大幅に軽減される

2. 単一マシンのIOパフォーマンスの圧力が軽減される

3. 同じ数のマシンでより多くのライブ放送ルームをホストできる

[[215183]]

しかし、根本的な問題は解決されていません。圧力の問題を一時的に解決した後、時間をかけて堰堤システムを再分析し、分析された要件に従って新しい堰堤システムを再構築する必要があります。

新しい弾丸スクリーンシステム

1. 新しい箇条書きコメントシステムが直面する課題

1. 一つの部屋に入る人数が比較的多い。弊社のライブ配信状況により、1つの部屋に5万人から10万人が同時にオンラインになることがあります。

2. 生放送コンテンツ等の理由により、一定期間内に利用者数が急増する。

3. できるだけリアルタイムで到着する必要があります。遅延が大きすぎると、インタラクションのリアルタイム性が大幅に低下します。

4. 各メッセージを配信するには、多数の長い接続が必要です。

5. 多数の長い接続を維持するためのメカニズム。

6. 運用プロセス中に、ユーザーブラックリスト、IP ブラックリスト、敏感な単語などのニーズに対処する必要があります。

2. 新しい弾丸スクリーンシステムの要件

1. メモリ管理は PHP の欠点であるため、高い同時実行性と長期的な安定性が求められ、頻繁な更新やメンテナンスを必要としないシステムには最適な選択肢ではありません。したがって、適切な言語を選択することが必須です。

2. 分散型サポートにより迅速な水平拡張が可能になり、1 つの部屋で最大 10 万人をサポートできます。

3. サードパーティのメッセージ(ギフト情報、システム通知など)をシステムにすばやく簡単に送信できます。

4. ローカル メモリ管理を使用して、ルーム内のクライアント接続を記録し、データのやり取りとクエリ時間を大幅に節約します。

5. メッセージブロードキャストを同時にサポートし、ブロードキャストの効率を向上します。

3. 新弾幕システムバージョンの変更方法

1. 開発言語として、現在人気があり、高い並行性のサポートが優れている Golang を選択します。

2. 開発言語を使用してクライアント接続を管理し、各マシンは受信した接続要求のみを管理します。

3. 室内同時ブロードキャスト ロジックを使用して、複数の人に同時にブロードキャストします。

新しい弾丸スクリーンシステムの改造経験

次に、モジュールの詳細を分析し、さらにモジュールの上位層のスケジューリング ロジックを分析します。

1. 部屋の管理

  1. RoomInfo構造体型{
  2. RoomID 文字列 // 部屋ID
  3. Lock *sync.Mutex //ルーム操作ロック
  4. Rows []*RowList // 部屋の複数の行のスライス
  5. 長さ uint64 //現在の部屋にあるノードの総数
  6. LastChangeTime時刻時間// 最終更新時間
  7. }
  8. RowList構造体型{
  9. Nodes []*Node //ノードリスト
  10. }

各部屋には独自の ID があるため、クライアントが接続を確立すると、ロビー ルームに配置されます。次に、クライアントはRoomID自体を送信すると、対応する部屋に再接続されます。各接続が確立されると、ノードにパッケージ化され、行に配置されます。

  1. 型 Node 構造体 {
  2. ルームID文字列
  3. クライアントID int64
  4. 接続 *websocket.Conn
  5. UpdateTime時間時間 
  6. LastSendTime時刻時刻// メッセージが最後に送信された時刻
  7. IsAlive ブール値
  8. DisabledRead bool //発言権限が無効になっているかどうか
  9. }

各ノードには、接続が成功したかどうかを示す IsAlive があります。接続が切断された場合、またはその他の理由でサービスが強制的に停止された場合、このフラグの状態は変更されます。その後、接続は時間指定の処理メカニズムによって閉じられ、メモリからクリアされます。行の本質は、長さが事前に設定されたノード スライスのグループです。

メッセージを送信する場合、スライスの各グループはコルーチンを使用してメッセージを順番に送信します。同じ部屋内の接続はスライスにグループ化され、同時に送信できます。送信時には、同時状況で同じ接続に 2 つのメッセージが混在するのを防ぐために、ロックを使用して部屋全体をロックします。

2. メッセージ管理

  1. var messageChannel map[文字列]chan nodeMessage
  2. 関数init() {
  3. messageChannel = make(map[string]chan nodeMessage)
  4. }
  5. func sendMessageToChannel(roomId string, nm nodeMessage) エラー {
  6. //部屋が存在しない場合は作成します
  7. cの場合、ok:=messageChannel[roomId];わかりました {
  8. }それ以外{
  9. //ルームチャンネルを作成
  10. messageChannel[roomId] = make(chan nodeMessage, 1024)
  11. メッセージチャンネル[ルームID]
  12. //ルームインスタンスを作成する
  13. 部屋のオブジェクト:=&部屋の情報{}
  14. roomObj.RoomID = 部屋ID
  15. 部屋オブジェクト。= make([]*RowList, 0, 4)
  16. roomObj.Lock = &sync.Mutex{}
  17. // 部屋を監視するための新しいコルーチンを作成する
  18. daemonReciver(messageChannel[roomId], roomObj)を実行します。
  19. タイマーForClean(messageChannel[roomId])
  20. //ロビーの場合は、ロビークリーンアップコルーチンを開始します
  21. 部屋ID == ""の場合{
  22. CleanHall(roomObj) に移動します
  23. }
  24. }
  25. ゼロを返す
  26. }

上記は弾幕情報を送信するためのコードの一部です。まず、各部屋には独自のメッセージ チャネルがあります。これらのチャネルはすべて、RoomID をキーとして messageChannel というマップに記録されます。メッセージを受信するたびに、それを直接チャネルに投げ込むだけです。 (これは後でデーモン コルーチンによって処理されます) ルーム チャネルがない場合は、ルーム チャネルを作成し、各ルームに対して一連のコルーチンを開始します。

3. サーバー管理

ここでの解決策は比較的簡単です。実は、上の階層、つまり部屋の上にチャットルームを設けることです。すべてのサーバーはここにアクティブに接続し、各サーバーが受信した情報はこの部屋内の他のマシンにブロードキャストされます。

4. ガーディアンコルーチン管理

ガーディアン コルーチンは、部屋内の情報の正常な配布と部屋の接続の正常な管理を確保するために、多くの些細な問題を処理します。各デーモン コルーチンの機能は次のとおりです。

1. メッセージ送信コルーチン: 各ルームに 1 つずつ装備されており、ルームに送信するメッセージをチャネルから取得し、各 RowList のメッセージ送信メカニズムを同時に呼び出します。

2. ルームソートコルーチン: 切断やルーム変更など、ノードの状態を変更する動作があるため、定期的にノードをソートしたり、現在のルームに関係のないノードを削除したりして、メッセージ送信の効率を向上させるルームソートコルーチンがあります。

[[215184]]

5. テスト関連

動作環境: クラウドホスト 8コア 16Gインスタンス

オペレーティングシステム: Centos7 (システム最適化やパラメータ調整なし)

テスト内容: 1 台のマシンが 15,000 個の Websocket 接続を確立し、メッセージを送信し、指定された部屋に入ります (すべての接続が同じ部屋に入ります)。クライアントが部屋に入り、メッセージを送信します。このメッセージは、機密語、IP、およびユーザーのブラックリストによって処理され、すべてのノードにブロードキャストされます。

テスト結果:

CPU使用率: 5%未満に保つ

メモリ使用量: 2GB (オペレーティング システムのオーバーヘッドを含む)

ネットワーク使用量: ピーク値は約10Mb/s

伝送効率: 15,000 ノードのブロードキャスト、約 100 ミリ秒 - 110 ミリ秒。

テスト結果に基づいて計算:

ピーク時の処理能力が約 60 ~ 70K の 8 コア 16G マシンでは、何の負担もなく 50K を同時に実行することが完全に可能です。

6. さらなる共有

現在、この弾幕システムの基本機能をオープンソース化しようとしています。一部抜粋しており、現在のアドレスは https://github.com/logan-go/roomManager です。興味のある読者はリンクから確認することができます。

まとめ

連射システムは、ライブ/オンデマンド ビデオにさらにインタラクティブなエンターテイメント コンテンツを追加し、初期の Station A および Station B から、現在の主流のビデオ Web サイト アプリにまで発展しました。弾幕システムを健全かつ効率的に管理する方法も、現在のビデオ業界が注意を払う必要がある技術的な仕事です。

<<:  分散環境で DNS サービスの攻撃対象領域を拡大する方法

>>:  分散システムのアーキテクチャについて話しましょう

推薦する

ヤフー中国の再設計から見るウェブマスターの今後の方向性

今日、admin5でYahoo Chinaのホームページのデザイン変更に関するニュースを見たので、確...

URL にスラッシュがあるかどうかは SEO に影響しますか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています今日、Xi...

企業のウェブサイトはWeiboを使ってクレイジーなWeiboマーケティングをどのように実行できるのでしょうか?

今、Weibo はますます人気が高まっています。Weibo の魅力に感心するしかありません。140 ...

中国のレンタカーウェブサイトのトラフィックシェアによるトップ10ランキング

ヒットワイズは3月4日、公式Weiboアカウントを通じて、中国レンタカーサイトのトラフィックシェア上...

10年ぶりのアリババクラウドの新たなスタートを理解する

[51CTO.com オリジナル記事] 本日、 2019 Alibaba Cloud Summit北...

ウェブマスターデイリー:海賊版サイトの閉鎖が進行中、Baidu が PPS の買収を完了

1. 国内最大の高画質海賊版ポータルが閉鎖、従業員30人が拘束される可能性も中国のハイビジョン映画フ...

山東省金農プロジェクトが「クラウドコンピューティング」導入をリード

近年、山東省は農業の情報化において大きな進歩を遂げました。ハイライトは、山東省の「黄金農業プロジェク...

エッジでのデータ処理のベストプラクティスの改善

エッジ環境を作成するだけでは、このテクノロジーの究極の可能性を実現することはできません。これらは複雑...

最大規模のクラウド ネイティブ カンファレンスが開催されます。見逃せない 5 つのハイライトをご紹介します。

クラウド ネイティブは文化であり、トレンドでもあります。クラウド コンピューティングの時代において、...

virmach-VPS は年間 2.55 ドルで、安くて友達もいません!オプションのコンピュータルーム5室

virmach VPS は再び勢いを増し始めています。オプションのデータ センター 5 か所に VP...

ウェブサイトの SEO にはどこにも落とし穴がありますか?あなたが求めるエンタープライズネットワークマーケティングツール

インターネットの普及により、ネットワークは生活のあらゆる側面に浸透し、多くの企業がビジネスチャンスを...

新興電子商取引VS伝統的な電子商取引 Huawei Cloudは電子商取引企業が第2の成長曲線を構築できるようにします

デジタル経済の発展は、科学技術革命と産業変革の新たな局面で新たな機会をつかむための戦略的選択です。デ...

ロングテールキーワードを1日でホームページに最適化する方法

PR の低い新しいウェブサイトの場合、588 インデックスのロングテール キーワードを 1 日でホー...

適切なウェブサイトSEO診断を行う際には、こだわりすぎないようにしましょう

SEO診断という言葉が2009年に徐々に皆に認知されて以来、検索数は増加傾向にあり、2012年初頭に...

ウクライナ VPS: ukrdc、KVM 仮想化、無制限のトラフィック、苦情防止

ukrdc は 2009 年に設立されたウクライナのホスティング会社です。主な事業は VPS です。...