2012-04-20 126 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[]{}; 
      } 
     } 
     }