logo サブスレッド

小ネタ テレビの企画で見た負荷軽減の小技

株式会社サブスレッドのみずしま a.k.a mzsm(@mzsm_j)です。こんにちは。

NHK総合テレビで深夜に不定期放送されている「おやすみ日本」という番組があります。

内容としては、視聴者から送られてきた「眠れないモヤモヤ」にMCの宮藤官九郎、ピース又吉直樹ら出演者が答えたり、眠気を誘うような音楽を流したり、市原悦子が昔ばなしを朗読したり…と、とにかく視聴者を安眠に誘うことを目的としています。

この番組の最大の特徴は、番組終了時刻が確定しておらず、データ放送または番組サイトに表示されている「眠いいね!」ボタンを視聴者が一定回数押したところで番組終了時刻が確定する、という仕組みになっていることです。

直近では2016年4月9日に放送があったのですが、この回の「眠いいね!」目標回数は2016万回に設定されました。

深夜0時50分に番組が始まり、目標回数を達成したのは放送開始から約2時間28分後の深夜3時18分でした。
単純計算で、1分あたり約13万6000回、1秒あたり約2300回「眠いいね!」ボタンが押されたことになります。
実際には、出演者が「一斉に押しましょう!」と煽って一気にカウントを稼ぐこともあるため、ピーク時はもっと集中していたことでしょう。

ボタン連打にいかに対抗するか

前述のとおり、眠いいね!ボタンはデータ放送または番組サイトから押すことができるのですが、押される回数はデータ放送からよりも番組サイトからのほうが圧倒的に多いと思われます。

番組開始当初、データ放送からのみ「眠いいね!」ボタンを押せたころの目標回数はせいぜい80万回でした。
番組サイトが「眠いいね!」ボタンに対応してから、目標回数は2000~4000万回へと圧倒的に増えています。

さらに、データ放送では「眠いいね!」ボタンを押すとボタンの画像が引っ込んだ状態になり、次にボタンが押せるようになるまで数秒待たないといけないのですが、番組サイトの「眠いいね!」ボタンはその待ち時間が無く何度も連打できる(※ただしたまに演出が表示され、演出が終わるまでは押せない)ようになっています。

いくら深夜番組とはいえNHK総合テレビで全国放送されている番組ですし、そんなに連打できてしまってサーバや通信の負荷は大丈夫なのだろうか、と思ってブラウザのデベロッパーツールを見てみたら…なるほど工夫されていました。

結果が正しければいい

「眠いいね!」ボタンを押してから実際に送信されるまでには数秒のラグがあったのです。

さらにその送信された内容をよく見ると、ボタンを押された回数らしき数字が入っていました。

つまり、仕組みはこうです。

「眠いいね!」ボタンを一度押すとタイマーがセットされます。
その後ボタンを押すたびにカウンターの数字が加算されていきます。
時間が来てタイマーイベントが発火したら、その時点でのカウンターの数字を送信し、カウンターをリセットします。
これにより、どれだけボタンを連打しても1つのクライアントからのサーバへの送信は数秒に1回しか起きないというわけです。

早押しクイズのようにコンマ何秒のレベルで速さを争うものでもなく、結果として押された回数を正しく報告できればいいのですから、1回の通信にまとめてしまうのは賢い方法だと言えます。

データ放送で連打ができないのは、仕様上タイマーで溜め込むということができず、押されるたびに都度送信しないといけないからなのでしょうか。

番組の本筋とは何の関係もないところでひとり感心していた真夜中でした。

ちなみに、数ミリ秒間隔で自動的に「眠いいね!」ボタンを押すスクリプトをJavaScriptコンソールで実行してみたら1回の送信で100眠いいね!くらい叩き出してしまったので、不正を防ぐためにも1送信あたりの上限数は決めておいたほうが良いでしょう。

現在の位置:サブスレッド ホーム > 技術ブログ > 小ネタ テレビの企画で見た負荷軽減の小技