Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
RedisとGoで実装するリアルタイム通知 / Real-time notification developed by Redis and Go
hiroki.saito
January 18, 2019
Technology
0
180
RedisとGoで実装するリアルタイム通知 / Real-time notification developed by Redis and Go
hiroki.saito
January 18, 2019
Tweet
Share
More Decks by hiroki.saito
See All by hiroki.saito
GCPとPHP PHP Conference Japan 2020
gamu1012
1
1.8k
たった1人のAPI開発 BEAR.Sundayで解決した課題たち / PHPerKaigi2019_TrackB_1445
gamu1012
1
2.8k
5分プログラミングSlackBotとmonolog
gamu1012
0
110
Bear.SundayとRMパターン
gamu1012
0
220
技術力ってなんだろう
gamu1012
0
40
新卒3年目エンジニアの生存戦略
gamu1012
1
300
美しいショートコーディングの世界
gamu1012
0
170
Other Decks in Technology
See All in Technology
KyvernoとRed Hat ACMを用いたマルチクラスターの一元的なポリシー制御
ry
0
250
日経電子版だけじゃない! 日経の新規Webメディアの開発 - NIKKEI Tech Talk #3
sztm
0
350
OVN-Kubernetes-Introduction-ja-2023-01-27.pdf
orimanabu
1
460
オンプレk8sとEKSの並行運用の実際
ch1aki
0
320
Stripe / Okta Customer Identity Cloud(旧Auth0) の採用に至った理由 〜モリサワの SaaS 戦略〜
tomuro
0
140
YouTuber も編集マンもクラウド使って編集しよう。クラウド編集のキホン
eijikominami
0
120
Oracle Cloud Infrastructure:2023年1月度サービス・アップデート
oracle4engineer
PRO
0
190
AI Services 概要 / AI Services overview
oracle4engineer
PRO
0
180
はじめてスポンサー運営PMをやってみてわかった4つのこと
andpad
3
230
FlexScan HD2452Wの 後継を探して
tring
0
6.6k
re:Inventの完全招待制イベント Building a Roadmap to SaaSについて / Building a Roadmap to SaaS an invitation only event at reinvent
yayoi_dd
0
160
OCI DevOps 概要 / OCI DevOps overview
oracle4engineer
PRO
0
510
Featured
See All Featured
Robots, Beer and Maslow
schacon
154
7.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
182
15k
Building an army of robots
kneath
301
40k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
500
130k
In The Pink: A Labor of Love
frogandcode
132
21k
Pencils Down: Stop Designing & Start Developing
hursman
114
10k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
22
1.7k
From Idea to $5000 a Month in 5 Months
shpigford
374
44k
Fantastic passwords and where to find them - at NoRuKo
philnash
32
1.9k
Rebuilding a faster, lazier Slack
samanthasiow
69
7.6k
Debugging Ruby Performance
tmm1
67
11k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
217
21k
Transcript
RedisとGoで実装する リアルタイムPUSH
None
用語解説 Radiotalk 収録型の音声配信/聴アプリ 番組 ユーザーごとのラジオ番組 トーク 配信された音声 クリップ お気に入り メッセージ
Redisのメッセージ Notification FCMのメッセージ
なにをつくったのか クリップしている番組に投稿があったら通知するシステム トーカー リスナー リスナー トークを投稿 Notification
なにを解決したかったのか ニアリアルタイム - 投稿後すぐに通知したい - 投稿後に対象ユーザーにできる限り同時に届けたい 仕組みで事故を防止する - ☓ 気をつけて実行する
◦ 仕組みで事故防止 - 基本はDryRun - 重複送信/実行を防止する
システム概要 API Redis ワーカー Go CHAN NEL 投稿
なぜRedisなのか 今回はストリーム処理が不要 シンプルで高速なメッセージングキュー 社内での実績がある PHPとGoに優秀なライブラリがある
超簡単!RedisのPublishとSubscribe Subscribe SUBSCRIBE {チャンネル名} subscription := client.Subscribe("TALK_POSTED_CHANNEL") Publish PUBLISH {チャンネル名}
{メッセージ} $this->redis->publish($channel, $message);
なぜGoなのか 並列実行を簡単にできる FirebaseAdminSDKがある(もちろんCloudMessagingSDKも)
Goによるワーカー 1. メッセージの受信 2. メッセージのパース 3. メッセージからNotificationに必要な情報をDBから取得 4. Notification内容を作成 5.
FCMでNotification送信
Goでの構成 Reciver Invoker Sender Repository
送信の並列処理 go func(to string, title string, body string, data map[string]string)
{ workersChanel <- struct{}{} // この呼び出し先が実際にNotificationを送信する invoker.Sender.Send(to, title, body, data) <-workersChanel wg.Done() }(device.Token, title, body, data)
重複実行/送信を防ぐ工夫 ワーカーはメッセージを受け取ったら問答無用で送信する ただし本番環境以外はDryRun ワーカーを1つであること => Subscribeが1であること Subscribeが1 => 重複実行ではない保証
実行パフォーマンス 並列(秒) 直列(秒) 100通 2.39 23.51 1000通 23.16 231.40 10000通
233.37 2308.81 並列実行の最大数は 10に設定
今後の展望
まとめ RedisとGoで実現するリアルタイム通知 数千の規模であればワーカー1つでも実用性はある 規模によりますが、このシンプルな構成は実装も楽でオススメ