全球基础设施扩展

96 阅读2分钟

我一直致力于Shopify基础设施的全球扩张,我注意到在全球部署网络服务时至少有两种模式可以遵循,以改善延迟和可靠性。

单一真理源+边缘计算

你可以利用边缘计算(通过你自己的代理部署或CloudFlare)来缓存在单一地点运行的应用程序的响应。

挑战来自于这些边缘缓存响应的过期:一旦数据在真实源中发生变化,它必须告诉每个边缘缓存必须过期。

边缘有200多个存在点(Cloudflare的数字),再加上频繁的更新,会使这种多路复用变得很浪费(对源头的单一更新会向每个边缘扇出),或者你必须对你的缓存键非常精通。CloudFlare的Cache-Tag方式可能是一个不错的解决方案。

对于不经常更新的数据,这种解决方案可能很简单,而且非常经济,不需要像下面的其他路径那样自己复制数据库。

区域计算+复制

与之前的方式相比,我们不涉及边缘,而是部署区域计算。不同的是,区域计算假设只在每个大陆上有一些存在。像5-8个地区就足以覆盖世界上大部分地区。这与边缘方法不同,在边缘方法中你可能最终会有数百个存在点。

然后,你可以按地区分担你的工作负荷,但这是不可行的。在这种情况下,你可以选择将数据从你的单一真实来源复制到区域计算。这取决于你选择的数据存储,但通常这只是你的PostgreSQL/MySQL/ElasticSearch拓扑结构中的另一个副本。

这对于动态但只读的工作负载来说效果很好,比如可能需要从数据库中获取任意行的模板化页面--这些东西在边缘上很难做到。

值得一提的是,运行区域计算会变得更加昂贵,因为现在的存储成本是你使用的区域数量的倍数--除非你能以某种方式选择性地复制。

总结

每个应用程序和业务都是独特的,我提出的心理模型可能不适合每个人。请分享你的发现或你看到的其他路径。