2012-07-04 51 views
0

我是一個Rails新手,所以我不知道我應該如何去建立這個,並希望得到一些輸入。使用Rails 3 + Heroku實時遠程圖像緩存策略?

基本上,我想向我的應用程序的用戶展示一些圖像(具有可預測的文件名)。我會將它們從遠程主機上取下來,但當然,我不希望爲每個請求熱鏈接,所以我想以某種方式將它們緩存在我的服務器上。理想情況下,當有人第一次請求一個圖像時,它會從遠程服務器上下載並呈現給用戶,並且對於後續對同一圖像的請求,它將像其他任何靜態資源一樣被提供和緩存。

通常我只是將圖像下載到本地文件系統,在public文件夾中的某處,但由於我在Heroku上運行此應用程序,因此我沒有持久性寫入訪問權限。在我的情況下處理所有這些會是一個很好的策略?沒有在代碼中尋找完整的解決方案,只是一些指針。謝謝!

+0

你想下載後編輯它們嗎?我想你可以使用類似Redis的東西臨時存儲它們../two_cents – Trip

+0

你可以將它們存儲在S3中嗎? –

回答

1

以下是我想接近它:

首先,無論你會引用這些圖像中的一個,而不是調用一個控制器上的行動在自己的應用程序。然後,寫控制器動作做到以下幾點:

  1. 給定一個文件名,
  2. 檢查圖像中的S3存儲桶的存在;如果是,請將S3鏈接返回給它。
  3. 如果沒有,請下載並存儲到S3;然後將S3鏈接返回給它。

既然你在Heroku上,更好的方法可能是讓這個動作啓動delayed_job來檢索圖像(並將其存儲在S3中)。然後,在您的視圖中,有一個輪詢機制來定期詢問控制器是否可以操作圖像是否可用。如果不是,則顯示加載圖標,如果是,則顯示圖像(指向S3上圖像的URL)。在等待圖像被緩存的時候,通過這條路線不會捆綁你的一個dynos。

當然,如果您可以預先緩存所有這些遠程圖像,事情可以簡化。也許是下載所有這些圖像並將它們存儲在S3中的耙子任務。

希望這會有所幫助。

+0

謝謝,我會嘗試這樣的事情! –

+0

該解決方案對性能不太好。如果您首先必須檢查每個圖像的s3圖像是否存在,即使緩存,您也會看到每個圖像的一些延遲。預緩存建議可能是一個更好的主意。 –