3 回答

TA貢獻1966條經驗 獲得超4個贊
如果可能,您不應將要提供的文件的全部內容存儲在內存中。取而代之的是,為數據獲取InputStream,并將數據分段地復制到Servlet OutputStream。例如:
ServletOutputStream out = response.getOutputStream();
InputStream in = [ code to get source input stream ];
String mimeType = [ code to get mimetype of data to be served ];
byte[] bytes = new byte[FILEBUFFERSIZE];
int bytesRead;
response.setContentType(mimeType);
while ((bytesRead = in.read(bytes)) != -1) {
out.write(bytes, 0, bytesRead);
}
// do the following in a finally block:
in.close();
out.close();
我確實同意toby,您應該改為“將它們指向S3 url”。
至于OOM異常,您確定它與提供圖像數據有關嗎?假設您的JVM具有256MB的“額外”內存,可用于提供圖像數據。在Google的幫助下,“ 256MB / 200KB” =1310。對于2GB的“額外”內存(目前這是一個非常合理的數量),可以支持10,000個并發客戶端。即便如此,1300個并發客戶端仍然是一個很大的數目。這是您經歷過的負載類型嗎?如果不是,則可能需要在其他地方查找OOM異常的原因。
編輯-關于:
在這種情況下,圖像可能包含敏感數據...
幾周前閱讀S3文檔時,我注意到您可以生成可以附加到S3 URL的過期密鑰。因此,您不必公開S3上的文件。我對這項技術的理解是:
初始HTML頁面具有指向您的Web應用程序的下載鏈接
用戶點擊下載鏈接
您的Web應用程序會生成一個S3 URL,其中包含一個密鑰,該密鑰將在5分鐘內過期。
使用步驟3中的URL將HTTP重定向發送到客戶端。
用戶從S3下載文件。即使下載時間超過5分鐘,此方法仍然有效-下載開始后,它就可以繼續完成。

TA貢獻1993條經驗 獲得超6個贊
您為什么不只將它們指向S3網址?從S3中獲取工件,然后通過您自己的服務器將其流式傳輸給我,這使使用S3的目的無法實現,后者是將帶寬和將圖像提供給Amazon的處理工作卸載了。
添加回答
舉報