2011-01-10 65 views
2

我們正在將內部部署應用程序遷移到Azure雲。內部公司用戶經常通過管理界面將全尺寸圖像上傳到我們的網站(現在將這些圖像發送到Azure blob存儲)。該網站負責在請求時創建正確的圖像大小。所以,現在是什麼情況的權利(對環境的前提下)是這樣的:針對Azure/CDN編程

1)用戶上傳全尺寸的文件。

2)當通過GetImage HTTP處理程序(即http://www.site.com/GetImage.aspx?imageid=15&height=100&width=100)請求較小的版本時,處理程序將檢查是否先前已創建該大小的該圖像的版本。如果是這樣,它將直接寫入響應流。如果不是,則需要一秒來調整其大小,將其保存到「/ iamges/cache」目錄並將調整大小的圖像寫入響應流。

3)該文件被請求在該大小它返回先前創建的圖像下的時間。

所以,我要實現相同的類型使用Azure和Blob存儲機制,但我有一對夫婦的憂慮:

1),我不能簡單地檢查,看看是否存在斑點。我必須先下載blob,然後調用FetchAttributes來查看它是否引發異常。但是,這樣做實際上會下載圖像。所以,這不是圖像請求的數量的兩倍(一個用於查看是否存在,另一個用於顯示給用戶)?

2)假設圖像不在大小,我需要它存在(即BLOB /images/cache/image_15_100_100.jpg不存在 - 編號15,100×100像素)。所以我曾經向CDN發出過請求,看看它是否存在。現在我必須下載一個5-10 MB的完整大小的映像(而不是從我們的內部文件系統快速讀取它),在內存中加載該5-10 MB映像,調整大小並重新上傳到CDN。這似乎很耗時間,特別是當我可以在一個請求中有10-15個這樣的圖像時。

我知道Azure是比較新的,但有任何接近「最佳實踐」爲這種類型的互動與Blob存儲?我可以考慮另一種方法嗎?這似乎是圖像大小調整的很多開銷,所以我想我必須缺少某些東西或忽略其他解決方案。

+0

是預定的可能的圖像尺寸請求或者是他們完全任意? – Omar 2011-01-10 15:27:34

回答

6

OK,我覺得有很多事情在這裏。我的答案是基於以下假設:

  • 這些圖片的最終用途是 顯示的網站
  • 上面提到的網站是 在Azure上
  • 運行時,您要使用CDN來加快 訪問這些圖象
  • 您正在使用的.Net存儲客戶端 庫

如果這些假設是錯誤的,讓我知道,我會適當地編輯我的答案。

  1. 你說得對,在.Net客戶端庫中沒有內置的方法,它允許你檢查一個blob是否存在。但是,通過執行.FetchAttributes()這實際上不下載圖像,它只是試圖retrieve the header information(當你列出所有在一個容器中的斑點很像),該斑點實際上並沒有下載到您撥打的.DownloadX()方法之一。

  2. 你的服務器端代碼有沒有必要談使用任何的CDN功能。它應該只是與你的圖像在blob存儲中談話,就像他們是任何舊的blob。您唯一需要使用CDN網址的時間是指定顯示頁面上圖像的路徑。

  3. 你不想你的網站有返回圖像流,你想讓它指向包含在圖像上的CDN的URL。 CDN將能夠處理比您可以構建的任何網站更多的負載。然後網站可以檢查blob是否存在,如果存在,只需返回URL。如果它沒有下載完整的圖像,請調整它的大小,保存它,然後返回URL。雖然從Blob存儲訪問圖像並不像閱讀它關閉本地磁盤的一樣快,它仍然是相當快,特別是對文件< 10MB就像你在說什麼。

  4. 大概某處有人指定地方,什麼尺寸的圖像在您的網站上使用。你能捕捉到它並生成調整大小的圖像嗎?