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
hiroki.saito
January 18, 2019
Technology
320
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
300
新規事業と技術的課題 / ROSCAFE_TECH_NIGHT12_LT
hirokisaito
0
82
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
310
技術力ってなんだろう
hirokisaito
0
120
新卒3年目エンジニアの生存戦略
hirokisaito
1
360
美しいショートコーディングの世界
hirokisaito
0
270
Other Decks in Technology
See All in Technology
enechainの内製セルフサービスプラットフォーム
hiyosi
0
150
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
300
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
120
10分で知る最近のOmarchy
komagata
0
240
module Synths; end
asonas
1
130
Deploying a Full-Stack Bun-Native Framework on Cloudflare Workers
7nohe
0
130
アリアドネの糸と、20年ごとの建て替え ── 長尾真『電子図書館』を、伊勢で読み直す / Rereading Makoto Nagao’s "Electronic Library" in Ise
ykiyota
0
150
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
4
1.1k
Screen Lens - 今見てる画面を翻訳する
komagata
0
230
AIで実装は速くなった。なのにプロダクトは速くならない。職能の壁を越えて価値のフローを設計する
nwiizo
8
7.8k
Podは生きているのにGoだけが落ちる:GOGCとGOMEMLIMITで追うInvisible OOM Killの謎
tkc66buzz
1
500
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
2.6k
Featured
See All Featured
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
470
Heart Work Chapter 1 - Part 1
lfama
PRO
9
36k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Navigating Team Friction
lara
192
16k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
380
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
A Soul's Torment
seathinner
7
3.6k
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つでも実用性はある 規模によりますが、このシンプルな構成は実装も楽でオススメ