uzullaがブログ

uzullaがブログです。

「ブラジルの人きこえますか〜?」ブラジルのユーザーにそれなりの体験を提供する話

当方、割と国際的な案件も、希にチョイチョイやっております。


大抵の場合リージョナルな感じ(たとえば、東南アジアとか、南米とか)なので、現地のサーバーや、近傍国のサーバーを契約しちゃうのが一番早いのですけど*1、いま手元にあるちょっとクレームが付いているシステムは、国内メインで全世界でやるよ〜というシステムなので、国内にサーバーを置かないといけないやつだった。

結果として、地球の裏側のユーザーの体験が微妙でおこ!みたいな感じになってるので対応している

なぜブラジルの人がおこになるのか。

日本のインターネットはかなり整備されてますし、世界各地とかなり良い回線でつながれてはいるものの、どうしたって光の速度はこえられない。
あと、直通回線が細く、かなり遠回りしてるような所、特にRTTが悪いインド、南米あたりはかなりつらめなユーザー体験になります。
あと、純粋にラストワンマイル回線が貧弱な東南アジア系やモバイルも、かなり悲惨な事になります。


単純に転送をgzipで圧縮して、KeepAliveだけでも結構違うんですけど、それだけでも超えられないものがある。

解決策

「えー?AWSで世界中にサーバーたてればいいじゃん。あと、CroudFrontね、これでばっちり!」

残念、そこまでのご予算はない

AWSとか(色々全部揃えていくと)高い!
ご予算フリー案件ではそういう技はあるのですが、ボクはそんなご予算フリーの案件に出会う事はマレですし、
そもそもDBのパーティションとか出来ない感じの案件なのでそういうの無理なので無理です。

次善策

ということで本題ですが、Cloud Flareつかいます。
https://www.cloudflare.com/

CloudFlareはかなり有名なので、つかってるよ!って人も多いと思うんですけど、大体まあ国内で使っている人が多くて(ユースケースとしてね)*2
外配信だったり、Business Planまで使ってる記事ってあんまないので、ちょっとは参考になるんじゃないですか!?(なるってことにしましょう)

とっとと結果

計測方法

あるページにアクセスして、キャッシュをオフにしたfirefoxFirebugのnetタブのOnloadの数字を目視計測(自動化しないとか…)

あるページ

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

所感

どうでしょう、良い感じでは?
6秒が1.8秒になるならまずまずでしょう。
このページは条件として、静的なファイルがあんまりない、というCDNがききづらい条件でもかなり短縮されているのがわかります。


ベンチマークのためにキャッシュを無効にしていますが、オンにすれば当然もっと早くなります(上の1.6が1.3秒くらいまで)
静的ファイルがキャッシュされているのもそうですが、Railgun(後述)で、CDNが聞きづらい本文や、Ajaxリクエストが高速化されています。

「1秒こえるとか、おこですよ!!!」

「1.3秒とかもありえねーよ!」という事になるともうあきらめて現地にサーバーをおくしかない感じある。
(南米まで、整備されてるAWSのDCですら、RTTで3〜400くらいあるので…)


あとはAjax部分を本文にうめこむとか…そこまでやるか?

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ワイルドカード証明書も、載せられます)が使えます。

証明書インストール後の反映タイムラグ

多少あります。また、Firefoxなどのブラウザだと、DNSのキャッシュがきいてしまうので、再起動したほうが宜しい。
(かなりやきもきした)

オマケ、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、すごい導入簡単なんですけど、ちょっといじりはじめるとすぐにややこしくなるのだけはどうにかならんもんか…。

ブラジルのWindowsからテストする具体的な方法について

は、後日また書きます。
まあ、AWSで建てるだけですけど、ちょっとしたWindowsネタですね。

*1:イヤア、現地の業者と契約するの、AWSのおかげでクッソ便利になりましたね!!!!

*2:最近エロサイトとかでCFのエラー画面をみたりしますね!!