Amazon web services 架构设计:web层如何知道工作层何时完成处理?
我正在使用AmazonAWS构建一个用于教育目的的小应用程序。 web应用程序有两个部分:Amazon web services 架构设计:web层如何知道工作层何时完成处理?,amazon-web-services,amazon-s3,architecture,Amazon Web Services,Amazon S3,Architecture,我正在使用AmazonAWS构建一个用于教育目的的小应用程序。 web应用程序有两个部分: 用于上载图像的表单 显示上载图像的所有缩略图的网格 应用程序的流程: 用户打开网页 用户选择要上载的图像 向web层发送一个AJAX请求,用于生成预签名的S3URL 收到URL后,启动AJAX PUT请求,并将图像直接上载到S3 上传完成后,S3发送一条带有图像密钥的SQS队列消息 其中一个工作人员收到该消息并创建缩略图 图像处理完成后,worker将缩略图上传到S3 此图说明了上述情况: 现在,we
现在,web层使用一个
db.json
文件来保存指向所有现有缩略图的链接。使用该文件,客户端网页将呈现网格中的所有缩略图
问题是,web层如何知道何时更新包含新缩略图链接的db.json
理想情况下,web层将完成以下任务:
json
(如果web层刷新了json
,则它必须已被修改)db.json
一旦被更新,就提供给用户(如果在时间x
上添加了一个缩略图,而另一个用户在时间x+1
上请求了该网页,则用户会知道新的缩略图)index.html
请求,列出S3存储桶并提供最新的缩略图(违反上一节的第1项)
HTTP GET
请求发送到我的web层上的特殊端点(也不是解决方案,因为此请求将从负载平衡器定向到单个实例,其他实例如何?)
我不知道如何解决这个问题。 你建议我做什么 编辑
由于这是一个教育练习,DB服务超出范围。DB.json文件是否存储在其中一个web服务器上?如何跨多个web服务器协调对db.json文件的更新?如何防止多个工作服务器同时更新db.json文件并相互攻击 我建议将缩略图存储在平面文件以外的其他位置。DynamoDB将是一个很好的存储此文件的地方。PostgreSQL或RDS上的MySQL版本也可以使用 为了将JSON数据提供给包含缩略图列表的UI,我将创建一个查询数据库并呈现JSON数据的动态页面。这还允许您实现诸如数据分页之类的功能,一旦图像集变得非常大,这将是一项要求
为了防止web层因JSON数据请求而过载,我将在web层前面放置一个CDN,如CloudFront或CloudFlare。为了防止数据库因缩略图列表的查询而过载,我将在web层和数据库之间实现一个缓存层(Redis)。这个问题有点可笑,因为将所有内容存储在一个JSON文件中的想法会不断更新,但解决方案似乎足够明显。。。另一个S3事件通知 任何时候,只要你有一个系统,给你的神奇礼物的事件,解除你必须投票的任何事情,你会疏忽忽视的价值带来的 如果每个web服务器都有自己的json文件副本并需要更新,那么这也很容易解决 S3事件在缩略图创建时触发(S3通知可以匹配前缀,而不是整个bucket)>S3事件发布到SNS主题>SNS主题扇出到多个SQS队列,每个web服务器一个队列。web服务器上的进程使用单个线程订阅该服务器的队列,并且每次传入消息时,本地工作进程都会在该服务器上修改json文件。每个服务器都会获得每个通知的副本
我有一个旧的遗留系统,通过将模板更改提交到subversion,然后在服务器上执行
svn up
,网站模板更改(不是代码,只是模板)就可以生效。因为这个subversion repo就是为了这个目的而存在的,所以web服务器直接从check-out目录读取模板。虽然听起来很奇怪,但多年来它一直服务得很好。我最近通过建立一个类似于上面描述的安排来增强它,但是没有S3。“提交后钩子”在提交任何内容时在subversion服务器上触发一个shell脚本。反过来,这会将有关更改文件的消息发布到SNS主题,该主题扇出到多个SQS队列——每个web服务器一个队列,每个服务器上的一个简单脚本侦听该服务器的SQS队列。每个服务器有一个侦听器和一个线程,因此不存在并发问题。侦听器在新提交的文件上运行“svn up”,删除队列消息,然后侦听下一个消息。实时事件扇出,为什么不呢?在本练习中,DB服务不在范围之内。当然,json
不能存储在每个web服务器中——这是我的结论之一。我想把json
文件也存储在S3中,并设置一个lambda函数,一旦新的缩略图放入bucket中,它就会更新。通过这种方式,您可以访问web