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
Hotwireで簡単に非同期処理のユーザー通知を作る / broadcast using Turbo
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Daichi KUDO
August 07, 2025
200
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hotwireで簡単に非同期処理のユーザー通知を作る / broadcast using Turbo
https://roppongirb.connpass.com/event/363297/
Omotesando.rb#112 での発表資料
Daichi KUDO
August 07, 2025
More Decks by Daichi KUDO
See All by Daichi KUDO
pnpmでできるサプライチェーン攻撃への備え / Pnpm Security Practices
da1chi
2
760
ゲームから学ぶUX設計 / UX Design Inspired from Games
da1chi
0
410
エンジニアが始める UXリサーチ 入門 / Introduction of UX Research
da1chi
0
560
登壇は dynamic! な営みである / speech is dynamic
da1chi
0
810
Web Components で実現する Hotwire とフロントエンドフレームワークの橋渡し / Bridging with Web Components
da1chi
3
6.8k
テストライブラリによってコンポーネントテストの実行時間はどう変わるか / component-test-performance-by-library
da1chi
0
120
Blue/Greenデプロイの導入による 運用フローの改善
da1chi
1
1.2k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.4k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
770
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
The Limits of Empathy - UXLibs8
cassininazir
1
530
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
370
sira's awesome portfolio website redesign presentation
elsirapls
0
310
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
500
Writing Fast Ruby
sferik
630
63k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
57k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Transcript
Hotwireで実装する非同期処理のユーザー通知 Roppongi.rb#33 Omotesando.rb#112 2025-08-07 @平和不動産
Hotwire(Turbo Stream)を使うことで 簡単に非同期処理のユーザー通知を実現できた ので紹介します
daichi (DAICHI Kudo) 普段は Startup Angular 運営 @da1chi24 所属
• 1000名単位のユーザーに提出物を配信する機能 • 完了まで数分かかるので非同期処理で実行される • 配信処理の進捗をユーザーに通知する 実際に利用したユースケース
• Turbo Streams のビューヘルパー #turbo_stream_from を 利用 • 内部的には Action
Cable で WebSocket を利用し、サーバー からクライアントに通知している • 仕組みや他の機能は話さないので、詳しく知りたい方はこちらの記 事がおすすめです Turbo Streams(WebSocket)|猫でもわ かるHotwire入門 Turbo編 どう実現したのか
• インフラ ◦ Pub/Sub 用の Redis • クライアント ◦ 利用する画面に
turbo_stream_from ヘルパーを設定 • サーバー ◦ Turbo::StreamsChannel で送信(ブロードキャスト) 必要な設定
Action Cable で Redis を設定する config/cable.yml
クライアント(view)でチャンネルを設定する • ストリーム名を指定する • サーバーで同じストリーム名のクライアントに送信する • このヘルパーが読み込まれると WebSocket の接続 の確立とストリームの購読を行う
サーバーからクライアントに送信する • クライアントと同じストリーム名にする
デモ (動画) ref. https://github.com/kudoas/enjoy-hotwire-broadcast
WebSocket を無闇に接続し続けると、問題が発生する可 能性がある • CPUやメモリなどのマシンリソースを使いすぎる • サーバーやロードバランサの同時接続数の上限に抵触す る ユースケースを満たすだけならこれで良いが...
1. 必要なタイミングからWebSocketの接続を確立する 2. 処理終了後に接続を切断する 実際に運用する上で必要なこと
• Turbo Streams のヘルパーは画面単位で接続する • 今回は画面単位ではなく、機能単位の接続を確立したい • Rails のセッションを利用し、ヘルパーの表示・非表示を 出し分けることで操作する
1. 必要なタイミングで接続を確立する
サーバーで session を設定する クライアントで表示・非表示を切り替える
• 一度WebSocketの接続が確立されるとページ遷移し ても、切断されない • Turbo によるページ遷移の際に JavaScript の インスタンスを保持し続ける 2.
利用し終えたら接続を切断する
明示的にWebSocketの接続を切断する クライアントで切断する実装例 ref. Action Cable の概要 \- Railsガイド
• Hotwireを利用することで、サーバーからユーザに通知 を送る実装が簡単にできます • 内部的には Websocket を利用しているので、接続の 確立と切断を最小限に抑えて、リソースを節約する実装 をしましょう まとめ