处理巨大的流量 - 在线票务网站

时间:2013-09-14 21:42:59

标签: asp.net sql-server-2008 concurrency lucene.net high-traffic

Backgournd:

基于Asp.net 4.0的电子商务网站。在云设置上托管,使用专用的SQL Server 2008标准(16核)和32GB RAM。

用户互动:

  1. 用户访问该网站。
  2. 浏览不同类别(尚无静态内容)
  3. 将产品放入购物车
  4. 计时器最长可达15分钟。
  5. 结帐
  6. 登录/创建帐户
  7. 使用Authorize.Net网关处理付款(用户留在我们的网站上)
  8. 使用第三方SMTP提供商在注册/忘记密码/订单完成时拍摄电子邮件。
  9. 注意:在加载产品页面和放入购物车时检查票证的可用性。一旦他们在购物车中有产品,肯定会有一个计时器滴答15分钟。每25秒查询一次数据库以更新计时器。

    事件:

    好吧,伙计们,上周我们进行了一次大规模的拍卖,可能会为美国各地的粉丝们出售大约10000张门票。我们在无法控制的情况下看到了流量,在2-4小时内我们看到我们的网站上有大约1000个并发用户。

    问题:

    问题是我们有大约6个2GB的云服务器,由于流量巨大而迅速填满然后崩溃。然后我们不得不启动4gb,8gb和16gb服务器(每个2个)来处理流量。在大约15-20分钟的崩溃期间,网站没有响应,我们也看到数据库(专用的)触及100%的CPU使用率。

    • gb是服务器的RAM容量。

    框架:

    .net代码编写效率非常高,它只执行两个SQL语句来获取和构建需要在浏览器上呈现的所有必要数据。处理数据库的所有业务逻辑都是用存储过程编写的。没有游标,存储过程中没有动态sql。

    必需:

    1. 我无法理解网站崩溃的原因......我实施了大量的代码分析工具,不断告诉我们哪些代码部分花费的时间太长,或者哪个查询需要花费很多时间。当我们有更大的服务器(8GB或更多),那么网站运作顺利。

    2. 我是否应该在每次加载页面时不需要锤击数据库?喜欢静态页面怎么样? (虽然它需要我们将产品信息导出到html中,这很好)。

    3. 如果我将页面存储在Lucene.Net索引中怎么办?然后从它渲染?在这种情况下,I / O会花费很多吗?

    4. 我真的想要一些关于如何解决这个问题的专家意见?我们最初计划处理25k并发用户,但我们认为我们需要大量的大型云服务器来处理这些问题。

      由于

2 个答案:

答案 0 :(得分:1)

  

我是否应该消除每次加载页面数据库的需要?   喜欢静态页面怎么样? (虽然它需要我们出口   将产品信息转换成html即可。)

您无需将产品转换为html或任何第三方代码即可。 Asp.NET内置了对输出缓存的支持。

Web表单:

<%@ OutputCache Duration="60" VaryByParam="none" %>

MVC:

[OutputCache(Duration=60, VaryByParam="none")]
public ActionResult Index()
{
    return View();
}

其中持续时间是以秒为单位缓存页面的持续时间,而VaryByParam是充当该页面键的url参数。它将为每个提供的不同参数缓存页面,因此您通常不会为索引和ProductId留下特定产品页面。

但是你必须进一步调查,因为这可能不是你网站放缓的唯一原因。

答案 1 :(得分:0)

您的查询是什么样的?你说业务逻辑在存储过程中,但是你在这些过程中使用动态sql,游标或全文索引吗?所有这些都是高CPU的可能原因。

Lucene.NET只能帮助您使用sql全文索引,在这种情况下,它已被证明更有效。但只有在搜索是你的瓶颈的情况下。

缓存可以帮助热门网页,减少@Andre所提到的数据库负载,但要注意缓存命中/未命中率以及缓存的页面。例如,您可以在“类别”和“产品”页面上获得大量收益,但最终会在用户特定的购物车页面上使用更多内存以获得更少的收益(如果有)。

如果您在那些热门网页上显示实时票证可用性,如果您要访问数据库以获取该数字,那么这可能会对您造成很大伤害。尝试增加这些更新的延迟,并在此过程中稍后进行验证(如果是这种情况)。