将AWS S3用作监视平台的中间存储层

时间:2018-08-14 06:34:11

标签: java amazon-s3 architecture aws-sdk monitoring

我们有一个用例,我们想使用S3临时推送基于事件的+产品指标,直到将它们加载到关系数据仓库(Oracle)中。这些度量标准将由200多个应用程序服务器发送到S3,并分别存储在每个服务器每个度量标准的不同文件中。例如,某些指标的频率可能很高。每分钟发送一次应用服务器上的活动http会话数或每分钟的内存使用量。一旦将度量标准保留在S3中,我们就会在数据仓库中放置一些内容来读取csv文件并将其加载到Oracle中。由于各种因素,包括成本,耐用性和复制性,我们考虑在队列(kafka / activemq / rabbit mq)上使用S3。我有一些与S3的读写机制有关的问题

  1. 对于基于事件的指标,我们如何写入S3,以便不阻止应用服务器?我看到Java SDK确实支持asynchronous writes。这样可以保证交货吗?
  2. 如何通过添加记录来更新在S3上创建的csv文件?根据我的阅读,我们无法更新S3对象。将监控指标定期推送到S3的有效方法是什么?
  3. 从S3读取数据时,性能并不是关键要求。将csv文件加载到Oracle中的优化方法是什么?包括使用Java sdk中的get对象api或将S3文件夹挂载为NFS shares以及创建外部表的几种方法。还有其他有效的阅读方式吗?

谢谢

1 个答案:

答案 0 :(得分:2)

仅供参考,每分钟200个服务器发送一个请求不是“高”。您可能会对此进行过度设计。 SQS简单,高度冗余/可用,并且可能比开发自己的解决方案更好地满足您的需求。

要详细回答您的问题:

1)不,您不能“保证交付”,尤其是对于异步S3操作。您可以设计可恢复的操作,但不能保证交付。

2)那不是S3的目的...那是整个对象的编写...您想创建一个系统,在其中添加许多小文件...您可能不想这样做。更新文件(尤其是从多个线程)很危险,每次更新都会替换整个文件...

3)如果必须执行此操作,请使用对象api,一次处理每个文件,并在完成后将其删除...最好建立一个基于队列的系统。 / p>