• 検索結果がありません。

最新の

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’);

要件としては、「ざっくりの数でいいので安く」

関連したドキュメント