V

時雨堂の WebRTC SFU Sora ではクライアントとサーバの負荷や転送量を減らすために独自の機能であるスポットライト機能が入っています。

スポットライト機能とは「直近で話をした数人」は普通の画質で、「それ以外の人」を低画質で配信することで受信側の負荷を抑え、多くの人数を画面に同時に表示させることを可能にする仕組みです。

この機能は WebRTC SFU Sora の強みの一つであり、積極的に改善を進めています。

次のリリースに向けて 3 つの改善を行う予定です。

最大アクティブ数の設定

実際このスポットライト機能を使うとかなりのユーザが同時に表示できるようになるのですが、より負荷を減らすために最大アクティブ数の設定を追加することにしました。

  • スポットライトオン
  • スポットライトオフ
  • ステージにそもそも立たせない

スポットライトのオン/オフにもう一つ段階をつけて、そもそも「ほとんど話していないユーザは画面外へ行ってもらう」つまり「サーバから映像を送らないようにする」という仕組みを追加します。

この仕組みを導入することでよりクライアントとサーバ負荷を減らすことができるようになります。

イメージとしてはスポットライトが 1 つで、最大アクティブが 4 人の場合は画面に表示されるのは 4 人で、普通画質になるのは 1 人です。ここで参加者は実は 20 人いたとしても、実際に受信する映像は 4 つで、普通が 1 つ、低画質が 3 つになるため、かなり負荷が下がります。

表示は以下のようになりますが、実際は参加者は 20 人いて、話し始めた非アクティブな人がスポットライトオン&アクティブになります。そして話していないスポットライトオフ&アクティブな人が追い出されて非アクティブになります。4 人だとちょっと入れ替わりが激しいかも知れないので 9 とかが無難かもしれません。

参加者 20 名、非アクティブ16 、アクティブ4、スポットライトオン1、スポットライトオフ3

参加者 16 名分の映像を受け取らなくていいのはかなり大きいです。この機能を導入することでスポットライトをより気軽に利用できるようにしたいと考えています。

非サイマルキャストの参加

スポットライトはサイマルキャストが利用できることを前提としていますが、非サイマルキャストも参加できるようにします。

これは主に画面共有だったり、サイマルキャストを利用できない端末などを参加可能にするためです。

仕組み的にはシンプルでシグナリング時に simulcast: false でも spotlight: true で参加可能にします。

復号負荷の低減

利用されていないサイマルキャストの映像や音声を Sora 側で復号しないことによりサーバの負荷を減らします。

これで 1 台のサーバに収容できる同時接続数を増やすことができ、サーバコストを減らせるようになります。

WebRTC は安定して配信できるのは当たり前でクライアントとサーバの負荷をいかに減らすかという段階に入ってきています。時雨堂もその波に乗り遅れないように色々と改善を進めていきます。

Erlang/OTP、 Go、 SQL な 1 年だった。

Erlang/OTP

がっつり書いた。QC (PropEr) や Fuzzing もできた。Erlang VM に JIT が来たり、maybe 構文が来る気配が来たり、hex.pm Private を利用し始めたりと、環境も少し変えられるようになった。そういえば rebar3 lint plugin も使い始めた。

来年は OTP 25 でさらに便利になりそう。商用パッケージミドルウェア書くなら Erlang/OTP で十分満足と感じた 1 年だった。

Go / SQL

主に HTTP と SQL を利用した何かを作る場合は Go を選択することにした。理由は sqlc があるから。SQL が苦手で ORM をなんとなく使ってきていた自分だったが、sqlc に衝撃を受けて SQL をがっつり勉強した。

今後自社サービスを作るに当たっても、バックエンドは go + sqlc を採用していく。

C++

なんとなく読める程度にはなった。雰囲気。

WebAssembly

Go からしか触っていないが、Cloudflare Workers で Rust 経由で触って WASI が活用できそうなので、そちらで触っていきたいところ。

Cloudflare Workers

2021 年 12 月に入ってからだが、今年で結構衝撃を受けた技術の一つ。もともと OpenResty という Nginx + Lua な仕組みをがっつりと使っていた事もあり、前段で処理をするというのが当たりだったが、OpenResty は性能はいいのだが、とにかく開発体験が悪い。あと Lua 皆書けない。

ところが Cloudflare Workers は JavaScirpt や TypeScript 、Rust で書けて、HTTP や WebSocket に対応して、さらには勝手にスケールもして、開発体験もよく、デプロイも簡単、さらには専用サーバもいらず、価格も安いという、OpenResty 触っていた人に取っては衝撃のサービスだとおもう。

とにかくログが console.log で出力されるのが夢のようだし、Request に Cloudflare 側で色々情報を追加してくれるのもいい。

