OpenFreeMap、毎秒10万リクエストを耐えた経験を共有
(blog.hyperknot.com)- OpenFreeMapは毎秒10万リクエストと日次3億件のトラフィックを成功裏に処理
- Wplace.liveの急激な人気と自動化された大量リクエストがトラフィック急増の原因
- CloudflareのCDNキャッシュ率99.4%、サーバーはさらに1,000 rpsも無理なくさばいた
- そのためタイル欠落などの軽微な障害のみが発生し、サービスはほとんど正常運用
- 今後はリファラー(Referer)ベースの帯域幅制限など自動トラフィック管理の改善を計画
OpenFreeMap の過去10か月と超大規模トラフィック対応の経験
OpenFreeMapは過去10か月間、非常に安定した運用経験を積んできた。Cloudflareの帯域幅支援、Hetznerサーバーの安定性、Btrfsでのタイルサービス、nginxの効率性のおかげでシステムの信頼性が実証された。しかしある日、突然一部のタイルがロードされないという報告があった。これは普段はアルゴリズムバグが原因だが、今回は**open() "Too many open files"**のエラーがnginxログで見つかった。
トラフィック監視ツールで確認した結果、24時間で30億リクエストが発生し、小さなタイルファイルだけで215TBのトラフィックを記録した。最近の5分間で3,000万件のリクエスト、つまり毎秒10万リクエストに達する急増があった。このトラフィックは、商用の地図サービスでは月600万ドル以上のコストになる。
Cloudflareダッシュボードでは96%が200 OKで応答し、3.6%のみが異常(206 Partial Content)だった。大半のリクエストは正常にサービスされ、欠損タイルを除けば全体システムはよく動作していることを確認した。
トラフィック急増の原因: Wplace.live
この急増の原因はWplace.liveという新しいコラボレーション描画Webサイトだ。公開直後に多数のユーザーが殺到し、これらがOpenFreeMapベースの地図を使うよう設計された。ユーザーは1ピクセル/30秒制限を回避するため、Puppeteer/Chromium、IPローテーションなどの自動化ツールを用いて大量リクエストを発生させた。
運営者は、以前にNeal.funと協業した経験を引き合いに、トラフィック発生前の事前コミュニケーションの重要性を強調している。今回はサービス運営に支障が出たため、初めてCloudflareルールを適用してブロックした。今後は referer または custom header ベースの自動トラフィック制御(Cloudflare APIの活用を含む)を検討中だ。
CloudflareのサポートとOpenFreeMapアーキテクチャの成果
Cloudflareは帯域幅支援を非常に迅速に(週末を含め48時間以内)承認し、エンジニアとアーキテクチャ適合性の検討まで進めた。大規模企業でありながら、柔軟な対応力を示した。
運営者は99.4%のCDNキャッシュ率を達成し、サーバーが1,000 rpsの負荷も耐えられたことを誇りにしている。週次データ更新を提供するサービスとしてはかなり高い成果である。
Wplace.live開発者との連携と解決提案
その後、Wplace.live開発者と連絡が取れ、200万人の急増で準備不足になったことを理解してもらえた。このサービスにはOpenFreeMapのセルフホスティングインスタンス提供を提案し、トラフィック集中を抑えて効率化を図る方針で協議した。
また、実際の200万人のユーザー数に対して30億リクエストが発生したことは、スクリプトベースの大量リクエストが圧倒的だったことを示している。一般ユーザーは10〜20回程度のリクエストで止まるため、サービスポリシーを変更して不要な自動リクエストを防ぐことを推奨している。
今後の改善と学び
運営者は2つの問題改善を予告している。
-
リファラー(Referer)ベースの帯域幅制限
- Cloudflareでリファラー別のリクエストを24時間あたり1億〜2億回などに制限する方法を導入予定
- ネイティブアプリにはcustom headerを使うように誘導予定
-
タイル欠損処理とサーバー構成の改善
- 誤ったサーバー設定で空のタイルが生成されないよう対応予定
OpenFreeMapは現在、月額500ドルの寄付で運営している。インフラ費用は十分に賄えるが、新規開発は限られた個人時間に依存している。追加支援により開発速度とサービス安定性を拡大できる。
GitHub支援を通じてプロジェクトをサポートすることができる: https://github.com/sponsors/hyperknot
まだコメントはありません。