Erlangの上のビデオ共有の開発

Application Developer Daysカンファレンスで彼が作成したMaxim Lapshinのレポートに注目してください。 ビデオとオーディオ、プレゼンテーションスライド、レポートのトランスクリプトをまとめました。 後者は、膨大な労力を必要とするが、それは明らかにそれだけの価値があります。 40分のレポートは、数倍速く「聞こえる」ことがあります。

彼はビデオとプレゼンテーションを1本のビデオにまとめ、またStas Fomin(男性と蒸気機関車:))のトランスクリプトを記録しました。

注釈


スケーラブルなWebサービスの開発者であるMaxim Lapshinerlyvideo )は、Erlangでのビデオストリーミングサーバーの開発について話しました。 セキュリティカメラからビデオ会議まで、オープンソースプロジェクトであるErlyVideoについて話します。これは、あらゆるビデオをブロードキャストするための、ますます信頼性が高くスケーラブルで無料のサーバーです。 この技術は、Erlangのようなあまり知られていない言語の選択であり、高い信頼性、スケーラビリティ、および開発速度を提供したため、特に興味深いものです。

Erlangは、ネットワークサービスを作成するための信頼できるオブジェクト言語です。 プロセスの概念とそれに適用されるデータ耐性により、ガーベッジコレクションと固定オブジェクトの終了時間が同時に存在する唯一のプラットフォームになります。 言語のセマンティクスは、市場で最も一般的なものの中で最も単純なものの1つです。

これらの機能により、ビデオストリーミングサーバー(erlyvideo)、最も一般的なジャバーサーバー(ejabberd)、ポーカーサーバー(OpenPoker)など、ステートフルクライアントのサービスに最適です。 レポートでは、Erlangの実行が非常に便利な理由を調査しました。

映像




ポッドキャスト


ポッドキャストリンク

プレゼンテーション


スライドでのPDFへのリンク

転写


ビデオのトランスクリプトはStas Fominによって記録されました。

ストリーミングとは何ですか?

こんにちは、私の名前はマキシム・ラプシンです。私はErlangで書かれたErlyVideoビデオ・ストリーミング・サーバーの著者です。今日は、この製品が何であるか、なぜ作られたのか、何が作られたのか、どうしてそれをやったのかをお話ししたいと思います。

だから、まったく何をストリーミングしています。
スライド:
YouTubeは - ストリーミングされていません
YouTubeとは何ですか? 膨大な数の異なるビデオがそこに保存されていますが、これはストリーミングプロジェクトではなく、ストリーミングはありません。 nginx-ohm、まあ、または別のWebサーバーから提供される10秒のビデオがあります。

各ブラウザは、ビデオを受信して​​受信し、再生します。 しかし、これはストリーミングビデオとは何の関係もありません。 、そして、それのすべてが使用される場合、それはすべてについては何ですか?

カスタムテレビ
スライド:
ユーザーが動画をアップロード
  • プレイリストがあります
  • 他の人のリクエストで、プレイリストは再生を開始します
  • 誰も必要としない場合、ビデオは再生されません
私が最近持っていたカスタムテレビのタスクを見てみましょう。 そのため、ユーザーは、ほとんどYouTubeのようにファイルをアップロードし、そのファイルからプレイリストを作成し、それを通常のテレビのテレビ番組として表示したいと考えています。

その後、他のユーザーがいつか来ますが、必ずしも適切なタイミングではありません。 彼らはいつでも好きなときに来て、彼の面白いプレイリストを見て、彼のプログラムが好きで、彼が撮影したものを見たいと思っています。 そして、すべてのユーザーが解散したとき、彼らは興味がなく、ダウンロードされたこれらのリソースをすべて解放する必要があります。

なぜ通常のnginxeでそれをすべてやらないのですか?

ランインテクノロジーのようで、同じYouTubeが機能しますが、機能しません。

何がドライブを作りますか?
スライド:
何がドライブを作りますか?
  • ファイルコンテナからのビデオとオーディオの圧縮を解除
  • 輸送用コンテナ内のパック
  • リアルタイムに同期してフレームを送信します
問題は、利用可能なファイルをビデオストリームに提供する必要があることです。 あなたはモノトーンを必要とするので、すべてのユーザーが同じことを示しています。

このタスクには、ストリーマー、つまりこれを行うストリーミングビデオサーバーが必要です。
  1. 彼は、ディスク上のコンテナから必要なファイルを取得します。
  2. 彼はそれらをトランスポートコンテナに詰め、それを介してビデオを見に来たユーザーにビデオを配信することができます。
  3. そして、リアルタイムで同期してフレームを送信することを理解することは非常に重要です。
