ESI

なんでか知らんが、ESI(edge side include)について調べていた。
最初Ajaxでクライアント通信でええやんという感じだったんではあるが、
調べたところ、上手く使えば、確かに通信量が削減されていいかもしらん。
(あくまで上手く使えばである。最初聞かされた時はSEO対策のためとか言われてゲンナリしたもんだが。)

ESIとは、SSIの後継の結構古くからある規格だ。Ajax通信みたいなことを端っこ(Edge)のサーバでやるためのものであると勝手に理解。

ほいで、ESIをサポートしてるサーバで挙動の違いを見てみた。

Varnish

  • デフォルトで組みこまれてる。
  • ESIの機能はincludeくらいしか実装されてない。(が別に問題ない。それしか必要ない)
  • esi:includeのsrcには、pathだけで全体ページと同じバックエンドから取ってくれる。
  • esi展開を行うかどうかは設定VCLファイルの

vcl_backend_response/vcl_fetch で set beresp.do_esi = true;

  • esiを組み込んだページは、esiを展開した状態でキャッシュされるっぽい。すなわち、esiの部品の方がttlが短い場合、部品部分は、ttlが過ぎても更新されないっぽい。速度の点で有利であるが、設定次第では、部品部分のttlが切れても部品が古いままのページが表示されるっつー問題が起こらないか?

ATS (Apache Traffic Server)

  • プラグインで指定。
  • ESIの機能はだいたい組込まれてるようだ。しかし面倒なことは、アプリ側でやればいいので、正直オーバースペック。
  • esi:includeのsrcは、schemaからの完全なurlでないと取得してくれなかった。
  • esi展開を行うかどうかは、レスポンスのヘッダに、X-Esi: 1を付与するかどうか。
  • esiを組み込んだページも、展開される前の状態でキャッシュされるっぽい。すなわち、毎回esi展開が行なわれる。スピードの点で不利ではあるが、部品部分も確実に更新される。

正直それ自体にクラスター化する機能のないVarnishは、ちょっとサイトの規模が大きくなったら、あんま使いもんにならん気もしないでもない。