本体
ノード本体senca-node
映像の取り込み、メディアの処理、視聴者への配信、設定の管理を、1 つのプロセスで行います。外部のコーデックのライブラリは読み込みません。
SENCA は、高速な処理を重視して作ったメディアサーバーです。受け取ったデータは一度だけ組み立て、あとはコピーせずに各所で使い回します。ノードの中の部分どうしはメモリの上でつながっているので、外部のメッセージブローカーは要りません。設定は、同じ操作を同じ順に当てはめれば必ず同じ結果になる形で管理します。クラスターでは、独自に実装した Raft(合意の方式)でこれを全ノードに複製します。
プログラムの分担
GPU の SDK、コーデック、キャプチャ機器のドライバーといった外部のライブラリは、本体とは別のプロセスで動かします。別プロセスが異常終了しても、失敗するのはその処理だけです。別プロセスは起動し直され、ノード本体は動き続けます。
本体
映像の取り込み、メディアの処理、視聴者への配信、設定の管理を、1 つのプロセスで行います。外部のコーデックのライブラリは読み込みません。
コーデック
エンコード・デコード・合成を担当します。ノード本体が複数起動してまとめて使い(プール)、パイプでやり取りします。大きな画像のデータは共有メモリで渡します。seccomp・Landlock・rlimit で、できることを絞って動きます。
キャプチャ
V4L2・ALSA・DeckLink の機器から映像・音声を取り込み、エンコードしてからノード本体へ渡します。このプログラムが無くても、キャプチャ機器が使えないだけで、ほかの機能は動きます。
ノードの中
設定の管理
配信、トークン、録画の情報、予約、入力と出力、シークレット、パイプライン、ルームなどの設定を、まとめてコントロールプレーンのデータとして持っています。更新するときは、変更のコマンドを 1 件ずつ順に当てはめます。同じコマンドの列からは、どのノードでも同じ状態ができあがります。
コマンドを 1 件ずつ control/log に追記し、ディスクへの書き込みを確定(fsync)してから API の応答を返します。1000 件ごとに状態の全体をスナップショットとして保存し、ログを空にします。
投票に加わるノードは 1〜7 台です。どのノードに書き込んでも、リーダーへ転送されます。過半数と通信できない側では書き込めず、503 を返します。読み取りは、各ノードが手元の状態から返します。内部の時計の刻みは 100 ミリ秒で、リーダーと連絡が取れなくなってから選び直すまでの待ち時間は 1〜2 秒です。
ワークロードの配置(グリッド)
グリッドは、外部からの取り込み(pull)、外部への送信(push)、パイプライン、ルームをワークロード(ノードの上で動き続ける処理)として扱い、ノードと機器(GPU・キャプチャ機器)に割り当てます。配置の計算は、同じ条件からは必ず同じ結果になるように作っています。ノードが 1 台だけのときも、同じ仕組みで動きます。
配信の所有者
ノード間の中継
ROOMS
ルーム(ビデオ通話)は、グリッドのワークロードとして、ちょうど 1 つのノードに置かれます。別のノードにつないだ参加者には、ルームのあるノードを案内します。複数のノードで受け付ける設定(カスケード)のルームでは、つないだノードで受け付けます。参加者の状態は、ほかのノードへ複製しません。
MEDIA PIPELINES
メディアパイプライン(会議の録画や配信)は、ルームを置いたノードが 1 秒ごとに参加者を確かめ、エクスポートする配信・合成・出力を、あるべき状態にそろえます。作るものの ID は決まった規則で付けるので、作り直しても同じ ID になります。
QUIC
--quic を指定すると、1 つのポートで HTTP/3(h3)と MoQ(moqt-22)を受け付けます。どちらかは接続の最初の交渉(ALPN)で見分けます。HTTP/3 の上の WebTransport を使った MoQ も受け付けます。
実装の方針
通信の方式の実装は、ネットワークや時計に直接触れない形で書いています。そのため、実際の通信なしで細かく試験できます。Raft は、毎回同じ結果が再現できるシミュレーションで試験しています。
製品で使ってよい外部のライブラリは、一覧を作って決めています。TLS 1.3・DTLS 1.2・SRTP・QUIC の接続の手順と、データを暗号化して運ぶ部分は自前で実装しています。AES・SHA・署名などの暗号の計算には、RustCrypto などのライブラリを使います。
FFmpeg やブラウザーは、つないで動作を確かめる相手として使います。製品には含めません。
部品の地図
SENCA の中の部品を、役割ごとに 5 つの層に並べました。下の層ほど、データの形や通信の方式に近い部分です。
ノード本体と、SENCA を外から操作するための道具です。
設定の複製、ワークロードの配置、配信の所有者の管理、ノード間の中継です。
変換、合成、字幕、キャプチャです。
映像・音声のデータの形を読み書きします。ここでは変換はしません。
すべて自前で実装しています。ネットワークや時計から切り離して書いているので、単体で試験できます。