现在我们Disqus能够处理一个月80亿PV,每秒处理45000个请求。在把评论发送到很多不同的人的时候,我们学到了一些东西。众所周知 Disqus是用Django来处理绝大部分的web流量。在使用任何web框架之时,都要在开发速度 vs 性能、快速上手 vs 定制等之间做取舍。而Disqus更趋向于快速开发和容易上手,同时兼顾性能和灵活定制。
那么为什么web框架慢?
表面上,对于web框架的第一印象就是慢,因为在你的应用里有很多你不需要的代码,这是一个正常的印象。在实践中,缓慢往往不是由于膨胀的框架和语 言选择造成的。缓慢应该是由于你的请求在你的网络里与其他的服务进行通信的结果。在我们的场景下,这些’其他的服务’是 PostgreSQL、Redis、Cassandra和Memcached。缓慢的数据库查询和网络延迟通常会拖累像Django这样一个健壮框架的性 能。
为了规避这些延迟,人们使用各种各样的缓存技术。最常见的方法就是使用Django内建的cache库。
常见的应用缓存如下:
- data = cache.get('stuff')
- if data is None:
- data = list(Stuff.objects.all())
- cache.set('stuff', data)
- return data
如果你熟悉Django,这应该是个很常用的模式。这种形式的缓存是非常简单明了,并且在大多数情况下都适用。配合Memcached,它就足够快了,但是为了响应一个请求仍然有很多工作需要做。
处理每秒45000次请求
我们已经对处理很慢的东西做了缓存。不过在达到每秒45000次请求的时候仍然有很多工作需要做。我们可能会返回JSON,渲染HTML模版,简单 的解析HTML或者执行Django中间件。问题是,我们希望能够让这些工作更快返回,让Django来处理它擅长的:只处理唯一的数据。
在每秒45000次请求里面,有多少是唯一的?在这里面有多少请求的返回与下一个返回不一样?你真的需要在返回结果一样的时候做重复的工作吗?我们需要将整个HTTP返回缓存起来以是我们不用做重复工作。
介绍Varnish
Varnish是神马?Varnish是工作于负载均衡和Django后端之间,作为HTTP缓存层。这意味着它能够将整个HTTP返回缓存起来,让那些不唯一的请求不用命中Django服务器。
之前,Varnish使我们的一个黑盒子。我们安装并且最小程度的配置它,老实说,它工作的非常棒。但我觉得我们还能做的更多。
我花了一些时间来学习更多关于Varnish和我们能用得上的东西。随着时间的过去,我们能够让每秒数千次请求不用命中Django服务器。今天, 在每秒45000次请求里面,只有15000次请求会命中我们的应用服务器。剩下的被Varnish接收,它运行的非常快和有效。
因为这对我们非常有用,也是一段很好的学习经历,这个主题也成为了我近期的一些演讲的主题。
最近,我在芝加哥的DjangoCon大会上有一个演讲。这个演讲是面向不熟悉Varnish的人,用希望来鼓舞和驱动他们学习更多。对我而言,我 对这次演讲很兴奋,因为这个主题是很少被应用开发者提到的。这是一个我希望几年前就能听到的演讲,希望能够让人明白HTTP是如何工作,以及如何使用像 Varnish这样的工具来管理它的交互。(HTTP for Great Good)
在那之前,我出席了在纽约举办的VUG7(Varnish 用户组),并且深入介绍了一些解决我们问题的技巧。这次演讲里涉及到很多我们使用的Varnish配置语言。 (Caching is Hard: Varnish @ Disqus)
tl;dr
学习Varnish,它不会解决你全部的问题,但它值得你投入时间来学习它和评估它的价值。
如果这类型的东西很吸引你,并且你跟我一样也喜欢一周至少5天对着电脑吼叫,速度联系我们,我们在招人!
(编注:原文评论也精彩,值得一看。)
补充信息:
Disqus是一家第三方社会化评论系统,主要为网站主提供评论托管服务。WordPress、Blogger、Tumblr等第三方博客平台均提 供了Disqus第三方评论插件。Disqus的主要目标是通过提供功能强大的第三评论系统,将当前不同网站的相对孤立、隔绝的评论系统,连接成具有社会 化特性的大网。通过Disqus评论系统所具备的评论回复通知、评论分享和热文分享等社会化功能,网站主可以有效的提高网站用户的活跃度和流量。
用户使用Disqus,在不同网站上评论,无需重复注册账号,只需使用Disqus账号或者第三方平台账号,即可方便的进行评论,且所有评论都会存 储、保存在Disqus账号后台,方便随时查看、回顾。而且,当有用户回复自己的评论时,可以选择使用邮箱接收相关信息,保证所有评论的后续行为都可以随 时掌握。于此同时,Disqus将社交交友功能也很好的融入到了评论系统中,当用户在某一网站上看到有与自己类似观点的评论时,可对该评论的评论者进行关 注,关注后,该评论者以后的所有评论都会显示在自己的账号后台。
原文链接:http://blog.disqus.com/post/62187806135/scaling-django-to-8-billion-page-views