2012-04-25 55 views
3

這個問題可能有點主觀,但我認爲它會提供一些有價值的具體信息和解決方案來代理到heroku和調試延遲問題。如何在Heroku上使用REST API後端優化服務靜態文件

我有一個使用Sinatra/Mongo構建的應用程序,它在api.example.com上公開了一個REST API。在Heroku Cedar上。通常,我通過www上的nginx提供靜態文件,並通過api子域向/ api發送代理請求,以避免跨域瀏覽器投訴。我有一個rackspace雲實例,所以我暫時將前端放在nginx上並設置代理。現在代理的延遲是非常可怕的,每3或4個請求需要1分鐘以上的時間,否則〜150ms。直接進入API(瀏覽器到api.example.com)的平均延遲時間約爲40毫秒。雖然我知道設置並不理想,但我沒有想到它會那麼糟糕。

我認爲這部分是由於從機架空間代理 - 服務器可能在西海岸 - 到亞馬遜ec2東部的heroku。我現在的想法是,獲得一個亞馬遜ec2實例,並將其代理到我的heroku應用程序將緩解這個問題,但我想以某種方式驗證這一點,而不是盲目猜測(它也更昂貴)。有沒有合理的方法來確定長延遲來自哪裏?此外,有關如何構建此應用程序的其他建議?我知道我可以在Heroku上提供靜態文件,但我不喜歡我的API服務於我的前端的想法,寧願它們能夠彼此獨立地擴展。

回答

3

由於您使用Heroku來運行您的API,我建議將您的靜態文件放入Amazon S3存儲桶中,名稱爲「myapp-static」,然後使用Amazon Cloudfront通過DNS代理您的靜態文件CNAME記錄(static.myapp.com)。

什麼好的使用S3在Rackspace公司是:

  • 您的文件會更快供您Heroku的上傳,因爲您的應用程序和存儲都在同一網絡(AWS)上。
  • S3是爲直接提供靜態文件而構建的,無需運行自己的服務器代理請求。

使用Cloudfront的好處在於,只要您想要(減少多個HTTP請求)並從距離用戶最近的端點提供文件,它就會緩存您的靜態文件。 EG:如果加利福尼亞州的用戶發出API請求並從您那裏獲得一個靜態文件,它將從AWS加利福尼亞服務器向您提供服務,而不是您的東海岸Heroku實例。

最後,您將在應用程序端執行的操作是向用戶發送LINK到您的REST API中的靜態資產(例如:http://static.myapp.com/images/background.png),這樣客戶端負責直接下載內容,並且將能夠儘可能快地下載資產。

相關問題