【问题标题】:How does distributed architecture work for serving out dynamic and static content分布式架构如何提供动态和静态内容
【发布时间】:2017-02-17 09:39:06
【问题描述】:

这是我的场景。

我有一个地图切片服务器,可以创建数千个不同缩放级别的地图切片。目前这是在一个 EC2 实例上运行的。我想坚持使用 AWS。

当前工作流程 - 一个瓦片的请求进来,nginx 检查该瓦片是否存在于缓存中。如果该图块存在,它将提供它。如果它不存在,它将请求传递到一个切片创建脚本,该脚本既为用户提供新创建的切片,又将其缓存以供将来使用。当需要创建大量图块时,这开始陷入困境。

我想把它转移到一个更加分布式的架构中,其中瓦片从 s3 提供,如果它们不存在,它们会被任意数量的 celery 任务渲染,创建瓦片并将它们缓存到 s3。

我最初的想法是为事物的切片创建端设置 ELB,为切片缓存设置 s3。问题是如何在将切片发送到 ELB 进行渲染之前检查 s3 中是否存在切片。 我尝试使用try_files 指令在ELB 前面设置nginx 来检查s3。这不起作用,尽管我能够在 s3 中代理图块。

我的问题是这样的用例通常如何在 AWS 架构中进行管理?一个请求进来,检查一个存储位置,如果它不存在,它被创建并返回。

谢谢。

【问题讨论】:

  • 请求的图块已经被渲染和存储的可能性有多大?似乎这个问题的答案会影响解决方案的可行性和效率。
  • 取决于缩放级别和空间位置。我们正在预缓存低级切片,因此 z0-12 被缓存并可作为静态资产使用。当请求获得更高的缩放级别时,将开始创建平铺并存储以供将来使用。这样,经常访问的区域就已经被缓存了。我现在遇到的问题是单台机器上的缓存使一切陷入困境,我无法提供静态图块。

标签: amazon-web-services amazon-s3 distributed-computing amazon-elb


【解决方案1】:

我并不完全清楚您是如何配置 Nginx 的,但听起来您需要将其配置为始终命中动态后端进程,该进程可以检查地图图块是否存在。如果该图块不存在,该过程将创建该图块,然后返回该图块。您可以缓存 HTTP 响应,这样该过程就不会因为反复检查同一个图块是否存在而陷入困境。

如果我从头开始这样的项目,我可能会创建一个数据库来存储有关每个地图图块的信息,也许是 DynamoDB。该数据库将包含每个创建的图块的记录。当您收到请求时,您首先执行数据库查找以获取磁贴的 S3 位置。如果您没有返回数据库记录,则创建磁贴,将其上传到 s3,更新您的数据库表,然后返回磁贴。您可以在负载均衡器后面运行大量此类服务器,并随着负载的增加而增加更多。

我会使用 Redis (ElastiCache) 来存储数据库查询结果,以加快对同一磁贴的后续请求。我还会将 CloudFront 或 CloudFlare 之类的 CDN 放在整个事物的前面,并真正加快缓存,这样对同一图块的后续请求甚至不会访问您的服务器。

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多