Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RedisとGoで実装するリアルタイム通知 / Real-time notification ...
Search
hiroki.saito
January 18, 2019
Technology
310
0
Share
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
110
新規事業と技術的課題 / ROSCAFE_TECH_NIGHT12_LT
hirokisaito
0
69
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
170
Bear.SundayとRMパターン
hirokisaito
0
280
技術力ってなんだろう
hirokisaito
0
110
新卒3年目エンジニアの生存戦略
hirokisaito
1
350
美しいショートコーディングの世界
hirokisaito
0
260
Other Decks in Technology
See All in Technology
Hooks, Filters & Now Context: Why MCPs Are the “Hooks” of the AI Era
miriamschwab
0
130
プロダクトを触って語って理解する、チーム横断バグバッシュのすすめ / 20260411 Naoki Takahashi
shift_evolve
PRO
1
270
インフラを Excel 管理していた組織が 3 ヶ月で IaC 化されるまで
geekplus_tech
3
180
解剖"React Native"
hacusk
0
120
2026年春から始めるOpenTelemetry | sogaoh's LT @ PHP Conference ODAWARA 2026
sogaoh
PRO
0
110
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.1k
Zero-Downtime Migration: Moving a Massive, Historic iOS App from CocoaPods to SPM and Tuist without Stopping Feature Delivery
kagemiku
0
230
生成AI時代のエンジニア育成 変わる時代と変わらないコト
starfish719
0
580
シン・リスコフの置換原則 〜現代風に考えるSOLIDの原則〜
jinwatanabe
0
180
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
23k
ルールルルルル私的函館観光ガイド── 函館の街はイクラでも楽しめる!
nomuson
0
120
建設的な現実逃避のしかた / How to practice constructive escapism
pauli
4
310
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
96
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
97
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
330
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
130
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
100
Side Projects
sachag
455
43k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
300
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
RailsConf 2023
tenderlove
30
1.4k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
160
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つでも実用性はある 規模によりますが、このシンプルな構成は実装も楽でオススメ