海外から快適に使ってもらうためにしてきたことみてねのMeetup #2 for サーバーサイド/SRE2018/09/05おぜきよしろう
View Slide
自己紹介● 尾関芳郎● みてねがすき● ポーカーがすき● ロックフェスがすき
「家族アルバム みてね」について
● URL: https://mitene.us/● 2015年4月 サービス開始● 2017年7月 英語版提供開始○ ここを伸ばしていくために頑張ってます● 2018年7月 ユーザー数 300万人突破● 2018年8月 写真・動画のアップロード総数10億枚突破「家族アルバム みてね」について
課題の整理
課題の整理● 海外における課題○ 日本よりもアプリの動作が遅い○ 海外で成功するためにはまずここをなんとかせねば!
課題の整理● そもそも「遅い」って、何が遅いの?● 何を速くすれば快適になるの?
アプリケーションの特徴● 家族間で画像・動画をシェア○ 大量の画像・動画がアップされるため、大量のストレージが必要○ それぞれ少数人からのアクセスしかないため、 CDNキャッシュ効率が悪い● 海外展開○ 日本のリージョンに構築しているため、ネットワークレイテンシが大きい○ ピークタイムが国によって違う (とはいえ、今はほとんどが日本からのアクセス )
アプリケーションの特徴● 家族間で画像・動画をシェア○ 大量の画像・動画がアップされるため、大量のストレージが必要○ それぞれ少数人からのアクセスしかないため、 CDNキャッシュ効率が悪い● 海外展開○ 日本のリージョンに構築しているため、 ネットワークレイテンシが大きい○ ピークタイムが国によって違う (とはいえ、今はほとんどが日本からのアクセス )
アプリケーションの特徴● 家族間で画像・動画をシェア○ 大量の画像・動画がアップされるため、大量のストレージが必要○ それぞれ少数人からのアクセスしかないため、 CDNキャッシュ効率が悪い● 海外展開○ 日本のリージョンに構築しているため、 ネットワークレイテンシが大きい○ ピークタイムが国によって違う (とはいえ、今はほとんどが日本からのアクセス )● 今日は、AWSが提供する機能で解決してきたことを共有します○ (AWS使ってない人すみません )○ それ以外もいろいろやってますが、 AWSの話なら自社に取り入れやすいですよね
何をやったか?
何をやったか?1. 写真・動画ダウンロードの高速化2. 写真・動画アップロードの高速化3. APIアクセス全体の高速化
1. 写真・動画ダウンロードの高速化● みてねの画像・動画DL時のフロー(変更前)○ 全画像に対して、一度 APIにアクセスしてCloudFrontの署名付きURLを発行している■ これが遅い
1. 写真・動画ダウンロードの高速化● 署名付きURLはまとめて発行するようにAPIの仕様を変更○ 且つ署名はワイルドカードを使用○ APIへのアクセスを大幅に減らすことができた!
1. 写真・動画ダウンロードの高速化● ここを掘り下げたものが弊社酒井がiOSDCで発表しています○ https://speakerdeck.com/_atsushisakai/image-distribution-for-overseas■ こちらの資料もご確認ください。
2. 写真・動画アップロードの高速化● 海外版リリース時のアップロードフロー○ US在住の場合、us-east(またはus-west)のバケットにアップロード■ us-east(またはus-west)から ap-northeast にレプリケーション■ US以外は ap-northeast に直接アップロード○ ap-northeast のバケットに反映されないと、家族に共有されない
2. 写真・動画アップロードの高速化● Cross-Region Replication○ https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/crr.html○ もともとこれによって高速化されることを期待○ ただし、レプリケーションされるまでにタイムラグがある■ 体感で、遅い時は数十秒
2. 写真・動画アップロードの高速化● Amazon S3 Transfer Acceleration を導入○ https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/transfer-acceleration.html■ Amazon S3 Transfer Acceleration を使用すると、クライアントと S3 バケットとの間で、長距離にわたるファイル転送を高速、簡単、安全に行えるようになります。 Transfer Accelerationでは、Amazon CloudFront の世界中に分散したエッジロケーションが利用されています。エッジロケーションに到着したデータは、最適化されたネットワークパスで Amazon S3 にルーティングされます。
2. 写真・動画アップロードの高速化● Amazon S3 Transfer Acceleration を導入○ ap-northeastへのアップロードは平均 0.5秒以上速くなった■ とは言え、大きいファイルのアップロードは時間がかかるものなので、ユーザーの体感的にはあまり変わらないかも
2. 写真・動画アップロードの高速化● この時点でうすうす気づいていた○ 「あれ、Cross-Region Replicationいらなくね?」
2. 写真・動画アップロードの高速化● アメリカ出張時に現地から計測○ サムネイル作成完了まで S3 Transfer Accelerationの方が最大40秒ほど速かった○ やはりレプリケーションは結構遅いことを実感○ Transfer Accelerationは十分速い● 全てap-northeastのバケットに置くように変更した
2. 写真・動画アップロードの高速化● はじめからこうすればよかった!○ (けどしょうがない)
3. APIアクセス全体の高速化● シンプルなアプリケーション(略図)
3. APIアクセス全体の高速化● フロントにCloudFrontを入れる
3. APIアクセス全体の高速化● CloudFrontを入れるメリット○ ユーザーからCloudFrontのエッジロケーションまでの物理的な距離が近い■ SSL/TLS の接続確立が速くなる○ エッジから日本のリージョンまでの通信経路が最適化される■ Transfer Accelerationと同じ原理● 実際に速くなった○ UKからだと平均700msほど速くなった
3. APIアクセス全体の高速化beforeafter
3. APIアクセス全体の高速化beforeafter1,120ms → 321ms !!!!
3. APIアクセス全体の高速化● リソースを一つのAZに集約○ フロントのEC2, RDS, ElastiCacheのマスターを同じAZに集約○ 10msほど速くなった(海外だからというのはあまり関係ない )○ ※もちろんAZ障害が起きた際の復旧手順は用意している○ ※アンチパターンなのであまりおすすめはしない
今後の改善案
今後の改善案● 端末側で画像の先読み&キャッシュ○ 現在開発中● マルチリージョンAPI○ まだかなり先になりそう
まとめ
まとめ● 海外向けアプリはネットワークレイテンシとの戦い● AWSの機能だけである程度解決できる