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
realtime_rails
Search
mgi166
September 25, 2015
Programming
59
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
realtime_rails
mgi166
September 25, 2015
More Decks by mgi166
See All by mgi166
Gunosy のログ収集基盤
mgi166
2
720
Music as Code
mgi166
0
700
Other Decks in Programming
See All in Programming
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
130
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
210
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.7k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
270
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
320
源内ハンズオン概要編
hideg
0
190
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.1k
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
1k
Building a Meta Ray-Ban display app
akkeylab
0
170
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.8k
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
330
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
130
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Paper Plane
katiecoart
PRO
2
53k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
170
HDC tutorial
michielstock
2
790
New Earth Scene 8
popppiees
3
2.5k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Between Models and Reality
mayunak
4
390
How GitHub (no longer) Works
holman
316
150k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
470
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Transcript
Realtime Rails mgi
࠷ۙͷ Web ք۾
React.js
scala
Elixir
golang
ΈΜͳ Rails Ͳ͏ͨ͠ : චऀ rails ͔͠ೝΊͳ͍ ͱݴ͍ͬͯΔͷͰ͋Γ·ͤΜ
ײ(ٴͼউखͳਪଌ) • ݴޠʹΑΓಘҙෆಘҙ͋ΔʹͤΑɺόοΫΤ ϯυͷબࢶ͕૿͍͑ͯΔ • rails Ͱ͔͠ग़དྷͳ͍͜ͱ͕ݮ͖ͬͯͨ(ͱ͍͏ ͔ࠓ࣌ͦΜͳͷ͋Δʁ)
Ͱ͑ͯ rails Λ औΓ্͛ͯΈͨ
ཧ༝ • ҰԠࣄʹ݁͢Δ • rails Λ͕͔ΓʹɺଞʹͰ͖Δ͜ͱΛ୳͢ͱɺ एׯֶशίετ͕͑ΒΕΔ • ظͷ •
खΛग़͠·͘Δͱ͍࣌ؒ͘Β͋ͬͯΓͳ ͍
ͱ͍͏Θ͚Ͱ…
ຊ
Realtime Rails • WebSocket ͷ֓ཁ • ͲΜͳࣄ͕Ͱ͖Δͷ͔ • WebSocket +
Rails ͷαϯϓϧίʔυ • actioncable (websocket-rails গ͠) • ՝ʹͳΓͦ͏ͳ
WebSocket
WebSocket ͱ • αʔόʔͱϒϥβؒͰϦΞϧλΠϜͰใ ΛΓͱΓ͢Δن֨ͷ͜ͱ • chat, online game, push
௨ • ࠷ۙͷϒϥβطʹ࣮ࡁΈ • αʔόʔଆͷ༻ҙΛ͢Εɺ࣮ݱՄೳ
Ξ̋ʔό̋ά
Aͷϒϥβ Bͷϒϥβ ͬͪ͜Ͱ Ұॹʹಈ͍ͯཉ͍͠ ͬͪ͜ͰΩϟϥΛ ಈ͔ͨ͠Β
WebSocket ͱ • server ʹ request ͯ͠ response Λฦ͢ɺͱ͍͏ http
ͷن֨Ͱ࣮ݱͰ͖ͳ͍ • αʔόʔͱϒϥβؒͰৗʹใΛΓͱΓ͠ଓ ͚Δ • ϒϥβͰೖྗͨ͠࠲ඪΛαʔόʔଆʹ • αʔόʔଆʹͬͨ࠲ඪΛϒϥβʹ
WebSocket ք۾ͷྺ࢙ • node.js ͕͍͢͝Β͍͠ (2013 ࠒ) • node.js ʹΑΔ
c10k ͷղফ • socket.io • http://socket.io/demos/weplay/ • ϒϥβ͕ websocket ରԠ࢝͠ΊΔɻnginx • ←ࠓίίʂ
ͿͬͪΌ͚ gem ͕͋Δ • websocket-rails • https://github.com/websocket-rails/ websocket-rails • Standalone
Server Mode • websocket ༻ͷαʔόʔΛཱͯͯ͘Ε Δ
ͿͬͪΌ͚ rails ରԠ͢Δ • rails5 ͷ ActionCable • rails +
WebSocket Λͬͯ͘ΕΔ • https://github.com/rails/actioncable • websocket-rails ͱͷҧ͍αʔόʔ • websocket-rails: thin, actioncable: ͳΜͰ
Sample (ແه໊νϟοτΞϓϦ)
WebSocket ͷΈ
͓͞Β͍ • websocket-rails Ͱطଘͷ rails ϓϩδΣΫτ ʹָʹಋೖՄೳ • rails5 ͔Β
websocket σϑΥϧτͰ͑Δ
XFCTPDLFU TFSWFS 4. Push change to users 1. Create new
message 2. Publish changes to Redis 3. Publish change to subscribers
var dispatcher = new WebSocketRails('localhost:3001/websocket'); var CommentForm = React.createClass({ onSubmit:
function(e) { e.preventDefault(); dispatcher.trigger('new_message', { text: text }); this.props.createMessage({ text: text }); }, render: function() { return ( <form className="comment-form" onSubmit={this.onSubmit}> <textarea placeholder="write something..." ref="text"/> <input type="submit" value="submit" /> </form> ); } }); WebSocket ʹΠϕϯτΛ௨ WebSocket Ͱαʔόʔଆ ʹ௨͢Δ Rails ͷ api Λ ajax Ͱୟ͘
# config/events.rb WebsocketRails::EventMap.describe do subscribe :new_message, to: BroadcastController, with_method: :new_message
end # app/controllers/broadcast_controller.rb class BroadcastController < WebsocketRails::BaseController def new_message WebsocketRails[:chat_channel].trigger(:new_message, message) end end WebSocket ͷ controller Event ໊ͱ controller Λهड़ (routing) :chat_channel ͱ͍͏νϟωϧʹରͯ͠ broadcast ͢Δ
var dispatcher = new WebSocketRails('localhost:3001/websocket'); var channel = dispatcher.subscribe(‘chat_channel’); var
Contents = React.createClass({ componentDidMount: function() { channel.bind('new_message', function(message){ var messages = this.state.messages; messages.unshift(message); this.setState({ messages: messages }) }.bind(this)); }, render: function() { return ( <div class=“content"> … </div> ); } ௨͕͖ͨΒɺDOM ʹө :chat_channel ͱ͍͏ νϟωϧΛ js ଆͰߪಡ νϟωϧʹ௨͕དྷͨΒ callback ͕ݺΕͯ state Λߋ৽
՝ʹͳΓͦ͏ͳͱ͜Ζ
• rails (≒ ruby ) Ͱ͍͍ͷ͔ • εέʔϥϏϦςΟ
rails (≒ ruby)Ͱ͍͍ͷ͔ • Γ͍ͨ͜ͱ(Ϗδωε)ʹΑΔ • ࠓͷձࣾ WebSocket ͷधཁߴ͘ͳ͍ •
ձࣾͷϦιʔεʹΑΔ • rails ΤϯδχΞଟ͍
rails (websocket-rails actioncable) ͷϙΠϯτ • EventMachine Λ৴༻͢Δ͔Ͳ͏͔ • Thin
EventMachine Ͱ࣮͞ΕͯΔ • puma EventMachine ʹͪΐͬͱґଘͯ͠Δ • ࠇ͍͔ᷚΓࣖʹͯ͠طʹک͑ͯΔ • actioncable ͳΒαʔόʔͷىಈΛࣗ༝ʹఆٛͰ͖Δɺ ॊೈੑ͕ߴ͍ҹΛड͚ͨ
node.js ͷϙΠϯτ • ϒϥβ͕ websocket ʹରԠ͍ͯ͠Δ͔ͷ ఆ(socket.io ͩͱͬͯ͘ΕΔΒ͍͠) • Ϛϧνϓϩηε
cluster ͑Մೳ
εέʔϥϏϦςΟ • EventMachine ͰͲ͜·Ͱεέʔϧ͢Δ͔ • 1000 ίωΫγϣϯ͔Βਏ͘ͳΔͱ͍͏ᷚ • puma Θ͔ΒΜ
• rails ͔ΒΓସ͑Δͱεέʔϧ͠·ͨ͠ɺͱ͍͏Α͘ฉ͘ • http://www.infoq.com/jp/news/2012/10/Ruby-on-Rails-Node-js-LinkedIn • http://www.infoq.com/jp/news/2014/01/paypal-java-javascript • http://www.infoq.com/jp/news/2015/07/parse-moved-ruby-go
WebSocket server ૿͑ͯΔ • node.js(javascript) • websocket(go) • https://godoc.org/golang.org/x/net/websocket •
phonix(Elixir) • http://www.phoenixframework.org/v0.17.0/ docs/channels
ఆ݁ • ͋ΔఔͷଓΛࡹ͘ϦΞϧλΠϜ web ͕ඞཁͳ Βɺrails Ҏ֎Λݕ౼ͨ͠΄͏͕͍͍͔ • WebSocket server
૿͖͍͑ͯͯΔͷͰɺબࢶ๛ ɻͲ͏Δ͔ॊೈʹબ͢Δ • rails Ҏ֎ͩͱ phoenix ג • actioncable ͳΒ͖ͬͱεέʔϧͯ͘͠ΕΔ…!
૯ׅ
ࠓճͷൃදͷ·ͱΊ • WebSocket ʹ͍ͭͯઆ໌͠·ͨ͠ • Rails + WebSocket ͷαϯϓϧΛ࡞ͬͯղઆ͠ ·ͨ͠
• rails Λ͏͜ͱͷ՝Λߟ͑·ͨ͠
͓ΘΓ