0

我使用 Amazon S3 存储在我的其他 Java 应用程序中使用的图像。最近我不得不更新我的应用程序以引入类别、标签等功能。目前,这已解决为存储在 S3 中的 JSON 配置。这些由其他应用程序获取并用作某种数据库替换:)。

评级和用户反馈等其他改进仍有待完成。所以转移到带有一些 web 服务的 DB + 后端是下一个合乎逻辑的步骤。首先,由于额外的成本和维护问题,我没有使用过 EC2 实例之类的东西。

我需要一些建议如何以最少的时间和精力来实现这一点。所以基本要求是: - 图像存储在 s3 上 - Web 服务提供获取类别列表的方法、类别中图像的 s3 链接列表、更新某些图像评级的方法,以及将来可能将图像调整为提供的尺寸的方法.

我的想法是: - 使用 s3,因为它已经存在。- 添加一些 Java 托管来运行提到的 Web 服务(我不喜欢使用 EC2 的想法,因为我愿意花费更多时间进行配置,也许我在这里错了)。- 使用“普通”javaee 或一些轻量级框架来获得大部分硬件。

我也考虑过使用一些图像托管服务,但我还没有找到类似的东西。或者也许有一些可用于图像托管的开源解决方案。

对此的任何想法都将受到高度赞赏,因为这只是让我在试图决定如何实施时发疯。

谢谢!

4

1 回答 1

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[]{}; 
           }
         }
       }
于 2013-09-03T20:30:14.007 回答