ライブオークション、スコア、大人数の視聴者
現在の入札額やスコアを何千人もの視聴者に一斉に届け、新しく来た人にもすぐ最新の状態を見せ、本物の「視聴中」人数を表示します。
ライブオークション、スポーツのスコア、クイズ番組、タイムセール、ライブ配信のコメントには共通点があります。何千人もが同じ瞬間に同じものを見ていて、1 秒の遅れが結果を変えることです。遅れて届く入札や中継より遅いスコアは、人を他のサービスへ向かわせます。
ユーザーにとっての価値
- 現在の入札額、スコア、在庫が変わった瞬間にわかります。
- 「12,408 人が視聴中」という、本物で、動く数字。
- イベントの途中でも、ページを開いた瞬間に最新の状態。
使う機能
- キャッシュチャンネル(
cache-)。新しく来た人全員に、データベースに触れずに現在の価格やスコアをすぐ渡します。 - ラージプレゼンスチャンネル(
presence-large-)。最大 100,000 人、ライブの人数と参加者のサンプルつき。 - 購読者数(
pusher:subscription_count)。パブリックチャンネルでシンプルな視聴者数を表示します。 - 無料のファンアウト:20,000 人の視聴者への 1 件の入札は、20,000 ではなく 1 メッセージです。
ステップ 1:変化ごとに 1 回だけ配信する
サーバーが入札を検証したりスコアを記録したりしてから、新しい状態を全員に配信します:
app.post('/auctions/:id/bids', requireLogin, async (req, res) => {
const bid = await db.auctions.placeBid(req.params.id, req.user.id, req.body.amount); // rejects lower bids
await pusher.trigger(`cache-auction-${req.params.id}`, 'bid', {
amount: bid.amount,
bidder: bid.displayName,
endsAt: bid.endsAt,
});
res.json(bid);
});差分ではなく、常に状態全体(現在の金額と終了時刻)を送りましょう。イベントを 1 つ見逃した視聴者も、次のイベントで正しい状態に戻ります。
ステップ 2:視聴者に表示する
const auction = pusher.subscribe(`cache-auction-${id}`);
auction.bind('bid', ({ amount, bidder, endsAt }) => {
price.set(amount);
feed.prepend(`${bidder} bid ${amount}`);
countdown.until(endsAt);
});購読直後にキャッシュされた最後の入札が届くので、価格が空になることはありません。
ステップ 3:視聴者数
人数だけなら、アプリの設定で 購読者数を送信 をオンにし、同じパブリックチャンネルで人数のイベントを受け取ります:
auction.bind('pusher:subscription_count', ({ subscription_count }) => watching.set(subscription_count));コードを書かなくても、1 行の埋め込みスクリプトで同じことができます:<span data-hibira-online="cache-auction-42">0</span> watching。
誰がいるかも表示するには、ラージプレゼンスチャンネルと @hibira-io/large-presence を使います:
import { LargePresence } from '@hibira-io/large-presence';
const room = LargePresence.subscribe(pusher, `presence-large-auction-${id}`, { maxMembers: 50 });
room.on('ready', ({ count }) => audience.render(count, room.members));
room.on('change', ({ count }) => audience.render(count, room.members));人数は常に正確なまま、メンバーの参加と退出は 1 人ごとのイベントではなく、1 秒に 1 回の小さな更新にまとめて届きます。
ヒント
- 入札、回答、購入はすべてサーバーで検証しましょう。イベントの状態をクライアント自身に配信させてはいけません。
- 計画すべきはメッセージではなく接続数です。20,000 人の視聴者は同時接続 20,000 で、料金はピークで決まります。料金を参照してください。
- チケットの発売開始のような瞬間は、1 件売れるごとではなく、1〜2 秒ごとに在庫数を配信しましょう。
- 本番の前に実際の視聴者数で試しましょう。負荷テストツールで大量の接続を開き、ポータルのアプリページで様子を見ます。