SlideShare a Scribd company logo
Copyright © DeNA Co.,Ltd. All Rights Reserved.
chunked encoding
を使った高速化の考察
東京Node学園26時限目 2017/6/28
渋川よしき
Copyright © DeNA Co.,Ltd. All Rights Reserved.
新刊でました!
■ 初版を買うなら今がチャンス!今すぐ本屋へ
■ ブラウザなどの通信まわり(JSとかCSSを
除く)のいろいろなトピックを思いつく限り
集めました
■ ブラウザ(利用者)視点で説明するようにして
います。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
■ ウェブ系の話題で、
「だよねーわかるわかる…」
と分かったふりをしたことがある人に
オススメ!
■ アニメについて詳しくなりたい人は
弊社のハッカドールをご利用ください
Copyright © DeNA Co.,Ltd. All Rights Reserved.
今日の発表はReal World HTTP
を読んでいる前提で進めます
Copyright © DeNA Co.,Ltd. All Rights Reserved.
その前に
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithrilの最新動向も気になりますよね!
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril 1.xのバージョンアップについて
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril 0.2.x
■ 少ないAPI
■ 小さなダウンロードサイズ
■ 仮想DOMを使った高速な描画
■ イベントハンドラと通信のコールバックを活用した描画タイミング制御
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril 0.2.x : 21関数、2プロパティ
■ コア
⁃ m()
⁃ m.component()
⁃ m.prop()
⁃ m.withAttr()
■ ラウティング
⁃ m.mount()
⁃ m.route(elem, defualt, routes)
⁃ m.route(path, params, replaceHistory)
⁃ m.route()
⁃ m.route(element)
⁃ m.route.mode
⁃ m.route.param
⁃ m.route.buildQueryString()
⁃ m.route.parseQueryString()
■ データ
⁃ m.request()
⁃ m.deferred()
⁃ m.sync()
■ HTML
⁃ m.trust()
■ レンダリング
⁃ m.render()
⁃ m.redraw()
⁃ m.redraw.strategy()
⁃ m.startComputation()
⁃ m.endComputation()
■ テスト
⁃ m.deps()
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril 1.x : 14関数、2プロパティ
■ コア
⁃ m()
⁃ m.component()
⁃ m.prop()
⁃ m.withAttr()
■ ラウティング
⁃ m.mount()
⁃ m.route(elem, defualt, routes)
⁃ m.route(path, params, replaceHistory)→m.route.set()
⁃ m.route()→m.route.get()
⁃ m.route(element)→m.route.link()
⁃ m.route.mode→m.route.prefix
⁃ m.route.param
⁃ m.route.buildQueryString()→m.buildQueryString()
⁃ m.route.parseQueryString()→m.parseQueryString()
■ データ
⁃ m.request()
⁃ m.deferred()
⁃ m.sync()
■ HTML
⁃ m.trust()
■ レンダリング
⁃ m.render()
⁃ m.redraw()
⁃ m.redraw.strategy()
⁃ m.startComputation()
⁃ m.endComputation()
■ テスト
⁃ m.deps()
■ 追加
⁃ m.fragment()
⁃ m.version
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril 1.xはマジキチ
■ 機能が減った
⁃ 関数の数が21→14
⁃ ファイルサイズも減った
⁃ deferredがES6標準のPromiseに移行
⁃ 描画タイミングコントロールなんて必要なかった
⁃ プロパティは外部に切り出されてちょっとリッチなストリームになった
■ 高速化したらしい
■ 設計のガイドラインからビューモデルが消えた
⁃ ドキュメントからビューモデルの文字が消えさった
■ ライフサイクルメソッドが整理された
■ なお、マイグレーションスクリプトで変換はほぼ自動でいける
⁃ http://mithril-ja.js.org/change-log.html#migrating-from-v02x
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Mithril 1.xを活かす設計
■ 仮想DOMのパフォーマンス・チューニングがしやすく
⁃ 仮想DOMの内部設計がドキュメント化された。コードも読みやすい。
■ コンポーネントは表示に特化
⁃ ラウターリゾルバーを使ってデータ取得をコンポーネントの外に移動で
きるように
■ データ取得部分はモデルに
⁃ ビューモデルの役割もモデルにマージ
⁃ ただ、通信の最適化とかこのあたりは今後革新がありそう
(Mithrilにかぎらず、React、Vue、Riot、Angularとかでも)
■ 終了アニメーション
⁃ ライフサイクルメソッドがPromiseを返せる。終了を遅延できる。
⁃ 0.2.xでは力技で実現するのは大変だった。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ドキュメント(http://mithril-ja.js.org/)は翻訳済み
Copyright © DeNA Co.,Ltd. All Rights Reserved.
本もあるよ!
■ オライリーの電子書籍です
■ 0.2.x準拠
■ 前ページの項目の差分に気をつけながら
お読みいただければ
⁃ ビューモデルもモデルの一部に
⁃ 描画タイミングの制御はなくなった
⁃ モデル取得の司令はラウターリゾルバーに
持っていく方がたぶん良い
■ 精神的な部分は互換性があります!
■ そろそろ改訂したい気持ちがあります
Copyright © DeNA Co.,Ltd. All Rights Reserved.
chunked encoding
を使った高速化の考察
東京Node学園26時限目 2017/6/28
渋川よしき
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Transfer-Encoding: chunked
■ Real World HTTP P119を開いてください
■ Transfer-Encoding: chunked
■ HTTP/1.1で追加された機能
■ ボディを細切れにして転送する
⁃ 最初にContent-Lengthで全体の長さを送らない
⁃ チャンクサイズ(16進数)と、その長さのボディという組を何回かに分
けて送る
⁃ 最後に長さゼロを送ると終了
⁃ ボディサイズを最初に決めなくてもいい
Copyright © DeNA Co.,Ltd. All Rights Reserved.
質問: Transfer-Encoding: chunked
を普段から意識していますか?
Copyright © DeNA Co.,Ltd. All Rights Reserved.
有効回答数: 19
Copyright © DeNA Co.,Ltd. All Rights Reserved.
有効回答数: 19
半数以上の人があまり意識してい
ない
Copyright © DeNA Co.,Ltd. All Rights Reserved.
普段は意識しなくてもいい
■ どのプログラミング言語のHTTPクライアントAPIも、勝手に結合してくれる
■ bodyをストリームのようなAPIで読み込むと、場合によってはチャンクごとに
返ってくるかも?
■ 大抵HTTPクライアントを書く時は、JSONとかの細切れにパースできないデー
タが欲しいだろうから、末尾までまるっと読み込みますよね?
Copyright © DeNA Co.,Ltd. All Rights Reserved.
SSRは本当に早いのか?
■ SSRを使うと初回ロードが高速になるっていうけど
⁃ 本当に高速なの?
⁃ Node.jsのイベントループに負荷をかけるしスケールするか疑わしい(キ
ャッシュしないと)
■ 最近のウェブのデータ量は大きい
⁃ JSも数100KB
⁃ CSSもでかい
⁃ 画像も多い。全部で数MBはある。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
HTTP
リクエスト
リクエスト
受信
DB
アクセス
HTML
レンダ
リング
HTML
パース
初回表示されるまでの流れ
ファイル
転送
アセット
リクエスト
表示
Copyright © DeNA Co.,Ltd. All Rights Reserved.
HTTP
リクエスト
リクエスト
受信
DB
アクセス
HTML
レンダ
リング
HTML
パース
初回表示されるまでの流れ
ファイル
転送
アセット
リクエスト
表示
表示するにもいろいろ情報を集め
る必要がある
HTMLパースをするまで
必要なJS/CSS/画像がわからない
リクエスト開始が遅い
実際にはここが一番支配
的になるはず
CSS→画像も読み込まな
いと必要なファイルが分
からない
Copyright © DeNA Co.,Ltd. All Rights Reserved.
chunked encodingを使うアイディア
■ HTMLを読み込まないと必要なリソースがわからない・・・
⁃ <script>タグと<link>タグ部分だけ先に読み込ませてしまえばいいのでは?
■ 期待する結果
HTTP
リクエスト
リクエスト
受信
DB
アクセス
HTML
レンダ
リング
HTML
パース
ファイル
転送
アセット
リクエスト
表示
HTML
パース
高速化
Copyright © DeNA Co.,Ltd. All Rights Reserved.
■ 実験してみた:その1
⁃ すみません。Goで書きました。
⁃ HTTP/2を使っています。
⁃ HTMLはまずヘッダーを返し、末尾のコンテンツは4秒後に返した
⁃ リソースはJS、async付きJS、defer付きJS、CSSの4種類を読み込み。サーバ
ー側で、2秒に返信と6秒後に返信の2パターン8通り返してみた
⁃ コードはこちら
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
即座にヘッダー部だけ返し、
残りは4秒後に返している
Copyright © DeNA Co.,Ltd. All Rights Reserved.
サーバーリクエストはその瞬間に
スタートしている(レスポンスは
サーバー側で2-6秒ブロック)
Copyright © DeNA Co.,Ltd. All Rights Reserved.
スの<script>タグと<link>のスタイ
ルシートの読み込みがブロックに
なっていて、完了すると表示され
る
Copyright © DeNA Co.,Ltd. All Rights Reserved.
■ 実験してみた:その2
⁃ すみません。Goで書きました。
⁃ HTTP/2を使っています。
⁃ HTMLはまずヘッダーを返し、末尾のコンテンツは4秒後に返した
⁃ リソースはJS、async付きJS、defer付きJS、CSSの4種類を読み込み。
サーバー側で、2秒に返信と6秒後に返信の2パターン8通りのうち、6秒間
ブロッキングするJSとCSSを抜いた6パターンでアクセス
⁃ コードはこちら
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ブロッキングするJS/CSSが終わっ
たこの段階(2秒後)で表示が開始
されている(この時点で読み込み
済みのCSSは利用される
Copyright © DeNA Co.,Ltd. All Rights Reserved.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
後半のチャンクが到着したら再度
画面更新
window.addEventListener('load')イ
ベントは最後のチャンクまで呼ば
れたら実行される。
Copyright © DeNA Co.,Ltd. All Rights Reserved.
実験成功
■ 先に返したヘッダー部分をパースしてChromeは必要なリクエストを取得した
⁃ chunked-encodingは高速化に使える
■ ドキュメントのロードイベントは全HTMLの読み込みが終わってから実行
⁃ 先にJSをロードしても、documentオブジェクトがまだないので何も表示
もできなかった
■ アセットの種類によって優先度が変わっている
⁃ スの<script>タグだとhigh
⁃ <link>のCSSファイルはhighest
⁃ async/defer付きの<script>タグはlow
■ 優先度が高いアセットはダウンロード完了するまで表示がストップ
Copyright © DeNA Co.,Ltd. All Rights Reserved.
・・・実はHTTP/2では
■ chunked-encodingなんてものはありません→
■ HTTP/2では各ファイルごとにストリームができる
⁃ ストリームは擬似的なTCPコネクション
⁃ ストリームには、データ片がフレームという単位で送信される
⁃ HEADERSフレーム(ヘッダー)やDATAフレーム(ボディ)などがある
⁃ 各ストリームを構成するフレームは終了ビットを立てない限りは同じ種
類のフレームを連続して送信できる
終了ビットの立ってないDATAフレームを断続的に送信することで
chunked-encodingと同じことが実現できる!!!
GoのAPIは同じFlusherインタフェースでHTTP/1.1と2の両対応
RFC 7540 : Section 8.1
HTTP/2 uses DATA frames to carry message
payloads. The "chunked" transfer encoding
defined in Section 4.1 of [RFC7230] MUST NOT
be used in HTTP/2.
Copyright © DeNA Co.,Ltd. All Rights Reserved.
実はこの手法
■ オライリーの続・ハイパフォーマンスWebサイト
にも書いてありました。
⁃ 第12章: ドキュメントのフラッシュ
■ やってみたらHTTP/2でもまだ有効というのが
今回の収穫
■ ダウンロードのアセット間のブロッキングが
当時とは違って行われないことがわかりました
⁃ HTTP/2にすればアセットの順序とか考えずに
トップスピードでダウンロード
Copyright © DeNA Co.,Ltd. All Rights Reserved.
それ以外の高速化のアイディア
※一部妄想です
Copyright © DeNA Co.,Ltd. All Rights Reserved.
HTTP/2時代のスクリプトの配布は?
■ 分割されたファイルをそのまま配信する方が良い
⁃ ファイル片ごとにキャッシュが効くので二回目以降のメリットが大きい
■ webpack/browserify/rollupとかは不要になる?
⁃ たぶんならない
⁃ tree shakingでファイルサイズ削減はあって損はないはず
⁃ npmとか余計なファイル入りまくりなのでそのままデプロイとか辛い
⁃ 単純にソースコードのままだと、子・孫のファイル取得に時間がかかる
⁃ 途中までは既存のバンドルツールと同じ処理をするが、最後にファイル
結合しないで、必要なすべてのファイルのimport文を並べたエントリー
ポイントスクリプトファイルを生成するようになるのでは?
誰か作って!
Copyright © DeNA Co.,Ltd. All Rights Reserved.
ボディをServer Side Renderingしないアイディア
■ 完全なSPAでは、JSのロードが終わってから、そのJSがサーバーにリクエスト
を送るため、データのロードが開始するのが後ろ倒しになる
⁃ 結果として表示に時間がかかる
■ 前倒しにできないか?
⁃ 完全なHTMLのレンダリングをせずに、インラインJSタグを使ってJSONを
埋めむとか
⁃ あるいは、インラインのスクリプトはCSPでひっかかる可能性があるので
いっそのこと/data.jsみたいなJSを読み込むようにして、そのスクリプト
を動的生成するとか?
• 安全なJSONP
■ SSRが速度に効くというの、JSライブラリがでかすぎただけでは?
⁃ MithrilとかMoon.jsを使えば初回表示も操作開始も爆速にできないか?
⁃ あとはchunked-encodingを使ってJSロードを早めればさらに高速に
Copyright © DeNA Co.,Ltd. All Rights Reserved.
まとめ
■ chunked-encodingでダウンロード速度改善はHTTP/2時代にも有効
■ アセットが巨大化していく時代にあっては効果が大きい
⁃ SSRをして、初回HTML生成までリードタイムが長い場合に
一番効果が大きそう
⁃ SSRしないけど、JSONを埋め込んでSPAの手法で高速化するときも有効
■ chunked-encodingとかHTTP/2のフレームあたりの詳しい説明が知りたい方は
Real World HTTPっていう本に書かれているらしいですよ!

More Related Content

What's hot (20)

PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
PPTX
resin-dataに関する障害について
NTTDATA INTRAMART
 
PDF
10分で分かるLinuxブロックレイヤ
Takashi Hoshino
 
PDF
ファイルシステム比較
NaoyaFukuda
 
PDF
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
Uptime Technologies LLC (JP)
 
PPTX
std::pin の勘所
Hiroaki Goto
 
PDF
AlmaLinux と Rocky Linux の誕生経緯&比較
beyond Co., Ltd.
 
PDF
iostatの見方
Yohei Azekatsu
 
PDF
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
NTT DATA Technology & Innovation
 
PPTX
Kafka vs Pulsar @KafkaMeetup_20180316
Nozomi Kurihara
 
PDF
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
PDF
20221021_JP5.0.2-Webinar-JP_Final.pdf
NVIDIA Japan
 
PPTX
Java11へのマイグレーションガイド ~Apache Hadoopの事例~
Yahoo!デベロッパーネットワーク
 
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
 
PDF
AWS Wavelengthと大阪リージョンのご紹介20210414
Amazon Web Services Japan
 
PDF
リクルートのWebサービスを支える共通インフラ「RAFTEL」
Recruit Technologies
 
PDF
ネットワークOS野郎 ~ インフラ野郎Night 20160414
Kentaro Ebisawa
 
PPTX
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Spark の紹介(前半:Sparkのキホン)
NTT DATA OSS Professional Services
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
resin-dataに関する障害について
NTTDATA INTRAMART
 
10分で分かるLinuxブロックレイヤ
Takashi Hoshino
 
ファイルシステム比較
NaoyaFukuda
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
Uptime Technologies LLC (JP)
 
std::pin の勘所
Hiroaki Goto
 
AlmaLinux と Rocky Linux の誕生経緯&比較
beyond Co., Ltd.
 
iostatの見方
Yohei Azekatsu
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
NTT DATA Technology & Innovation
 
Kafka vs Pulsar @KafkaMeetup_20180316
Nozomi Kurihara
 
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
20221021_JP5.0.2-Webinar-JP_Final.pdf
NVIDIA Japan
 
Java11へのマイグレーションガイド ~Apache Hadoopの事例~
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
 
AWS Wavelengthと大阪リージョンのご紹介20210414
Amazon Web Services Japan
 
リクルートのWebサービスを支える共通インフラ「RAFTEL」
Recruit Technologies
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
Kentaro Ebisawa
 
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
NTT DATA Technology & Innovation
 
Apache Spark の紹介(前半:Sparkのキホン)
NTT DATA OSS Professional Services
 

Viewers also liked (20)

PDF
MySQLやSSDとかの話 後編
Takanori Sejima
 
PDF
Cephを用いたwordpressの構築[LT版]
Kat 0gm
 
PDF
Advanced technic for OS upgrading in 3 minutes
Hiroshi SHIBATA
 
PDF
MySQLやSSDとかの話 前編
Takanori Sejima
 
PDF
性能測定道 事始め編
Yuto Hayamizu
 
PDF
Prometheus触ってみた
Sho2010
 
PDF
性能測定道 実践編
Yuto Hayamizu
 
PDF
Web現場Meetup #2 圧倒的成長環境の作り方
kaiba d
 
PDF
スクラムを導入してみて一回挫折したけど再起させた話
PIXTA Inc.
 
PDF
情報科学における18のメタテクニック
nakano_lab
 
PDF
サービスのスケール化のための検索システム改善
PIXTA Inc.
 
PDF
ウェブエンジニアのための色の話
Kazuyuki CHINDA
 
PDF
プロダクトに 1 から Vue.js を導入した話
Shohei Okada
 
PPTX
エフェクト用 Shader 機能紹介
Hajime Sanno
 
PPTX
5年しかもたない最高のシステムとの向き合い方
Jumpei iwamura
 
PDF
Node Foundation Membership Overview 20160907
NodejsFoundation
 
PDF
エンジニアがデザインやってみた @ Aimning MeetUp 2017/10
Hidenori Doi
 
PDF
Node.js API 서버 성능 개선기
JeongHun Byeon
 
PPTX
エフェクトにしっかり色を付ける方法
kmasaki
 
PDF
スマホゲームのUI仕様書
Katsumi Mizushima
 
MySQLやSSDとかの話 後編
Takanori Sejima
 
Cephを用いたwordpressの構築[LT版]
Kat 0gm
 
Advanced technic for OS upgrading in 3 minutes
Hiroshi SHIBATA
 
MySQLやSSDとかの話 前編
Takanori Sejima
 
性能測定道 事始め編
Yuto Hayamizu
 
Prometheus触ってみた
Sho2010
 
性能測定道 実践編
Yuto Hayamizu
 
Web現場Meetup #2 圧倒的成長環境の作り方
kaiba d
 
スクラムを導入してみて一回挫折したけど再起させた話
PIXTA Inc.
 
情報科学における18のメタテクニック
nakano_lab
 
サービスのスケール化のための検索システム改善
PIXTA Inc.
 
ウェブエンジニアのための色の話
Kazuyuki CHINDA
 
プロダクトに 1 から Vue.js を導入した話
Shohei Okada
 
エフェクト用 Shader 機能紹介
Hajime Sanno
 
5年しかもたない最高のシステムとの向き合い方
Jumpei iwamura
 
Node Foundation Membership Overview 20160907
NodejsFoundation
 
エンジニアがデザインやってみた @ Aimning MeetUp 2017/10
Hidenori Doi
 
Node.js API 서버 성능 개선기
JeongHun Byeon
 
エフェクトにしっかり色を付ける方法
kmasaki
 
スマホゲームのUI仕様書
Katsumi Mizushima
 
Ad

More from Yoshiki Shibukawa (20)

PDF
多すぎるユニットテストは却ってよくない?私が実践しているテストコードのリファクタリング
Yoshiki Shibukawa
 
PDF
ITコンサルが改善するのはビジネスだけじゃない! サークル的活動で業界貢献 技育祭2024秋
Yoshiki Shibukawa
 
PPTX
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
Yoshiki Shibukawa
 
PPTX
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
Yoshiki Shibukawa
 
PPTX
Golang tokyo #7 qtpm
Yoshiki Shibukawa
 
PPTX
Mithril
Yoshiki Shibukawa
 
PPTX
Go & multi platform GUI Trials and Errors
Yoshiki Shibukawa
 
PPTX
Excelの話
Yoshiki Shibukawa
 
PPTX
FINAL FANTASY Record Keeperを支えたGolang
Yoshiki Shibukawa
 
PPTX
アンラーニング
Yoshiki Shibukawa
 
PDF
東京Node学園 今できる通信高速化にトライしてみた
Yoshiki Shibukawa
 
PDF
Oktavia全文検索エンジン - SphinxCon JP 2014
Yoshiki Shibukawa
 
PDF
Oktavia Search Engine - pyconjp2014
Yoshiki Shibukawa
 
PDF
大規模JavaScript開発
Yoshiki Shibukawa
 
PDF
Xpjug基調lt2011
Yoshiki Shibukawa
 
PDF
Expert JavaScript Programming
Yoshiki Shibukawa
 
PDF
JavaScriptゲーム制作勉強会
Yoshiki Shibukawa
 
PDF
Pomodoro technique
Yoshiki Shibukawa
 
PDF
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
Yoshiki Shibukawa
 
PDF
Bitbucket&mercurial
Yoshiki Shibukawa
 
多すぎるユニットテストは却ってよくない?私が実践しているテストコードのリファクタリング
Yoshiki Shibukawa
 
ITコンサルが改善するのはビジネスだけじゃない! サークル的活動で業界貢献 技育祭2024秋
Yoshiki Shibukawa
 
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
Yoshiki Shibukawa
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
Yoshiki Shibukawa
 
Golang tokyo #7 qtpm
Yoshiki Shibukawa
 
Go & multi platform GUI Trials and Errors
Yoshiki Shibukawa
 
Excelの話
Yoshiki Shibukawa
 
FINAL FANTASY Record Keeperを支えたGolang
Yoshiki Shibukawa
 
アンラーニング
Yoshiki Shibukawa
 
東京Node学園 今できる通信高速化にトライしてみた
Yoshiki Shibukawa
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Yoshiki Shibukawa
 
Oktavia Search Engine - pyconjp2014
Yoshiki Shibukawa
 
大規模JavaScript開発
Yoshiki Shibukawa
 
Xpjug基調lt2011
Yoshiki Shibukawa
 
Expert JavaScript Programming
Yoshiki Shibukawa
 
JavaScriptゲーム制作勉強会
Yoshiki Shibukawa
 
Pomodoro technique
Yoshiki Shibukawa
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
Yoshiki Shibukawa
 
Bitbucket&mercurial
Yoshiki Shibukawa
 
Ad

Recently uploaded (10)

PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 

Chunked encoding を使った高速化の考察

  • 1. Copyright © DeNA Co.,Ltd. All Rights Reserved. chunked encoding を使った高速化の考察 東京Node学園26時限目 2017/6/28 渋川よしき
  • 2. Copyright © DeNA Co.,Ltd. All Rights Reserved. 新刊でました! ■ 初版を買うなら今がチャンス!今すぐ本屋へ ■ ブラウザなどの通信まわり(JSとかCSSを 除く)のいろいろなトピックを思いつく限り 集めました ■ ブラウザ(利用者)視点で説明するようにして います。
  • 3. Copyright © DeNA Co.,Ltd. All Rights Reserved. ■ ウェブ系の話題で、 「だよねーわかるわかる…」 と分かったふりをしたことがある人に オススメ! ■ アニメについて詳しくなりたい人は 弊社のハッカドールをご利用ください
  • 4. Copyright © DeNA Co.,Ltd. All Rights Reserved. 今日の発表はReal World HTTP を読んでいる前提で進めます
  • 5. Copyright © DeNA Co.,Ltd. All Rights Reserved. その前に
  • 6. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 7. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 8. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithrilの最新動向も気になりますよね!
  • 9. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril 1.xのバージョンアップについて
  • 10. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril 0.2.x ■ 少ないAPI ■ 小さなダウンロードサイズ ■ 仮想DOMを使った高速な描画 ■ イベントハンドラと通信のコールバックを活用した描画タイミング制御
  • 11. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril 0.2.x : 21関数、2プロパティ ■ コア ⁃ m() ⁃ m.component() ⁃ m.prop() ⁃ m.withAttr() ■ ラウティング ⁃ m.mount() ⁃ m.route(elem, defualt, routes) ⁃ m.route(path, params, replaceHistory) ⁃ m.route() ⁃ m.route(element) ⁃ m.route.mode ⁃ m.route.param ⁃ m.route.buildQueryString() ⁃ m.route.parseQueryString() ■ データ ⁃ m.request() ⁃ m.deferred() ⁃ m.sync() ■ HTML ⁃ m.trust() ■ レンダリング ⁃ m.render() ⁃ m.redraw() ⁃ m.redraw.strategy() ⁃ m.startComputation() ⁃ m.endComputation() ■ テスト ⁃ m.deps()
  • 12. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril 1.x : 14関数、2プロパティ ■ コア ⁃ m() ⁃ m.component() ⁃ m.prop() ⁃ m.withAttr() ■ ラウティング ⁃ m.mount() ⁃ m.route(elem, defualt, routes) ⁃ m.route(path, params, replaceHistory)→m.route.set() ⁃ m.route()→m.route.get() ⁃ m.route(element)→m.route.link() ⁃ m.route.mode→m.route.prefix ⁃ m.route.param ⁃ m.route.buildQueryString()→m.buildQueryString() ⁃ m.route.parseQueryString()→m.parseQueryString() ■ データ ⁃ m.request() ⁃ m.deferred() ⁃ m.sync() ■ HTML ⁃ m.trust() ■ レンダリング ⁃ m.render() ⁃ m.redraw() ⁃ m.redraw.strategy() ⁃ m.startComputation() ⁃ m.endComputation() ■ テスト ⁃ m.deps() ■ 追加 ⁃ m.fragment() ⁃ m.version
  • 13. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril 1.xはマジキチ ■ 機能が減った ⁃ 関数の数が21→14 ⁃ ファイルサイズも減った ⁃ deferredがES6標準のPromiseに移行 ⁃ 描画タイミングコントロールなんて必要なかった ⁃ プロパティは外部に切り出されてちょっとリッチなストリームになった ■ 高速化したらしい ■ 設計のガイドラインからビューモデルが消えた ⁃ ドキュメントからビューモデルの文字が消えさった ■ ライフサイクルメソッドが整理された ■ なお、マイグレーションスクリプトで変換はほぼ自動でいける ⁃ http://mithril-ja.js.org/change-log.html#migrating-from-v02x
  • 14. Copyright © DeNA Co.,Ltd. All Rights Reserved. Mithril 1.xを活かす設計 ■ 仮想DOMのパフォーマンス・チューニングがしやすく ⁃ 仮想DOMの内部設計がドキュメント化された。コードも読みやすい。 ■ コンポーネントは表示に特化 ⁃ ラウターリゾルバーを使ってデータ取得をコンポーネントの外に移動で きるように ■ データ取得部分はモデルに ⁃ ビューモデルの役割もモデルにマージ ⁃ ただ、通信の最適化とかこのあたりは今後革新がありそう (Mithrilにかぎらず、React、Vue、Riot、Angularとかでも) ■ 終了アニメーション ⁃ ライフサイクルメソッドがPromiseを返せる。終了を遅延できる。 ⁃ 0.2.xでは力技で実現するのは大変だった。
  • 15. Copyright © DeNA Co.,Ltd. All Rights Reserved. ドキュメント(http://mithril-ja.js.org/)は翻訳済み
  • 16. Copyright © DeNA Co.,Ltd. All Rights Reserved. 本もあるよ! ■ オライリーの電子書籍です ■ 0.2.x準拠 ■ 前ページの項目の差分に気をつけながら お読みいただければ ⁃ ビューモデルもモデルの一部に ⁃ 描画タイミングの制御はなくなった ⁃ モデル取得の司令はラウターリゾルバーに 持っていく方がたぶん良い ■ 精神的な部分は互換性があります! ■ そろそろ改訂したい気持ちがあります
  • 17. Copyright © DeNA Co.,Ltd. All Rights Reserved. chunked encoding を使った高速化の考察 東京Node学園26時限目 2017/6/28 渋川よしき
  • 18. Copyright © DeNA Co.,Ltd. All Rights Reserved. Transfer-Encoding: chunked ■ Real World HTTP P119を開いてください ■ Transfer-Encoding: chunked ■ HTTP/1.1で追加された機能 ■ ボディを細切れにして転送する ⁃ 最初にContent-Lengthで全体の長さを送らない ⁃ チャンクサイズ(16進数)と、その長さのボディという組を何回かに分 けて送る ⁃ 最後に長さゼロを送ると終了 ⁃ ボディサイズを最初に決めなくてもいい
  • 19. Copyright © DeNA Co.,Ltd. All Rights Reserved. 質問: Transfer-Encoding: chunked を普段から意識していますか?
  • 20. Copyright © DeNA Co.,Ltd. All Rights Reserved. 有効回答数: 19
  • 21. Copyright © DeNA Co.,Ltd. All Rights Reserved. 有効回答数: 19 半数以上の人があまり意識してい ない
  • 22. Copyright © DeNA Co.,Ltd. All Rights Reserved. 普段は意識しなくてもいい ■ どのプログラミング言語のHTTPクライアントAPIも、勝手に結合してくれる ■ bodyをストリームのようなAPIで読み込むと、場合によってはチャンクごとに 返ってくるかも? ■ 大抵HTTPクライアントを書く時は、JSONとかの細切れにパースできないデー タが欲しいだろうから、末尾までまるっと読み込みますよね?
  • 23. Copyright © DeNA Co.,Ltd. All Rights Reserved. SSRは本当に早いのか? ■ SSRを使うと初回ロードが高速になるっていうけど ⁃ 本当に高速なの? ⁃ Node.jsのイベントループに負荷をかけるしスケールするか疑わしい(キ ャッシュしないと) ■ 最近のウェブのデータ量は大きい ⁃ JSも数100KB ⁃ CSSもでかい ⁃ 画像も多い。全部で数MBはある。
  • 24. Copyright © DeNA Co.,Ltd. All Rights Reserved. HTTP リクエスト リクエスト 受信 DB アクセス HTML レンダ リング HTML パース 初回表示されるまでの流れ ファイル 転送 アセット リクエスト 表示
  • 25. Copyright © DeNA Co.,Ltd. All Rights Reserved. HTTP リクエスト リクエスト 受信 DB アクセス HTML レンダ リング HTML パース 初回表示されるまでの流れ ファイル 転送 アセット リクエスト 表示 表示するにもいろいろ情報を集め る必要がある HTMLパースをするまで 必要なJS/CSS/画像がわからない リクエスト開始が遅い 実際にはここが一番支配 的になるはず CSS→画像も読み込まな いと必要なファイルが分 からない
  • 26. Copyright © DeNA Co.,Ltd. All Rights Reserved. chunked encodingを使うアイディア ■ HTMLを読み込まないと必要なリソースがわからない・・・ ⁃ <script>タグと<link>タグ部分だけ先に読み込ませてしまえばいいのでは? ■ 期待する結果 HTTP リクエスト リクエスト 受信 DB アクセス HTML レンダ リング HTML パース ファイル 転送 アセット リクエスト 表示 HTML パース 高速化
  • 27. Copyright © DeNA Co.,Ltd. All Rights Reserved. ■ 実験してみた:その1 ⁃ すみません。Goで書きました。 ⁃ HTTP/2を使っています。 ⁃ HTMLはまずヘッダーを返し、末尾のコンテンツは4秒後に返した ⁃ リソースはJS、async付きJS、defer付きJS、CSSの4種類を読み込み。サーバ ー側で、2秒に返信と6秒後に返信の2パターン8通り返してみた ⁃ コードはこちら
  • 28. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 29. Copyright © DeNA Co.,Ltd. All Rights Reserved. 即座にヘッダー部だけ返し、 残りは4秒後に返している
  • 30. Copyright © DeNA Co.,Ltd. All Rights Reserved. サーバーリクエストはその瞬間に スタートしている(レスポンスは サーバー側で2-6秒ブロック)
  • 31. Copyright © DeNA Co.,Ltd. All Rights Reserved. スの<script>タグと<link>のスタイ ルシートの読み込みがブロックに なっていて、完了すると表示され る
  • 32. Copyright © DeNA Co.,Ltd. All Rights Reserved. ■ 実験してみた:その2 ⁃ すみません。Goで書きました。 ⁃ HTTP/2を使っています。 ⁃ HTMLはまずヘッダーを返し、末尾のコンテンツは4秒後に返した ⁃ リソースはJS、async付きJS、defer付きJS、CSSの4種類を読み込み。 サーバー側で、2秒に返信と6秒後に返信の2パターン8通りのうち、6秒間 ブロッキングするJSとCSSを抜いた6パターンでアクセス ⁃ コードはこちら
  • 33. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 34. Copyright © DeNA Co.,Ltd. All Rights Reserved. ブロッキングするJS/CSSが終わっ たこの段階(2秒後)で表示が開始 されている(この時点で読み込み 済みのCSSは利用される
  • 35. Copyright © DeNA Co.,Ltd. All Rights Reserved.
  • 36. Copyright © DeNA Co.,Ltd. All Rights Reserved. 後半のチャンクが到着したら再度 画面更新 window.addEventListener('load')イ ベントは最後のチャンクまで呼ば れたら実行される。
  • 37. Copyright © DeNA Co.,Ltd. All Rights Reserved. 実験成功 ■ 先に返したヘッダー部分をパースしてChromeは必要なリクエストを取得した ⁃ chunked-encodingは高速化に使える ■ ドキュメントのロードイベントは全HTMLの読み込みが終わってから実行 ⁃ 先にJSをロードしても、documentオブジェクトがまだないので何も表示 もできなかった ■ アセットの種類によって優先度が変わっている ⁃ スの<script>タグだとhigh ⁃ <link>のCSSファイルはhighest ⁃ async/defer付きの<script>タグはlow ■ 優先度が高いアセットはダウンロード完了するまで表示がストップ
  • 38. Copyright © DeNA Co.,Ltd. All Rights Reserved. ・・・実はHTTP/2では ■ chunked-encodingなんてものはありません→ ■ HTTP/2では各ファイルごとにストリームができる ⁃ ストリームは擬似的なTCPコネクション ⁃ ストリームには、データ片がフレームという単位で送信される ⁃ HEADERSフレーム(ヘッダー)やDATAフレーム(ボディ)などがある ⁃ 各ストリームを構成するフレームは終了ビットを立てない限りは同じ種 類のフレームを連続して送信できる 終了ビットの立ってないDATAフレームを断続的に送信することで chunked-encodingと同じことが実現できる!!! GoのAPIは同じFlusherインタフェースでHTTP/1.1と2の両対応 RFC 7540 : Section 8.1 HTTP/2 uses DATA frames to carry message payloads. The "chunked" transfer encoding defined in Section 4.1 of [RFC7230] MUST NOT be used in HTTP/2.
  • 39. Copyright © DeNA Co.,Ltd. All Rights Reserved. 実はこの手法 ■ オライリーの続・ハイパフォーマンスWebサイト にも書いてありました。 ⁃ 第12章: ドキュメントのフラッシュ ■ やってみたらHTTP/2でもまだ有効というのが 今回の収穫 ■ ダウンロードのアセット間のブロッキングが 当時とは違って行われないことがわかりました ⁃ HTTP/2にすればアセットの順序とか考えずに トップスピードでダウンロード
  • 40. Copyright © DeNA Co.,Ltd. All Rights Reserved. それ以外の高速化のアイディア ※一部妄想です
  • 41. Copyright © DeNA Co.,Ltd. All Rights Reserved. HTTP/2時代のスクリプトの配布は? ■ 分割されたファイルをそのまま配信する方が良い ⁃ ファイル片ごとにキャッシュが効くので二回目以降のメリットが大きい ■ webpack/browserify/rollupとかは不要になる? ⁃ たぶんならない ⁃ tree shakingでファイルサイズ削減はあって損はないはず ⁃ npmとか余計なファイル入りまくりなのでそのままデプロイとか辛い ⁃ 単純にソースコードのままだと、子・孫のファイル取得に時間がかかる ⁃ 途中までは既存のバンドルツールと同じ処理をするが、最後にファイル 結合しないで、必要なすべてのファイルのimport文を並べたエントリー ポイントスクリプトファイルを生成するようになるのでは? 誰か作って!
  • 42. Copyright © DeNA Co.,Ltd. All Rights Reserved. ボディをServer Side Renderingしないアイディア ■ 完全なSPAでは、JSのロードが終わってから、そのJSがサーバーにリクエスト を送るため、データのロードが開始するのが後ろ倒しになる ⁃ 結果として表示に時間がかかる ■ 前倒しにできないか? ⁃ 完全なHTMLのレンダリングをせずに、インラインJSタグを使ってJSONを 埋めむとか ⁃ あるいは、インラインのスクリプトはCSPでひっかかる可能性があるので いっそのこと/data.jsみたいなJSを読み込むようにして、そのスクリプト を動的生成するとか? • 安全なJSONP ■ SSRが速度に効くというの、JSライブラリがでかすぎただけでは? ⁃ MithrilとかMoon.jsを使えば初回表示も操作開始も爆速にできないか? ⁃ あとはchunked-encodingを使ってJSロードを早めればさらに高速に
  • 43. Copyright © DeNA Co.,Ltd. All Rights Reserved. まとめ ■ chunked-encodingでダウンロード速度改善はHTTP/2時代にも有効 ■ アセットが巨大化していく時代にあっては効果が大きい ⁃ SSRをして、初回HTML生成までリードタイムが長い場合に 一番効果が大きそう ⁃ SSRしないけど、JSONを埋め込んでSPAの手法で高速化するときも有効 ■ chunked-encodingとかHTTP/2のフレームあたりの詳しい説明が知りたい方は Real World HTTPっていう本に書かれているらしいですよ!