ユーザーが画像をアップロードできる Heroku で Rails アプリケーションを構築しています (画像は S3、米国標準リージョンに保存されています)。ユーザーは、画像をアーカイブ (zip) としてダウンロードできるリンクを友人に送信できます。このアーカイブは、オンザフライで生成する必要があります。コンテンツ (つまり、どの画像) は、いくつかの「魔法のルール」に従って、ユーザーごとに異なります。
問題: 友人がダウンロード URL を開くと、アーカイブの作成に数秒かかります。すべての画像 (合計で約 4Mb) を S3 から Rails アプリケーションにダウンロードしてから、アーカイブに圧縮する必要があります。このプロセスをスピードアップするためのアイデアはありますか? または、次のオプションを評価するのを手伝ってくれませんか?
- 非同期ダウンロード: パッケージ化に非同期ジョブ キューを使用できます (これによりプロセスが高速化されるわけではありませんが、スケーラビリティが向上します:))
- ファイル システムにキャッシュする: ファイル システムにイメージをキャッシュできます。ただし、Heroku の Web プロセスは必ずしも同じファイル システムを共有するとは限らないため、新しい Web プロセスごとにこれを行う必要があります。
- ダウンロードの並列化: ダウンロードは現在順次行われています。並列化にはスレッド (複数のジョブ キューを使用した方がよいでしょうか?) を使用できます。
- 一般的なキャッシュ コンポーネント (memcached、redis) : ファイル システムでキャッシュする代わりに、アクセスを高速化するために memcached または redis を使用できます (したがって、各 Web プロセスのキャッシュをウォームアップする必要はありません)。
キャッシュ戦略に関するいくつかの簡単なベンチマークを作成しました。さまざまな場所から 100Kb をダウンロードしようとしています。
- ファイルシステム: 0.0002s
- Memcached: 0.01 秒~0.09 秒
- Redis: 0.01s-0.09s
- S3: 0.1-0.25s
したがって、キャッシュ (ファイル システム、memcached、または redis) を使用すると、パフォーマンスが確実に向上します。最終的な解決策は、さまざまなアプローチを組み合わせることです。
と思いますか?ご助力ありがとうございます!