2012-04-20 169 views
0

我使用Amazon S3來存儲在其他Java應用程序中使用的圖像。最近,我不得不更新我的應用程序,以引入類別,標籤等功能。目前這已被解析爲JSON配置存儲在S3中。這些被其他應用程序提取並用作某種數據庫替換:)。Web服務在S3上映像託管?

評分和用戶反饋等其他改進仍有待完成。因此,使用一些Web服務移動到DB +後端是下一個合理步驟。首先,我沒有使用類似EC2實例的東西,因爲額外的成本和維護問題。

我需要一些建議,如何用最少的時間和精力實現這一點。所以基本的要求是: - 圖像存儲在s3上 - web服務提供獲取分類列表的方法,分類中圖像的s3鏈接列表,更新某些圖像分級的方法,以及未來可能的一種調整圖像大小以提供尺寸的方法。

我的想法是: - 使用s3作爲它已經存在的地方。 - 添加一些Java託管來運行提到的web服務(我不喜歡使用EC2的想法,因爲需要更多的時間來配置,我願意花費,也許我錯了)。 - 使用「簡單」的javaee或一些輕量級框架來獲得大部分硬件。

我也考慮使用一些圖像託管服務,但我還沒有找到類似的東西。或者也許有一些可用於圖像託管的開源解決方案。

對此的任何想法都將得到高度讚賞,因爲這在試圖決定如何實施時只是讓我瘋狂。

謝謝!

+1

在我看來,你看起來像文件管理系統。我已經使用過這個..它有內置的API來獲取數據和搜索文檔和開源。 http:// www。alfresco.com/ – Phani 2012-04-20 09:58:08

+0

是的,我想過露天咖啡,但我想這對我來說會是一種矯枉過正。太重,只能存儲帶有評分和標籤的圖像。 – kodlan 2012-04-20 10:04:55

+0

Solr有沒有「圖像標記」包裝? – kodlan 2012-04-20 10:06:00

回答

0

我認爲S3和JSON可以繼續爲您工作,而不必去完整的關係數據庫系統。

如果您想象關係形式的解決方案,可以通過將表映射到S3中的目錄,將行中的單個文件映射到S3中的單個文件以及將每行中的列值作爲存儲在該文件中的JSON結構,將其轉換爲S3表示形式。在每個「行」= S3文件中存儲少量數據可讓您輕鬆更新數據。由於傳輸到S3或者完全失敗,您的更新將保持一致。

要發現表中有多少行,可以使用S3列表功能列出具有該表的通用前綴的文件。

S3控制檯使您能夠查看和瀏覽您的文件結構。

安全性可以由Amazon IAM提供。

自動備份可以通過使用生命週期規則複製到Amazon Glacier來完成。

如果使用此方法,您將獲得許多類似於關係的功能,但無需運行EC2服務器或使用Amazon RDS的額外開支和複雜性。

最後,編程所有這些都很簡單,因爲您之前的工作已經有了相應的工具。我懷疑你會有這樣的包來執行S3上所有必要的操作:

//---------------------------------------------------------------------  
    // Amazon S3 
    //---------------------------------------------------------------------  
     class S3 extends AmazonS3Client 
     {final String bucket; 
      S3(String u, String p, String Bucket) 
      {super(new BasicAWSCredentials(u, p)); 
      bucket = Bucket; 
      } 
      boolean put(String k, String v)  
      {try 
      {final ByteArrayInputStream b = new ByteArrayInputStream(v.toString().getBytes()); 
       putObject(bucket, k, b, new ObjectMetadata()); 
       setObjectAcl(bucket, k, CannedAccessControlList.PublicRead); // Has to be here to allow change to reduced redundancy 
       changeObjectStorageClass(bucket, k, StorageClass.ReducedRedundancy); 
       setObjectAcl(bucket, k, CannedAccessControlList.PublicRead); // Has to be repeated because it is now a new object again 
       return true; 
      } 
      catch(Exception e) {log("Cannot put "+bucket+"/"+k+" to S3 because "+e);} 
      return false; 
      } 
      String get(String k) 
      {try 
      {final S3Object f = getObject(bucket, k); 
       final BufferedInputStream i = new BufferedInputStream(f.getObjectContent()); 
       final StringBuilder s = new StringBuilder(); 
       final byte[]b = new byte[1024]; 
       for(int n = i.read(b); n != -1; n = i.read(b)) {s.append(new String(b, 0, n));} 
       return s.toString(); 
      } 
      catch(Exception e) {log("Cannot get "+bucket+"/"+k+" from S3 because "+e);} 
      return null; 
      } 
      String[]list(String d) 
      {try 
      {final ObjectListing l = listObjects(bucket, d); 
       final List<S3ObjectSummary> L = l.getObjectSummaries(); 
       final int n = L.size(); 
       final String[]s = new String[n]; 
       for(int i = 0; i < n; ++i) 
       {final S3ObjectSummary k = L.get(i); 
       s[i] = k.getKey(); 
       } 
       return s; 
      } 
      catch(Exception e) {log("Cannot list "+bucket+"/"+d+" on S3 because "+e);} 
      return new String[]{}; 
      } 
     } 
     }