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
realtime_rails
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
710
Other Decks in Programming
See All in Programming
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
160
App Intentsのビルドプロセスを支える技術
kntkymt
0
380
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
260
iOSDC2026登壇資料.pdf
riofujimon
0
160
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
460
wkhtmltopdfの次どうするか問題2026
willnet
1
100
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
620
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
210
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
120
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
140
新卒PdEのリアル
ryu1013
1
500
Featured
See All Featured
Discover your Explorer Soul
emna__ayadi
2
1.3k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
540
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
Building the Perfect Custom Keyboard
takai
2
870
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
WCS-LA-2024
lcolladotor
0
830
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
590
Are puppies a ranking factor?
jonoalderson
2
3.9k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
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 Λ͏͜ͱͷ՝Λߟ͑·ͨ͠
͓ΘΓ