java - 使用AWS S3作为监控平台的中间存储层

标签 java amazon-s3 architecture aws-sdk monitoring

我们有一个用例,我们希望使用 S3 临时推送基于事件的产品指标,直到它们加载到关系数据仓库 (Oracle) 中。这些指标将由 200 多个应用程序服务器发送到 S3,并根据每个服务器的每个指标保存在不同的文件中。某些指标的频率可能很高,例如每分钟发送应用程序服务器上的 Activity http session 数或每分钟的内存使用情况。一旦指标保存在 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 object api 或将 S3 文件夹挂载为 NFS shares并创建外部表。还有其他有效的阅读方式吗?

谢谢

最佳答案

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

详细回答您的问题:

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

2) 这不是 S3 的用途...它是整个对象写入...您可能想要创建一个添加大量小文件的系统...您可能不想这样做。更新文件(尤其是从多个线程)是危险的,每次更新都会替换整个文件...

3) 如果您必须这样做,请使用对象 api,一次处理一个文件,并在完成后删除它们...您最好构建一个基于队列的系统。

关于java - 使用AWS S3作为监控平台的中间存储层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51835061/

相关文章:

java - 如何在 RSS android 应用程序中查看来自多个源的提要

java - 我应该将 UI 对象声明为 "final"才能访问它吗?

java - 如何向用 Java 调用的 bash 脚本添加参数?

amazon-web-services - Ansible 和 s3 模块

amazon-web-services - 通过curl命令从本地目录或AWS S3导入rundeck中的作业

python - 使用公共(public)数据库在不同机器上分离 django 项目

c# - 成就/徽章架构

java - 如何根据日期对回收者 View 进行排序

amazon-s3 - 亚马逊S3 : Grant anonymous access from IP (via bucket policy)

database-design - SaaS 数据库设计 - 多个数据库? split ?