代码之家  ›  专栏  ›  技术社区  ›  KMX

应对巨大流量-在线票务网站

  •  2
  • KMX  · 技术社区  · 11 年前

    背景:

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

    用户交互:

    1. 用户访问该网站。
    2. 浏览不同的类别(还没有静态内容)
    3. 将产品放入购物车
    4. 计时器的滴答声长达15分钟。
    5. 结账
    6. 登录/创建帐户
    7. 使用Authorize.Net网关处理付款(用户留在我们的网站上)
    8. 使用第三方SMTP提供商在注册/忘记密码/订单完成时发送电子邮件。

    注意:当加载产品页面和将其放入购物车时,会检查是否有票。一旦他们的购物车里有了产品,计时器肯定会计时15分钟。每隔25秒查询一次数据库以更新计时器。

    事件:

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

    问题:

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

    • gb是服务器的RAM容量。

    框架:

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

    必修的:

    1. 我无法理解网站崩溃的原因。。。我已经实现了很多代码分析工具,它们不断告诉我们哪个代码部分花费了太长时间,或者哪个查询花费了太多时间。当我们有更大的服务器(8gb或更多)时,网站就可以顺利工作了。

    2. 我是否应该消除每次加载页面都要敲打数据库的需要?比如有静态页面怎么办?(尽管它需要我们将产品信息导出到html中,这很好)。

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

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

    谢谢

    2 回复  |  直到 4 年前
        1
  •  1
  •   Ortiga    11 年前

    我是否应该消除每次加载页面都要敲打数据库的需要? 比如有静态页面怎么办?(尽管需要我们出口 将产品信息转换为html,这很好)。

    您不需要将产品转换为html,也不需要将任何第三部分代码转换为html。Asp.NET内置了对输出缓存的支持。

    网络表单:

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

    MVC模式:

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

    其中,Duration是以秒为单位缓存页面的持续时间,VaryByParam是用作该页面键的url参数。它将缓存所提供的每个不同参数的页面,因此通常不会为索引留下任何内容,而为特定的产品页面留下ProductId)

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

        2
  •  0
  •   Mark J Miller    11 年前

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

    只有当您使用sql全文索引时,Lucene.NET才能提供帮助,在这种情况下,它被证明更有效。但只有在搜索成为瓶颈的情况下。

    正如@Andre所说,缓存可以帮助流行页面并减少数据库负载,但要注意缓存命中率和缓存的页面。例如,你会在类别和产品页面上获得很多实惠,但最终你会在用户特定的购物车页面上使用更多的内存,而获得更少的好处(如果有的话)。

    如果你在那些受欢迎的页面上显示实时门票可用性,如果你点击数据库获取这个数字,这可能会对你造成很大伤害。尝试增加这些更新的延迟,如果是这样的话,请在稍后的过程中进行验证。