背景:
基于 Asp.net 4.0 的电子商务网站。托管在具有专用 SQL Server 2008 标准(16 核)和 32GB RAM 的云设置上。
用户交互:
- 用户访问网站。
- 浏览不同的类别(还没有静态内容)
- 将产品放入购物车
- 计时器最多计时 15 分钟。
- 查看
- 登录/创建帐户
- 使用 Authorize.Net 网关处理付款(用户停留在我们的网站上)
- 使用第三方 SMTP 提供商在注册/忘记密码/订单完成时发送电子邮件。
注意:当产品页面加载和放入购物车时,会检查门票的可用性。一旦他们在购物车中有产品,肯定会有一个计时器计时 15 分钟。每 25 秒查询一次数据库以更新计时器。
事件:
好吧,伙计们,我们上周进行了一次大促销,可能为美国各地的粉丝出售了大约 10000 张门票。我们看到了无法控制的流量,在 2-4 小时内,我们看到我们的网站上有大约 1000 名并发用户。
问题:
问题是我们有大约 6 个 2GB 的云服务器,这些服务器很快就被填满,然后由于巨大的流量而崩溃。然后我们必须启动 4gb、8gb 和 16gb 服务器(各 2 个)来处理流量。在大约 15-20 分钟的崩溃期间,网站变得无响应,而且我们看到数据库(专用数据库)的 CPU 使用率达到 100%。
- gb 是服务器的 RAM 容量。
框架:
.net 代码编写得非常高效,它只执行两条 SQL 语句来获取和构建所有需要在浏览器上呈现的必要数据。处理数据库的所有业务逻辑都写在存储过程中。没有游标,存储过程中没有动态 sql。
必需的:
我无法理解网站崩溃的原因...我实施了很多代码分析工具,它们不断告诉我们哪个代码部分花费了太长时间或哪个查询花费了太多时间。当我们拥有更大的服务器(8gb 或更多)时,网站运行顺畅。
我应该消除每次页面加载都需要锤击数据库吗?比如拥有静态页面怎么样?(虽然它需要我们将产品信息导出到 html 中,这很好)。
如果我将页面存储在 Lucene.Net 索引中呢?然后从中渲染?在这种情况下,I/O 会花费很多吗?
我真的想要一些关于如何解决这个问题的专家意见?我们最初计划处理 25,000 个并发用户,但我们发现我们需要大量的大型云服务器来处理这个问题。
谢谢