ローカルでの開発体験とデプロイしたときの挙動も文句ない。Cloudflare Workers KV はまさに OpenResty の Dict 機能が、簡単につかえ、 GUI モツいているし、 Durable Objects に至ってはトランザクションありときて、もうよくわからない。R2 がきたらファイルアップロードも簡単になりそうで、夢のようだ。

Remix を使えば SSR ならぬ Cloudflare Workers レンダリングが簡単に実現できる。OpenResty ではできずにいたことが、Cloudflare Workers では簡単にできて最高だ。リクエストを複数箇所に飛ばすなども簡単にできるのも良い。

Cloudflare Workers はクライアントだろうがサーバだろうがとにかく HTTP を利用した何かを作るのであれば必ず触った方がいい。今までとは世界が変わる。開発体験が本当に良い。

来年は Go + sqlc と Cloudflare Workers をベースに、自社 SaaS を作れればと思う。JavaScript を悩まずに書けるようになりたい。

選択と集中

定期的にやるやつ。前書いたのが 2021–03 なので 9ヶ月でどうなったか。

Erlang/OTP

OTP-24.2 がでた。主力製品は一つ前の OTP-24 .1 JIT 対応版で提供済み。機能追加をいくつかやって、あとはリファクタリング。

早く maybe 構文が来て欲しい。

Go

RDB を引く場合はすべて Go を利用するようにしている。とにかく VSCode との体験がよいし、何より sqlc というライブラリが良いく、求めていたデータベース系ライブラリ。

ウェブアプリは Gin を利用することが多いが、Echo でもいいなと揺れている。

SQL

2021 年になって一番力を入れて学んでいるのは SQL な気がする。今まで触ってこなかった分、1 から本を買って勉強している。sqlc が SQL を書く前提のライブラリということで覚えるモチベーションが高い。来年も SQL は継続して学んでいきたい。

良い機会ということで TimescaleDB も一緒にコツコツ覚えてる。

JavaScript

自社ウェブサービスを作るに当たって、プロトタイプを作るために必要なのでちまちま覚えている。Cloudflare Workers を前提としたサービスを書いているので、知識はそこに限定している。TypeScript はいつか学ぶくらいに押さえてる。

WebRTC

DataChannel をがっつり作り込んだ事もあり、知識はそれなりになった。とくに SCTP 拡張実装はほぼ世の中に情報が無いので RFC と大本の usrsctp のソースを読む日々だった。なんとか DataChannel を利用した PubSub 機能を実現できた。

libwebrtc もあなり落ち着いてきたこともあり、細かいところを気にできるようになったのは大きい。

Cloudflare Workers

今までは OpenResty を利用して実現していたことが、たった $5 からより開発しやすく、テストしやすく、デプロイしやすくなったのが、Cloudflare Workers で実現できるようになり、本当に嬉しい。今後も積極的に利用していきたい。

Vultr

普段から使っているが、LB や FW などを使い始めるようにした。

プロダクトマネージメント

プロジェクトマネージメントを手放したため、その分プロダクトマネージメントの時間を増やせるようになった。

プロジェクトマネージメント

自社 OSS 製品のプロジェクトマネージメントをほぼ手放した。来年はより手放して任せていく予定。

サブスクリプション方式のサービスにと個人で支払っているサービスに限定している。DeepL Pro や Gyazo Pro 、Discord Nitoro などの会社で払っているのは除外

似たようなサービスを使ってる人で「え、これ使ってないの?」というのがあったら是非コメントで教えていただけると嬉しい。

または皆さんが使っているサービスを是非教えて欲しい。

価格は税込と税別が混ざってるので注意。

iCloud+ 200G

月 400 円

バックアップ用途。

Apple One

月 1100 円

アーケードと TV+ は使ってない。

Google Drive ストレージ 100G

年 2500 円

昔からの Gmail ユーザなので容量がたらないため。

Feedly Pro

年 50 ドル

まだ RSS の人なので。RSS を読むのは Reeder というのをずっと使ってる。

Dropbox Plus

月 9.99 ドル (年払い)

開始してから払ってる。上位プランは自分には不要。容量は余ってる。

Amazon プライム

年 4900 円

Amazon プライムビデオがメイン。

Instapaper Premium

年 4500 円

Pocket が使いづらいので、切り替えた。プレミアム機能は使っていないが課金してる。

Netflix

月 1490 円

見たいときに見れるのは大事。

YouTube Premium

月 1180 円

広告が得意ではないので本当に素晴らしい。最高なのでぜひ契約することをおすすめする。

Twitch Turbo

月 8.99 ドル

おそらくほぼ誰も知らないであろうサブスク。Twitch を見るときにすべての広告が排除される。