Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Crafting Rails 4 Application 読み会(第5章)

Crafting Rails 4 Application 読み会(第5章)

有志で開催した Crafting Rails 4 Application 読書会の発表資料です。この読書会は参加者全員が事前に全部読んでくるという形式だったので、未読者はいないという前提で気になったポイントを中心にまとめてあります。

Masatoshi Iwasaki

March 19, 2014
Tweet

More Decks by Masatoshi Iwasaki

Other Decks in Technology

Transcript

  1. 概要 •  Railsで非同期にサーバーからクライアントに レスポンスを送り続ける方法を解説   •  WebSocketではなく Server  Sent  Events(SSE)を

    使う方法を解説。   •  これまでのplugin開発に継ぎ足してSSEを実装   – ここまでの章を読んで理解してないと多少つらい
  2. (補足)   読んでいてちょっと混乱したところ •  Pollingの話が二カ所出てくる   – ブラウザからサーバーへのpolling   – サーバー上でのファイル変更検知  

    •  CSSについては何が変更されたかを通知する だけ   – CSSのURLは変わらないので、ブラウザ側で変更 通知を受け取ったら再度同じURLからjsで再読み 込みする。   – CSS自体は送らないので、後で出てくるSSEではイ ベント名だけが重要でdataは空のまま。  
  3. HTML5の登場 •  Server  Sent  Events(SSE)とWebsockets   •  違いは何か?   – Websocketsはブラウザとサーバーの相互通信を

    サポート   – SSEはサーバーからクライアントへの一方通行   •  Websocketsはブラウザの互換性が影響する が、SSEはそこを気にせず使うことができる。   •  本章ではSSEを採用してLive  Streamingを実現。
  4. (補足)  SSE深掘り •  厳密にはテキスト形式で  text/event-­‐stream  とし て送信される。   •  最後に\nが2つ並んでいれば良いので、1メッ

    セージの行数はいくつでもいい。   •  dataフィールドは必須。   •  他にも予約済みフィールド名がある模様。   –  Retry:  接続が切れた後に再接続するまでのタイムア ウト時間(ms)   –  Event:  イベント名。JSのaddEventListnerでここに指定 したイベント名をそのまま利用できる。   参照先 h\p://www.html5rocks.com/en/tutorials/eventsource/basics/
  5. マルチスレッドの設定 •  だが、これだけでは期待した通りに動かない   •  allow_concurrency  =  trueにしないとRailsは単 一スレッドでしか動作しない  

    – よって、allow_concurrencyを有効にする。   •  発表者注:マルチスレッドの話は本章であま り深く触れられていない。  
  6. 変更検知をOSに任せる •  ほとんどのOSはファイルの変更を通知してく れるAPIを持っている。   •  Listen  gemを使うことでこれらAPIを簡単に利 用可能。  

    – ただし、各環境毎に別のgemが必要(後述)   – 今回はassets/stylesheetsを監視したいので、この ディレクトリを渡せば済む。
  7. Code-­‐Loading  Techiniques •  requireでファイルを読み込む場合、起動前に すべてを読み込むことになる。   •  Autoload  を使うことで最初に必要になったと きに自動的に読み込むようにできる。

      •  AutoloadにはRubyのものとRailsのものがある。   – Rubyのautoloadはatomicではない。そのため、あ るスレッドでload中のときに他のスレッドがload対 象となるクラスを参照していると参照が失敗する。   – いくつかのRuby実装がこの問題を解決中。
  8. Threded  vs  Non-­‐threaded •  銀の弾丸はない。   –  先ほどのPumaとUnicornの比較の通り。    • 

    何が一番適しているかは複数のウェブサーバー でベンチマークを取ってみるしかない。   •  Jrubyなども検討要素。   –  ただし、Jrubyでは配列操作がthread-­‐safedではない ので対処が必要。