Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RedisとGoで実装するリアルタイム通知 / Real-time notification ...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
hiroki.saito
January 18, 2019
Technology
330
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RedisとGoで実装するリアルタイム通知 / Real-time notification developed by Redis and Go
hiroki.saito
January 18, 2019
More Decks by hiroki.saito
See All by hiroki.saito
なぜフルサイクルエンジニアを目指すのか / FullCycleDeveloperNight#1
hirokisaito
0
390
新規事業と技術的課題 / ROSCAFE_TECH_NIGHT12_LT
hirokisaito
0
85
GCPとPHP PHP Conference Japan 2020
hirokisaito
1
2.4k
たった1人のAPI開発 BEAR.Sundayで解決した課題たち / PHPerKaigi2019_TrackB_1445
hirokisaito
1
3.8k
5分プログラミングSlackBotとmonolog
hirokisaito
0
190
Bear.SundayとRMパターン
hirokisaito
0
320
技術力ってなんだろう
hirokisaito
0
120
新卒3年目エンジニアの生存戦略
hirokisaito
1
360
美しいショートコーディングの世界
hirokisaito
0
270
Other Decks in Technology
See All in Technology
Claude Code on Bedrock で統制をかける小ネタ集/claude-code-bedrock-governance-tips
emiki
1
12k
dbt Semantic Layerで進めるenechainのデータ民主化
akizhou
1
260
VLA-JEPA: Enhancing Vision-Language-Action Models with Latent World Models
takmin
0
320
Filter What the LLM Reads: RAG Governance with AgentCore Gateway
yakumo
0
100
これだけは抑えておきたい!後悔しない re:Invent の過ごし方 / AWS re:Invent 2026 prestudy
kinunori
2
260
CloudWatch Logsのコスト最適化:どこまでAIに任せてどこから人間が承認すべきか
yama3133
0
180
アカウント統制の健康診断
kenichinakamura
1
190
AI時代、つくる力を自分たちの手に。 ──電通×KAG、アジャイルとAI駆動開発で挑む開発の変革
yuukiyo
3
370
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
210
BacklogのRAG 今ならこう作る - S3 Vectorsと自前パイプラインの勘所
revsystem
0
130
Let's Change Our World—Again
snoozer05
PRO
6
670
顧客価値を追いかけたら、プライシングにたどり着いた
sansantech
PRO
2
1k
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
47k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
New Earth Scene 8
popppiees
4
2.7k
Practical Orchestrator
shlominoach
192
12k
Making the Leap to Tech Lead
cromwellryan
135
10k
A better future with KSS
kneath
240
18k
Thoughts on Productivity
jonyablonski
76
5.4k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
640
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Agile that works and the tools we love
rasmusluckow
331
22k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
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つでも実用性はある 規模によりますが、このシンプルな構成は実装も楽でオススメ