我首先想对我试图解决的问题进行一点概述。我的服务经常从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文件中不重复,然后存储新的或更新的帖子。
我可以有每个服务写入的数据等一些队列简单队列服务 (SQS),然后有一些工人是负责写帖子的S3文件?
我曾考虑过使用AWS Kinesis,但它只处理源数据 并将其转储到S3。我需要处理写入大型JSON文件的 以及做一些记录。
我不得不使用DynamoDB存储的职位(基本上做簿记)的概念,并 然后我会简单的让服务查询需要从DynamoDB一个 单一幻灯片中的所有数据,并存储到S3。这样服务将简单地将帖子发送到DynamoDB。
必须有一些聪明的方法来解决这个问题。
我不明白你为什么要使用s3。你为什么要将文件复制到s3然后从s3复制到你的网站?为什么不从数据库动态创建文件并使用本地缓存?这似乎是一个奇怪的设计,我不知道s3为它增加了什么 – Vorsprung
如果你坚持在S3上有一个大的结构化文件,那么更新它的最好方法是要求你的服务实例获得一个写在更新文件之前锁定。如果您愿意接受有关整个架构的建议,可能会有更好的设计来解决您的问题。 – grepe
@Vorsprung这几乎是我今天的战略,但我的问题是,我每月有超过5000万的请求戳我的API的数据。这个API有很好的缓存机制,但我也没有连接,因此我需要扩展API并以指数形式增加我的基础架构成本。 S3方法会将负载放在亚马逊上,并显着降低成本(每10,000个请求0.004美元)。它也会消除对我的API的依赖。 – raRaRa