したがって、ログインすると、30分でリアルタイムになり、ファイルから30時間のリアルタイムが得られます。 ファイルをダウンロードするだけであれば、はるかに高速にダウンロードできます。

コーデックについての余談

少しの余談で、誰もがコーデックとコンテナが何であるかを理解するので、混乱はありません。 コーデック、これはあなたがそれを手に入れたものです...これは、カメラのマトリックスまたはマイクからキャプチャされた生データを表すためのフォーマットです。

コンテナは、すでにエンコードされたデータがパックされるものです。 たとえば、h264またはAACに出会った場合、これらはそれぞれビデオおよびオーディオコーデックです。 そしてMP4 ...-そのようなコーデックはありません、それはあなたが絶対にあらゆるビデオと絶対にあらゆるサウンドを削除できるコンテナです。
スライド:
  • コーデック-圧縮されたオーディオおよびビデオデータのプレゼンテーション形式
  • コンテナ-ファイルまたはストリーム内のオーディオおよびビデオの1つ以上のストリームのパッケージ形式
  • H.264 / AAC-最高のコーデック
  • MP4 - 最もコンパクトなファイルコンテナ
ユーザーTVステージ
スライド:
ユーザーTVステージ
  • プレイリストをダウンロードする
  • ファイルを解凍する
  • トランスポートコンテナー(RTMP、MPEG-TSなど)にフレームをパックする
  • 顧客が離れるときはすべてがクリーンアップ
  • 顧客を切断せずに更新コードを許可します
そのため、ユーザテレビを示す、サーバーを何でしょうか? 彼はプレイリストをダウンロードし、ファイルをアンパックし、それらを再パッケージし、すべてをクリーンアップします。別に言及しなかった非常に重要なことは、このタスクではクライアントを切断せずにコードを更新することが非常に重要であるということです面白い動画を見に来た顧客。 現時点でそれらの更新プログラムを公開したい場合は、これらの何千人もの顧客が再び私たちに来て再接続します。

これは平凡であり、ユーザーにとっては不便であるという事実に加えて、トラフィックが完全に詰まるため、非常に非常に高価です。

従来のソリューション

人々は通常、そのような決定を何に対してしますか? 従来のソリューション、これらは従来のツール-Java、C ++、ビデオストリーミングを扱う製品を備えています。 これは、たとえば、Red5、Javaで書かれた無料の有料Wowza、またはC ++で書かれたrtmpdです。

Javaでのmp3の解析

問題は何ですか...? さて、ここに私が挙げた例があります。これは小さなコードです。JavaのRTMPがどのように解析されるか、これは小さなコード、100分の1ファイルです。

