Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 架构设计:web层如何知道工作层何时完成处理?_Amazon Web Services_Amazon S3_Architecture - Fatal编程技术网

Amazon web services 架构设计: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

我正在使用AmazonAWS构建一个用于教育目的的小应用程序。 web应用程序有两个部分:

  • 用于上载图像的表单
  • 显示上载图像的所有缩略图的网格
  • 应用程序的流程:
  • 用户打开网页
  • 用户选择要上载的图像
  • 向web层发送一个AJAX请求,用于生成预签名的S3URL
  • 收到URL后,启动AJAX PUT请求,并将图像直接上载到S3
  • 上传完成后,S3发送一条带有图像密钥的SQS队列消息
  • 其中一个工作人员收到该消息并创建缩略图
  • 图像处理完成后,worker将缩略图上传到S3
  • 此图说明了上述情况:


    现在,web层使用一个
    db.json
    文件来保存指向所有现有缩略图的链接。使用该文件,客户端网页将呈现网格中的所有缩略图

    问题是,web层如何知道何时更新包含新缩略图链接的
    db.json

    理想情况下,web层将完成以下任务:

  • 仅在需要时刷新
    json
    (如果web层刷新了
    json
    ,则它必须已被修改)
  • 更新后的
    db.json
    一旦被更新,就提供给用户(如果在时间
    x
    上添加了一个缩略图,而另一个用户在时间
    x+1
    上请求了该网页,则用户会知道新的缩略图)
  • 几种方法:
  • 对于每个
    index.html
    请求,列出S3存储桶并提供最新的缩略图(违反上一节的第1项)

  • 按时间间隔列出S3存储桶(违反这两项)

  • 请求预签名URL后设置计时器,并假设工作人员在计时器响起时处理完新图像(由于两个主要原因,这甚至不是一个解决方案;web层有多个实例,计时器可能在处理完成前响起)

  • 使用S3事件并设置lambda表达式,将
    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