我使用Amazon S3存储我的其他Java应用程序中使用的图像。最近我不得不更新我的应用程序,以引入类别,标签等功能。目前,这已经解决为存储在S3中的JSON配置。这些是由其他应用程序提取并用作某种DB替代品:)。
其他改进,如评级和用户反馈仍有待完成。因此,使用一些Web服务迁移到DB +后端是下一个合乎逻辑的步骤。首先,由于额外的成本和维护问题,我没有使用像EC2实例那样的东西。
我需要一些建议,如何用最少的时间和精力来实现这一点。所以基本要求是: - 图像存储在s3上 - 网络服务提供获取类别列表的方法,类别中图像的s3链接列表,更新某些图像评级的方法,以及将来可能调整图像大小以提供尺寸的方法
我的想法是: - 使用s3已经存在。 - 添加一些Java托管来运行提到的webservice(我不喜欢使用EC2的想法,因为我需要花费更多时间进行配置,也许我在这里错了)。 - 使用“普通”javaee或一些轻型框架来获取大部分硬件。
我还考虑过使用一些图片托管服务,但我还没有找到类似的东西。或者也许有一些可以用于图像托管的开源解决方案。
对此的任何想法都将受到高度赞赏,因为在试图决定如何实施时,这只是让我疯狂。
谢谢!
答案 0 :(得分:0)
我认为S3和JSON可以继续为您工作,而无需进入完整的关系数据库系统。
如果您想象关系形式的解决方案,可以通过将表映射到S3中的目录,将行映射到S3中的各个文件以及每行中的列值作为存储在该文件中的JSON结构,将其转换为S3表示形式。在每个“行”= S3文件中存储少量数据可以让您轻松更新数据。由于转移到S3完全成功或失败,您的更新将保持一致。
要发现表中有多少行,您可以使用S3列表功能列出具有该表的公共前缀的文件。
使用S3控制台可以查看和浏览文件结构。
亚马逊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[]{};
}
}
}