2017-09-27 16 views
-1

我首先想对我试图解决的问题进行一点概述。我的服务经常从Instagram,Twitter等不同来源获取帖子,我想将帖子存储在S3上的一个大型JSON文件中。文件名将如下所示:{slideshowId}_feed.json经常更新Amazon S3上的大型JSON文件和潜在的写入冲突

我的网站将以幻灯片形式显示帖子,幻灯片将每分钟轮询一次S3文件以获取最新数据。它甚至可能轮询另一个文件,例如{slideshowId}_meta.json,它具有时间戳,从大文件更改时节省带宽。

我想将帖子保留在单个JSON文件中的原因主要是为了节省成本。我可以将每个源文件作为自己的文件,例如{slideshowId}_twitter.json,{slideshowId}_instagram.json等,但然后幻灯片将需要每分钟发送GET请求到每个来源,从而增加成本。我们正在谈论成千上万的幻灯片,因此成本需要很好地扩展。


现在回到问题。根据我需要扩展的程度,可能有不止一个运行的服务实例检查Instagram和其他新帖的来源。问题在于一个服务覆盖S3文件的风险,而另一个服务可能已经写入到S335文件。

需要将帖子保存到JSON文件的每个服务首先必须获取该文件,对其进行处理并检查新帖子是否在JSON文件中不重复,然后存储新的或更新的帖子。


  1. 我可以有每个服务写入的数据等一些队列简单队列服务 (SQS),然后有一些工人是负责写帖子的S3文件?

  2. 我曾考虑过使用AWS Kinesis,但它只处理源数据 并将其转储到S3。我需要处理写入大型JSON文件的 以及做一些记录。

  3. 我不得不使用DynamoDB存储的职位(基本上做簿记)的概念,并 然后我会简单的让服务查询需要从DynamoDB一个 单一幻灯片中的所有数据,并存储到S3。这样服务将简单地将帖子发送到DynamoDB。

必须有一些聪明的方法来解决这个问题。

+0

我不明白你为什么要使用s3。你为什么要将文件复制到s3然后从s3复制到你的网站?为什么不从数据库动态创建文件并使用本地缓存?这似乎是一个奇怪的设计,我不知道s3为它增加了什么 – Vorsprung

+1

如果你坚持在S3上有一个大的结构化文件,那么更新它的最好方法是要求你的服务实例获得一个写在更新文件之前锁定。如果您愿意接受有关整个架构的建议,可能会有更好的设计来解决您的问题。 – grepe

+0

@Vorsprung这几乎是我今天的战略,但我的问题是,我每月有超过5000万的请求戳我的API的数据。这个API有很好的缓存机制,但我也没有连接,因此我需要扩展API并以指数形式增加我的基础架构成本。 S3方法会将负载放在亚马逊上,并显着降低成本(每10,000个请求0.004美元)。它也会消除对我的API的依赖。 – raRaRa

回答

0

这是我会做:

enter image description here

  • 的室壁运动流将需要有足够的能力从你的所有饲料生产者处理写入操作。对于约25 /月,你可以做到每秒2000次写入。
  • 只要您的信息流中有足够的新项目,就会简单地触发Lambda。您可以配置触发器以等待1000个新项目,然后运行Lambda以从流中读取所有新项目,处理它们并将它们写入REDIS(ElastiCache)。你的账单应该远低于10个月。
  • 智能密钥选择将负责重复项目。如果需要,也可以将项目设置为过期。根据你的描述,你的项目应该可以放入内存中,如果你需要更多的读取和/或可靠性容量,你可以添加实例。运行两个具有足够内存的REDIS实例来处理数据将花费大约26个月的时间。
  • 您的服务将使用REDIS而不是S3,因此您只需支付数据传输费,并且仅在您的服务不在AWS上时(< 10 /月?)。
+0

假设有人将幻灯片显示放在非常受欢迎的网站上的iframe上,其中有10,000个并发用户。他们都将请求直接发送到Redis集群?你如何为用户提供帖子? – raRaRa

+0

嗯......也许我误解了那个问题。我认为这是你已经发现的部分,我只是建议用REDIS替换现有基础设施的S3,但是你想用S3作为分配系统。那么通过一切手段 - 只需运行一些能够读取REDIS结果并将其写入S3(然后您不需要锁定)的东西即可。 – grepe

0

确定为您的使用情况

  • 有许多用户对于一个大的S3文件
  • 文件经常更新
  • 文件路径(理想)应该是一致的,使它更容易得到和
  • S3的文件通过在EC2的过程中产生和每分钟更新一次高速缓存

如果GET速度低于每秒800,那么AWS对此感到满意。如果没有,那么你将不得不与他们谈话,也许找到另一种方式。见http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html

文件更新将是原子等有带锁紧等见http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html 推测是否有更新“十一五”期间,用户的请求,他们将看到老版本没有问题。这种行为对双方都是透明的

文件更新“最终”是一致的。正如你想保持url一样,你将在s3中更新相同的对象路径。

如果您正在跨地区服务,那么变得一致所需的时间可能会成为问题。对于同一地区,似乎需要几秒钟的时间。 AWS对此似乎并不十分开放,所以最好根据自己的使用情况进行测试。由于您的文件很小,每60秒更新一次,我会想象它会没事的。您可能必须在您的API描述中假设更新实际发生的时间超过了60秒,因此需要考虑此问题

由于ec2和s3运行在AWS基础架构的不同部分(ec2在VPC中,而s3在公共https)您将支付从ec2到s3的转账费用

我会想象您将通过s3服务s3文件“假装成网站”功能。你也必须配置它,但这是微不足道的

+0

请注意,在EC2上运行的服务将是异步的。假设它从Twitter获取200个帖子,并且Twitter只会一次给你50个帖子。所以我的服务会对Twitter进行4次异步调用。无法保证首先完成哪个请求。这里的问题是两个请求可能会同时完成。 第一个请求提取S3文件并添加帖子 第二个请求执行相同操作 第一个请求写入更改 第二个请求写入更改 这里第二个请求将覆盖第一个请求的更改。 – raRaRa

+0

不需要。在主机上通过twitter获取您的无用数据。当它更新时,将其刷新到s3。切勿将s3拉回运行twitter扫描仪的ec2。总是写,永远不会读。 s3副本仅用于从用户读取 – Vorsprung

+0

但是,我将如何避免重复的数据,例如Twitter的两个回复可能包括同一篇文章。 (这就是为什么我需要一些记录)。除非客户端处理这些。那么你基本上每分钟都会有EC2服务从Twitter获取所有帖子?这是API速度限制可能对我造成严重问题的地方(特别是在Instagram上,每小时5000或每分钟83)。我可能还需要做额外的请求才能获得发布的评论,参考高分辨率视频等,因此我可能很快就会很快用完电话。 – raRaRa