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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
mgi166
September 25, 2015
Programming
55
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
710
Music as Code
mgi166
0
690
Other Decks in Programming
See All in Programming
Contextとはなにか
chiroruxx
1
300
3Dシーンの圧縮
fadis
1
750
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
Claspは野良GASの夢をみるか
takter00
0
180
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
190
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
350
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
120
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
Oxcを導入して開発体験が向上した話
yug1224
4
310
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
330
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.9k
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
360
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Deep Space Network (abreviated)
tonyrice
0
170
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
From π to Pie charts
rasagy
0
210
The Language of Interfaces
destraynor
162
27k
Building AI with AI
inesmontani
PRO
1
1.1k
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 Λ͏͜ͱͷ՝Λߟ͑·ͨ͠
͓ΘΓ