これはJavaのサーバーの外観です。詳しく見ることができます-これはファイルの小さな部分です。 これを詳しく調べることは非常に困難です。
if (id3v1 instanceof ID3V1_1Tag) { try { // Add the track property graph.add(mp3Resource, processor.resolveIdentifier(IdentifierProcessor.TRCK), factory.createLiteral("" + ((ID3V1_1Tag) id3v1).getAlbumTrack())); } catch (GraphException graphException) { throw new ParserException( "Unable to add track number to id3v1 resource.", graphException); } catch (GraphElementFactoryException graphElementFactoryException) { throw new ParserException( .... ѐ 600   graphElementFactoryException); } } 

mp3をErlangに解析

MP3をデコードするためにErlangeで書く必要があるのはそれだけです。 それだけです 5行。 既に解凍されており、ユーザーに送信できます。

 decode(<<2#11111111111:11, VsnBits:2, LayerBits:2, _:1, BitRate:4, _/binary>> = Packet) -> Layer = layer(LayerBits), Version = version(VsnBits), <<Frame:(framelength(bitrate({Version,Layer}, BitRate))/binary, Rest/binary>> = Packet, {ok, Frame, Rest}. 

したがって、私たちが得るもの-最初から、ファイルの展開から、何かが正しくありません。JavaとC ++では、コードにたくさんのコード、オーバーヘッドのロジックを記述します。

しかし、すべてが...このすべての構文糖衣になり、何千人もの顧客が私たちに来るとき、それは完全に重要ではなくなります。

そして、そこにコードを書くことが便利であるか不便であるかに関係なく、まったく新しい性質の問題を抱えています。

問題は何ですか? まあ、これはすべていつものことです。メモリ管理。フローしないため、セグメンテーションフォールトがキャッチされません。メモリを効果的に解放するために、私たちのところに来て、覚えておく必要があります。

C ++の場合、別の問題があります。Javaを使用すると、メモリとの直接的な作業ができないため、何らかの方法でコードを保護できます。 C ++では、エラーは1か所にあります。特にマルチスレッドアプリケーションがある場合、アプリケーション全体が破壊される可能性があり、このバグをデバッグすることはありません。 C ++プログラム、特にマルチスレッドでは、まだ見つかっていないバグがあり、そこにあるとは思わないことを保証できます。

そして、もう一つの問題は、何千もの顧客を開始するとき、あなたが入力と出力を整理するのは難しい必要があるということです。 スレッドを使用してソケットに書き込むだけでは十分ではありません。異なる複雑なメカニズムを使用する複雑なライブラリまたはイベントを使用する必要があります。
スライド:
数千の顧客を抱える従来のソリューションの課題
  • メモリ管理:リークまたは時期尚早なリリース
  • 顧客リソース管理
  • 1か所でのカオスシステム障害
  • 数千の顧客にサービスを提供するときの入出力

なに? Red5サーバーは100人のユーザーの下でクラッシュします。 ああ、残念ながら、赤にならなかった
画像
すでに100人のユーザーでサーバーが落ち、クライアントにサービスを提供していません。 なんで? はい、それは不十分に書かれているため、人々はそれを開発するときにそれを考慮していませんでした、I / Oの問題、そして今、それは役に立たなくなります。

Wowzaの場合、クライアントが抱えていた他の問題があります。Javaにガベージコレクターがあり、どこかにリンクが残っている、リソースが解放されていない、サーバーが膨張しているにもかかわらず、Wowzaフローがあり、そのように怖いです。
画像
それはどのように? たとえば、別のメッセージ配信チャネルを提供するストリーミングサーバーがあります。 ユーザーがログインし、彼のために作成されたオブジェクトがリスト内のいくつかのチャネルに登録され、そのリンクが記憶され、オブジェクトのテストが保留され、ユーザーが切断されますが、そのリンクを削除するのを忘れました。 それだけです

彼のデータは永遠に残り、無効にする必要がある情報を取得できません。 サーバーを再起動するだけです。
スライド:
epoll / kqueueは、メモリ管理のために長い接続では困難です。
I / Oに関しては、libeventライブラリがあるepoll / kqueueメカニズムが数千のソケットを提供する唯一の方法であり、非常に複雑です。複雑なビジネスロジックを開始するとき...私の意見では、イベントモデルはめちゃくちゃ難しいです。
画像
したがって、C ++サーバーでこのような構造を取得します。 ファイルシステムで一晩生き残ったcore-kiをかき集めているという事実であなたの仕事の日を始めることが保証されており、十分なハードディスクがあればそれは良いことです。

問題の根本

ある意味では、これらの問題の根本は、従来のソリューションに共通しています。 1つは共有メモリです。
画像
残念ながら、画像は再び表示されません。

システム内にあるすべてのオブジェクト間で共有される共有メモリ。 誰でもどこにでも行くことができ、何にでもリンクを張ることができ、最終的には、すべてのオブジェクトが相互参照するときにそのようなデザインが得られます。 。
画像
PHPでサイトを作成するとき、これらの問題は私たちの興味を引くものではないことを理解する必要があります。 Webサービスを提供するときに機能するアプリケーションが最大1秒間存続するという理由で、彼らは私たちに興味を持ちません。 1秒で、それが使用したものはすべて破壊される可能性があります。すべて不要になるためです。新しい要求、新しい接続がすでにあります。
スライド:
Webアプローチ→「流して、すぐに殺します」→動作しません。
これはここでは発生せず、クライアントは数時間、数日以上接続します。 そして、何週間も漏れることなく、効率的に動作するコードが必要です。

アーランはこれらの問題を根本的に解決します

アーランは、これらの問題を驚くほど根本的に解決し、私が話した問題をほぼ完全に解決するプラットフォームであることが判明しました。

これはプロセスの概念により90%行われました。
スライド:
プロセス
  • 並列スレッド
  • 分離メモリ領域
  • メッセージング交換
  • 不変変数
  • プロセス外のデータはありません
Erlangeのプロセスは、通常のシステムのスレッドのようなものです。 それらは軽量で、占有するスペースがはるかに少なく、最も重要なことには、完全に隔離されています。

Erlangeのすべてのプロセスは、何も流出しないボックスです。 そして、私たちはすでに保証されているメモリのすべてが、プロセスのいくつかの種類に属していることを知っています。 プロセスの外部にデータが存在することはできません。 つまり、常にギガバイトのメモリチャンクがある場合、それは誰のものでもないようですが、どのプロセスを所有しているかを知っており、このデータを解放するためにそれを釘付けにすることができます。
質問:しかし、バイナリは参照によってプロセス間で転送されますか?
まあ、これは実装の詳細ですが、実際にはこれらのバイナリを常に追跡することができます。 彼らは調査中です。
質問:何をどのように?
プロセスは、どのバイナリを参照し、どのサイズを参照するかを知っていることを知っています。

したがって、我々は何をすべきか:すべてのデータは、システム内の列挙プロセス内に完全に保存されています。 システム内のすべてのプロセスを実行して、誰がすべてのメモリを食べたかを調べ、システムのこのof笑を止めることができます。
スライド:
すべてのデータは列挙オブジェクト内に保存されます。
実行スレッド内およびデータの編成にプロセスアプローチのもう一つの特徴は、エラーに厳密に発生しているということです? プロセス。 対処しなかった、傍受したくないというミスがあった場合、それをさらに流そうと決め、その運命に興味がなかった、これは致命的なミスであり、プロセスは終了します。 そして最も重要なことは、オブジェクトの解放、破棄に非常によく似ています。これは、よく知られた手順であるためです。つまり、エラーが発生してからプロセスが停止することがわかっています。 それは1日ではなく、2日ではなく、今です。 そして、注文したプロセス...その状態を監視したいプロセス、他のプロセス、近隣のプロセス、彼らがこれに関する情報を受け取ること、近隣が死んだことを理解することが重要です。
スライド:
エラー処理
  • 彼らはキャッチすることができます
  • キャッチしない場合、プロセスは終了します
  • 隣人はメッセージを通してそれについて学ぶ
  • 保証されたストリッピングリソース
その結果、プロセスのステータスを監視できることがわかりました。 たとえば、ユーザーとの接続を提供する別のプロセスを開始し、ユーザーの監視を開始します。エラーが発生した場合、コードのエラー、おそらくユーザーをフォローしているプロセスが検出されます。ソケットを提供しているプロセスが停止しました。」 そのため、原則として、ユーザーにサービスを提供することにはそれ以上のポイントはなく、ユーザーにサービスを提供するものはまだありません。ユーザーにサービスを提供するために作成されたすべてのプロセスはカスケード接続する必要があります。

したがって、提供されるシステムには、この言語に付属するプラットフォームに、監督者のシステム、既製のメカニズム、非常に合理化されたプログラムのセットがあり、実際にはそれらのエラーはありません、つまり、彼らが最近エラーを見つけたことはわかりませんが、安定して動作し、プロセスを再起動できます。

なぜこれが必要なのですか? たとえば、システムで最も重要なプロセスの1つがあります。これはデーモンであり、ソケットでリッスンするプロセスです。 ソケットに固定され、システムからの接続を受け入れます。 確実に動作することを確認できます。そうしないと、システム全体が落ちる可能性があります(???)。 今、それが落ちた場合、サーバーを苦しめることは意味がありません。
スライド:
プロセス追跡
  • コミュニケーションズ
  • 上司
  • appmon
残念ながら、ラップトップでは表示できず、アダプターもありませんが、アプリモニターなどを表示したいと思います。 これもプラットフォームで提供されます。このメカニズムを使用すると、ツリーにあるすべてのプロセスのリストをグラフィカルに表示できます。 つまり、...これは非常に便利なことです。ユーザーがあなたのところに来ていることがわかり、そのオブジェクトを作成し、リソースを要求し、その下に(???)をいくつかのプロセスに登っただけです。 ...ユーザーが去り、プロセスが残っている-実際、これはプロセスのリークであり、アプリモニターの助けを借りて、これはすべて非常に明確に見られます。

しかし、残念ながら、私はあなたを見せません。 :(

Erlangの実際のホットコードアップデート

そしてErlangで、すべての既存のプラットフォーム、今、ホットコード更新のおそらく唯一のものです。 このように見えます-クライアントは切断せず、動作を続けます。ビデオストリーマーの場合、ビデオを受信し続け、オンラインゲームの場合、接続は失われず、コードはすでに新しいものを提供しています。
スライド:
顧客をオフにせず!
行うには、このようなことができ、他のシステムでは、私は知りません。

Erlangを使用した結果は何ですか?

私は独自のサーバーを作成するためのErlangを使用することを決定した後、何が最終的に起こったのか? ビデオストリーミングサーバーErlyvideoが判明しました。これは、実装された一連の機能、開発速度、安定性、効率の点で、現在、この分野で最高のトップ2に入っています。
スライド:
Erlyvideo:
  • マルチプロトコルサーバー
  • 1つのサーバーで数千のクライアントを保持
  • プラグインの既存のインフラストラクチャ
たとえば、単一のサーバーから何千ものクライアントに非常に普通にサービスを提供しますが、現在はBD(???)で運用されており、動作します。

言語の動的型付けは非常に効果的でシンプルであることが判明しました。これは、当然ながら動的であるためです。他のプロセスが何であるかがわからないため、プロセス間のすべての通信はメッセージの交換になります。 したがって、この言語...この言語の動的な類型化について話すことができます。

したがって、プラグインにとって非常に便利なインフラストラクチャであることがわかりました。これも非常に活発に開発されています。

しかし、これは正しくプラグインシステムを構築する方法を、任意の製品のための非常に敏感な問題です。 これらの場所をどこに作るか、どこにこのプラグインを貼り付けることができるかは非常に不明です。

その結果、Erlyvideoは上記の問題を完全に解決し、サーバーは数週間耐えることができ、再起動せず、メモリリークもなく、これに問題はありません。 I、例えば、価値が数ヶ月、およびうねり、同じレベルのsohnarayaメモリ。

結論

スライド:
ビデオストリーミングタスクには、Webと区別するための詳細があります。
  • 同時に必要な効率的で高レベルのツール
  • Erlangのは、このニッチにうまく収まります
  • 実用化は選択の有効性を示しています
その結果、いくつかの結論は、このタスクのためのErlangaのアプリケーションから引き出すことができますか?

インターネット上のストリーミングビデオの伝送タスクは、大幅にウェブからそれらを区別する独自の特異性を、持っています。 そして残念なことに、多くのソリューションは慣習的で信頼性が高く、非常に理解しやすいものです...そして、それらのプログラマーを簡単に見つけることができるようです。

これらの問題は発生しません。なぜなら、コードの特定の組織のためだけです。

したがって、ステートフルな顧客にサービスを提供するタスクでは、アーランは非常に適しています。 そして、実用的なアプリケーションは、この選択の極端な効果を示しています。

備品アーラン

ストリーミングビデオのニッチはかなり狭いものであることは明らかです。市場にはこれらの製品は5つしかなく、原則としてはこれで十分でしょう。 erlangで別のストリーミングビデオサーバーを記述することは意味がありません。
スライド:
  • ビデオストリーミング(erlyvideo)
  • Jabberサーバー(ejabberd)
  • 銀行処理(・プライベート・バンク)
  • オンラインゲーム(オンラインポーカー)
しかし、他のニッチな適用性もあります。たとえば、最高のJabberaサーバーは同じアーランで作られています。 グリシャはアーラン(ボブク)を強く嫌いますか? 彼は非常に、誓っ吐いたが、彼らが残した選択された - それは、製品について多くのことを言います。 また、例えば、銀行が銀行処理システムを作ることは確実に知られています。 もちろん、どの特定の詳細が、詳細が公開されていないのかはわかりませんが、Privat-Bankには、長寿命の処理システムをErlangに転送する会社がたくさんあることがわかります。

そしてもちろん、オンラインゲーム。 VKontakteの最高のおもちゃをほどいて成功した後、人々は定期的に私に向きを変えます。

私は彼らの問題を見て、私は彼らが最も可能性の高い、エアランゲンに自分のおもちゃを販売しなければならないことを理解しています。 多くのビジネスロジックはありませんが、非常に具体的であり、従来の技術、そこにあるレール、またはJavaを使用して、私が説明したすべての問題を取り除きます。

また、アーランでのポーカーのオンライン実装もあります。

ご質問は?

だから、一般的に、私はおそらくすべてを持っている、これは私が得たレポートです。 ご質問があれば、喜んでお答えします。
スライド:


回答と質問のセッションは、habro-publicationのサイズに収まらなかったため、「transcript」リンクを使用して会議のWebサイトで検索する必要があります。

Source: https://habr.com/ru/post/J114560/


All Articles