Slide 1

Slide 1 text

WebSocketの圧縮機能と Socket.IO 2/10 Node学園#15

Slide 2

Slide 2 text

ID: nkzawa socket.io コミッター

Slide 3

Slide 3 text

最近 ws モジュールに permessage-deflate extension を実装しました

Slide 4

Slide 4 text

wsモジュール nodeのデファクトwebsocket server/client socket.ioでも使用している

Slide 5

Slide 5 text

古くからあるissueを解決 ws#34 3年前 socket.io#1148 2年前

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

permessage-deflate とは

Slide 9

Slide 9 text

メッセージデータを deflate 圧縮する WebSocketの拡張

Slide 10

Slide 10 text

HTTPでいうところのgzip圧縮

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

permessage-deflate vs http compression

Slide 14

Slide 14 text

最も重要な違い http: レスポンスにのみ適用 websocket: 双方向

Slide 15

Slide 15 text

圧縮パラメータ http: 圧縮データのheaderに含める websocket: ハンドシェイク時に交換

Slide 16

Slide 16 text

windowBits: ウィンドウ・サイズ noContextTakeOver: コンテキストを引き継ぐかどうか

Slide 17

Slide 17 text

Context Takeover 各メッセージを同一コンテキストで圧縮すること で圧縮率を改善

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

残念なお知らせ

Slide 20

Slide 20 text

現状Chromeのみサポート ( FireFoxはv37から )

Slide 21

Slide 21 text

ブラウザでは設定変更ができない JSのWebSocket APIにインターフェースがないため、 常に有効かつデフォルト値で動作する。

Slide 22

Slide 22 text

謝辞

Slide 23

Slide 23 text

この機能に関連するNodeの脆弱性を、 @jovi0608 (Shigeki Ohtsu) さん に直していただいたおかげで、 無事リリースできました!m(__)m

Slide 24

Slide 24 text

socket.io では

Slide 25

Slide 25 text

次バージョン (v1.4) でサポートされます。 (そもそもsocket.ioのために実装した)

Slide 26

Slide 26 text

● 圧縮がデフォルトで有効 ● polling時はhttp圧縮 ● メッセージ毎にon/offを切り替え可能

Slide 27

Slide 27 text

var socket = io({ perMessageDeflate: true, httpCompression: true }); socket.compress(false).emit(‘woot’);

Slide 28

Slide 28 text

まとめ

Slide 29

Slide 29 text

● 地味な機能だけど、パフォーマンス改善にイ ンパクトは大きいはず! ● Socket.IOでも近いうちにサポート!