1

ユーザーが画像をアップロードできる Heroku で Rails アプリケーションを構築しています (画像は S3、米国標準リージョンに保存されています)。ユーザーは、画像をアーカイブ (zip) としてダウンロードできるリンクを友人に送信できます。このアーカイブは、オンザフライで生成する必要があります。コンテンツ (つまり、どの画像) は、いくつかの「魔法のルール」に従って、ユーザーごとに異なります。

問題: 友人がダウンロード URL を開くと、アーカイブの作成に数秒かかります。すべての画像 (合計で約 4Mb) を S3 から Rails アプリケーションにダウンロードしてから、アーカイブに圧縮する必要があります。このプロセスをスピードアップするためのアイデアはありますか? または、次のオプションを評価するのを手伝ってくれませんか?

  1. 非同期ダウンロード: パッケージ化に非同期ジョブ キューを使用できます (これによりプロセスが高速化されるわけではありませんが、スケーラビリティが向上します:))
  2. ファイル システムにキャッシュする: ファイル システムにイメージをキャッシュできます。ただし、Heroku の Web プロセスは必ずしも同じファイル システムを共有するとは限らないため、新しい Web プロセスごとにこれを行う必要があります。
  3. ダウンロードの並列化: ダウンロードは現在順次行われています。並列化にはスレッド (複数のジョブ キューを使用した方がよいでしょうか?) を使用できます。
  4. 一般的なキャッシュ コンポーネント (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) を使用すると、パフォーマンスが確実に向上します。最終的な解決策は、さまざまなアプローチを組み合わせることです。

と思いますか?ご助力ありがとうございます!

4

0 に答える 0