用于 Thinks 的主数据库是 MongoDB。为了维护我们将要到期的布隆过滤器(用于浏览器缓存),我们使用 Redis ,因为它的高写入吞吐量。无状态应用程服务器(Orestes Servers)为后端功能提供接口(文件托管,数据存储,实时查询,推送通知,访问控制等),并处理动态数据的缓存一致性。它们从 CDN 拿到请求,CDN 也充当负载均衡器。网站前端使用基于 REST API 的 JS SDK 来访问后端,后端自动利用完整的 HTTP 缓存层次结构来让请求加速并保持缓存数据时刻最新。
负载测试为了在高负载下测试 Thinks 网上商城,我们在法兰克福的 t2.medium AWS 实例上使用 2 个应用服务器来进行负载测试。MongoDB 在两个 t2.large 实例上运行。使用 JMeter 构建负载测试并在 IBM soft layer 上的 20 个机器上运行,以模拟在 15分钟内,200,000 个用户同时访问和浏览网站。20% 的用户(40,000)被配置为执行额外的付款流程。
网上商城的负载测试设置
我们在支付实现中发现了一些瓶颈,例如,我们必须从库存的积极更新(使用 findAndModify实现)切换到 MongoDB 的部分更新操作(inc)。但是在这之后,服务器处理的负载只是精细地达到了平均请求延迟 5 ms。
JMeter 在负载测试期间输出:在 12 分钟内有 680 万个请求,平均延迟 5 ms
所有的负载测试组合生成了大约 1000 万个请求,传输了 460 GB的数据,伴随着 99.8% 的 CDN 缓存命中率。
负载测试后的仪表板概述
总结总之,良好的用户体验取决于三个支柱:前端,网络和后端的性能。
前端性能是我们认为最容易实现的,因为已经有很多工具和一些容易遵循的***实践。但仍然有很多网站不遵循这些***实践,完全没有优化过它们的前端。
网络性能对于页面加载时间来说,是最重要的因素,也是最难优化的。缓存和 CDN 是最有效的优化方法,但即使对于静态内容也要付出相当大的努力。
后端性能取决于单服务器性能和跨机器去分发工作的能力。水平可扩展性特别难以实现,必须从一开始就考虑。许多项目将可扩展性和性能作为事后处理,然而在它们的业务增长时会陷入大麻烦。
文献和工具建议