「ブラジルの人きこえますか〜?」ブラジルのユーザーにそれなりの体験を提供する話
当方、割と国際的な案件も、希にチョイチョイやっております。
大抵の場合リージョナルな感じ(たとえば、東南アジアとか、南米とか)なので、現地のサーバーや、近傍国のサーバーを契約しちゃうのが一番早いのですけど*1、いま手元にあるちょっとクレームが付いているシステムは、国内メインで全世界でやるよ〜というシステムなので、国内にサーバーを置かないといけないやつだった。
結果として、地球の裏側のユーザーの体験が微妙でおこ!みたいな感じになってるので対応している
なぜブラジルの人がおこになるのか。
日本のインターネットはかなり整備されてますし、世界各地とかなり良い回線でつながれてはいるものの、どうしたって光の速度はこえられない。
あと、直通回線が細く、かなり遠回りしてるような所、特にRTTが悪いインド、南米あたりはかなりつらめなユーザー体験になります。
あと、純粋にラストワンマイル回線が貧弱な東南アジア系やモバイルも、かなり悲惨な事になります。
単純に転送をgzipで圧縮して、KeepAliveだけでも結構違うんですけど、それだけでも超えられないものがある。
解決策
「えー?AWSで世界中にサーバーたてればいいじゃん。あと、CroudFrontね、これでばっちり!」
残念、そこまでのご予算はない
AWSとか(色々全部揃えていくと)高い!
ご予算フリー案件ではそういう技はあるのですが、ボクはそんなご予算フリーの案件に出会う事はマレですし、
そもそもDBのパーティションとか出来ない感じの案件なのでそういうの無理なので無理です。
次善策
ということで本題ですが、Cloud Flareつかいます。
https://www.cloudflare.com/
CloudFlareはかなり有名なので、つかってるよ!って人も多いと思うんですけど、大体まあ国内で使っている人が多くて(ユースケースとしてね)*2、
国外配信だったり、Business Planまで使ってる記事ってあんまないので、ちょっとは参考になるんじゃないですか!?(なるってことにしましょう)
とっとと結果
あるページ
・PHPで出力されるページ(国内なら50〜100msくらいでレスされる)
・サーバーは国内の大手VPS
・画像、JSはすくなめ(トータルで150Kbyte、15個くらいのファイル)
・Ajaxで、JSON APIを叩いている(国内なら50〜70msくらいでかえる)
・HTTPS通信
ベンチマーク
(以下すべて約です)
場所 | CloudFlare | Railgun | Onloadまでの時間 |
日本国内(基準) | x | x | 600ms |
ブラジル(AWSのWin) | x | x | 6000ms |
ブラジル(AWSのWin) | o | x | 2600ms |
ブラジル(AWSのWin) | o | o | 1800ms |
Railgunについて
CFはBusinnes以上になると、Railgunという機能が使えます。
https://www.cloudflare.com/railgun
これがどういうものなのか、説明するにはちゃんと理解出来てるか怪しい所はありますが、要はオリジンサーバーとCroudFlareの間でパーシステントなコネクションをもったVPNみたいなものを張り、ハンドシェイクなどの時間を省略するためのものです。
遠方だと、コネクションハンドシェークのやりとりが時間かかりますからね、効果ありそう。
実際にも体感出来るレベルで効果はあり、オンオフで3秒が1.8秒くらいになります。結構凄いぜレールガン、さすがだぜレールガン。
ちなみに、サーバー側には、railgunのデーモンと、そのサポートにmemcachedを建てる必要があります。ポートも空ける必要があります。
余談、CloudFlareで独自SSLについて
これね〜〜〜本当にやられたんだけど、実はCFで独自SSLをいままでつかったことがなかったんですよね。
Proプラン(月5ドル)で、CFが共有SSLを提供してくれるんですけど、独自SSLはBusinnessプランからだったんですよね。
https://www.cloudflare.com/plans
に、Proの所にSSLってあるじゃないですかー、これは罠だ!!
ま、嘆いてもしかたないですよね〜(もうしわけない)
CloudFlare、イージーに始められる割にはこのあたりは説明がわかりづらくてつらいですが、
Proプランだと共有SSL、Business(月200ドル)以上だと、独自SSL(ワイルドカード証明書も、載せられます)が使えます。
オマケ、CFのキャッシュコントロールについて
CFは基本的に特定の拡張子のファイルのみ、キャッシュします。
https://support.cloudflare.com/hc/en-us/articles/200172516-What-file-extensions-does-CloudFlare-cache-for-static-content-
「HTMLはキャッシュしません」
https://support.cloudflare.com/hc/en-us/articles/200172256-How-do-I-cache-static-HTML-
これは多分、ミスってえらいことになるのを防ぐ意味があるのでしょう。
(他のユーザーのログイン状態のHTMLを送信したりしないように)
いまどきはRewriteして「/」終わりでも当然のように動的なので、ホワイトリスト方式でキャッシュするファイルを特定しているのは、理解できる設計です。
勿論Page Ruleで指定することで、このあたりはある程度コントロールできます。できますが…。
https://support.cloudflare.com/hc/en-us/articles/200168306-Is-there-a-tutorial-for-PageRules-
ややこしい!!!!
CF、すごい導入簡単なんですけど、ちょっといじりはじめるとすぐにややこしくなるのだけはどうにかならんもんか…。