最新の
5
件のみ保持して残りを削除User_A
リストの先頭に新項目追加チャット
/
メッセージングアプリの実装チャットアプリケーションの機能要件
•
複数人が発言できる•
誰かが発言した内容は、すぐに他の人が読めるチャットアプリケーションの実装検討
Web/App
サーバデータベース クライアント
1
クライアント
2
1.write
2.write
クライアント
2
はいつデータを読みにいくか?
Web/App
サーバチャットアプリケーションの実装検討
Web/App
サーバデータベース クライアント
1
クライアント
2
1.write
2.write
3.polling 4.read
Polling…
リソースの無駄、またタイムラグが大きいWeb/App
サーバElastiCache for Redis
でやってみる• Redis
のPub/Sub
機能•
チャットルームごとにチャンネル作成SUBSCRIBE chat_channel_114
PUBLISH chat_channel_114 "Hello all"
>> ["message", "chat_channel_114", "Hello all"]
UNSUBSCRIBE chat_channel_114
ElastiCache for Redis
でやってみるWeb/App
サーバElastiCache
クライアント1
クライアント
2
1.write
2.PUBLISH
•
クライアントサーバ間はWebSocket
で接続Web/App
サーバWebSocket
WebSocket
ALB (sticky session)
3.
メッセージReceive 4.
クライアントへPush
ElastiCache for Redis
でやってみるWeb/App
サーバElastiCache
クライアント1
クライアント
2
1.write
2.PUBLISH
•
クライアントサーバ間はWebSocket
で接続•
各クライアントはあらかじめRedis
のチャネルにSubscribe
Web/App
サーバWebSocket
WebSocket
ALB (sticky session) subscribe
3.
メッセージReceive 4.
クライアントへPush
過去ログをみたい?
過去ログをみたい
Web/App
サーバElastiCache
クライアント1
クライアント
2 Web/App
サーバWebSocket
WebSocket
ALB (sticky session)
データベース
DB
へWrite & Redis
でPUBLISH
Redis
でSubsribe & DB
からRead
過去ログもみたい
with Redis STEAMS
Web/App
サーバElastiCache
クライアント1
クライアント
2 Web/App
サーバWebSocket
WebSocket
ALB (sticky session)
XADD chat_channel * msg “hey!”
XREAD STREAMS chat_channel 0
XREAD BLOCK 1000 STREAMS chat_channel $
リアルタイムリーダーボードの実装
リーダーボードとは
•
トップ10
人の順位とスコアをリアルタイムに表示•
自分の順位とスコアの表示•
多人数参加のオンラインゲームでもリアルタイムに順位を表現する必要性リアルタイムリーダーボード データモデル
ユーザー
5: 500pt
ユーザー1: 400pt
ユーザー2: 300pt
ユーザー4: 200pt
ユーザー3: 100pt
リアルタイムリーダーボード データモデル
ユーザー
5: 500pt
ユーザー1: 400pt
ユーザー2: 300pt
ユーザー4: 200pt
ユーザー3: 100pt
ユーザー6: 350pt
O(log(N))
で追加/
更新参加ユーザーの追加
/
スコアの更新リアルタイムリーダーボード データモデル
ユーザー
5: 500pt
ユーザー1: 400pt
ユーザー
2: 300pt
ユーザー4: 200pt
ユーザー3: 100pt
ユーザー6: 350pt
O(log(N))
で取得 上位3
人を取得するオペレーションRedis “Sorted Set”
データタイプZADD "leaderboard" 1201 ”User_1”
ZADD "leaderboard" 963 " User_2"
ZADD "leaderboard" 1092 ”User_3 "
ZADD "leaderboard" 1383 ”User_4”
ZREVRANGE "leaderboard" 0 -1 1) ”User_2"
2) ”User_3"
3) ”User_1"
4) ”User_4”
ZREVRANK "leaderboard" ”User_3"
O(log(N))
でトップN
取得O(log(N))
で要素追加O(1)
で特定要素の順位取得デジタルマーケティング等におけるユニークユーザー数推定
広告配信のターゲッティング
•
ユーザーの興味属性(アクセス履歴)に応じてセグメント化•
ビジネスニュースへの興味•
不動産サイトへの興味•
エンタメへの興味•
スポーツへの興味•
セグメント毎のボリュームの見積•
ビジネスニュースに興味のあるユーザの人数は?広告配信のターゲッティング
•
ユーザーの興味属性(アクセス履歴)に応じてセグメント化•
ビジネスニュースへの興味•
不動産サイトへの興味•
エンタメへの興味•
スポーツへの興味•
セグメント毎のボリュームの見積•
ビジネスニュースに興味のあるユーザの人数は?SELECT count(distinct user_id) FROM user_access_history
WHERE interest IN (‘business_news’);
広告配信のターゲッティング
•
ユーザーの興味属性(アクセス履歴)に応じてセグメント化•
ビジネスニュースへの興味•
不動産サイトへの興味•
エンタメへの興味•
スポーツへの興味•
セグメント毎のボリュームの見積•
ビジネスニュースに興味のあるユーザの人数は?SELECT count(distinct user_id) FROM user_access_history WHERE interest IN (‘business_news’);
要件としては、「ざっくりの数でいいので安く」