原文:基于Django的Disqus如何支持每月80亿PV

本文由 伯乐在线 - 贱圣OMG 翻译。未经许可,禁止转载!
英文出处:Matt Robenolt。欢迎加入翻译小组

现在我们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

学习Varnish,它不会解决你全部的问题,但它值得你投入时间来学习它和评估它的价值。

如果这类型的东西很吸引你,并且你跟我一样也喜欢一周至少5天对着电脑吼叫,速度联系我们,我们在招人!

(编注:原文评论也精彩,值得一看。)

补充信息:

Disqus是一家第三方社会化评论系统,主要为网站主提供评论托管服务。WordPress、Blogger、Tumblr等第三方博客平台均提供了Disqus第三方评论插件。Disqus的主要目标是通过提供功能强大的第三评论系统,将当前不同网站的相对孤立、隔绝的评论系统,连接成具有社会化特性的大网。通过Disqus评论系统所具备的评论回复通知、评论分享和热文分享等社会化功能,网站主可以有效的提高网站用户的活跃度和流量。

用户使用Disqus,在不同网站上评论,无需重复注册账号,只需使用Disqus账号或者第三方平台账号,即可方便的进行评论,且所有评论都会存储、保存在Disqus账号后台,方便随时查看、回顾。而且,当有用户回复自己的评论时,可以选择使用邮箱接收相关信息,保证所有评论的后续行为都可以随时掌握。于此同时,Disqus将社交交友功能也很好的融入到了评论系统中,当用户在某一网站上看到有与自己类似观点的评论时,可对该评论的评论者进行关注,关注后,该评论者以后的所有评论都会显示在自己的账号后台。(摘自百度百科

关于作者: 贱圣OMG

基于Django的Disqus如何支持每月80亿PV(转)的更多相关文章

  1. 两年内从零到每月十亿 PV 的发展来谈 Pinterest 的架构设计(转)

    原文:Scaling Pinterest - From 0 To 10s Of Billions Of Page Views A Month In Two Years 译文:两年内从零到每月十亿 PV ...

  2. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  3. [系统开发] 一个基于Django和PureCSS的内容管理系统

    这是我刚开发的一套基于Django和PureCSS的内容管理系统,目标是优雅.简洁.实用,目前功能还在完善中. 系统参考了网上的教程,除了文章管理.搜索.RSS,还增加了类别管理.用户管理,以及评论管 ...

  4. python 全栈开发,Day95(RESTful API介绍,基于Django实现RESTful API,DRF 序列化)

    昨日内容回顾 1. rest framework serializer(序列化)的简单使用 QuerySet([ obj, obj, obj]) --> JSON格式数据 0. 安装和导入: p ...

  5. 在IIS上部署基于django WEB框架的python网站应用

    django是一款基于python语言的WEB开源框架,本文给出了如何将基于django写的python网站部署到window的IIS上. 笔者的运行环境: Window xp sp3 IIS 5.1 ...

  6. 基于Django+celery二次开发动态配置定时任务 ( 二)

    一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...

  7. 基于django的个人博客网站建立(三)

    基于django的个人博客网站建立(三) 前言 网站效果可点击这里访问 今天主要完成的是文章在页面的显示以及评论,留言 具体内容 首先我希望主页面是显示我的所有文章,于是在主页面的视图函数中返回了所有 ...

  8. 开发基于Django和Websocket的堡垒机

    WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...

  9. mac 下基于firebreath 开发多浏览器支持的浏览器插件

    mac 下基于firebreath 开发多浏览器支持的浏览器插件 首先要区分什么是浏览器扩展和浏览器插件;插件可以像本地程序一样做的更多 一. 关于 firebreath http://www.fir ...

随机推荐

  1. 利用pandas进行数据分析之一:pandas数据结构Series

    Series是一种类似于一维数组的对象,又一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即是索引)组成. 可以将Series看成是一个定长的有序字段,因为它是索引值到数据值的一个映射. ...

  2. SVN钩子 之 pre-commit

    http://files.cnblogs.com/lyl6796910/pre-commit%E9%92%A9%E5%AD%90.rar 我用的是Windows版本的SVN:VisualSVN Ser ...

  3. PHP经常使用正則表達式汇总

    1.    平时做站点常常要用正則表達式,以下是一些解说和样例,仅供大家參考和改动使用:  2.    "^\d+$" //非负整数(正整数 + 0)  3.    "^ ...

  4. C#之正则表达式验证

    /** 匹配身份证号 规则: 15位纯数字或者18位纯数字或者17位数字加一位x */ var regex = new System.Text.RegularExpressions.Regex(@&q ...

  5. atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31

    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerExceptionv2 q31 1. #--现象 java.lang. ...

  6. Atitit.数据库分区的设计 attilax  总结

    Atitit.数据库分区的设计 attilax  总结 1. 分区就是分门别类的文件夹 (what)1 2. 分区的好处(y)1 3. 分区原则(要不要分区,何时分区)how2 4. 主要的分表类型有 ...

  7. C++语言基础(8)-引用

    (重要)使用引用的一些注意点: 1.引用不能绑定临时数据,也不能绑定任何无法获取内存地址的常量,表达式,或值,常引用除外. 第一种写法:(错误) int func_int(){ ; return n; ...

  8. MySql多对多关系中外键的应用

    业务需求:用户表r_user保存用户名等信息.现需要给每个用户设置工作基地,一个用户可以有多个工作基地,多个用户也可以有一个工作基地,即多对多关系.(外键,若有两个表A,B,C是A的主键,而B中也有C ...

  9. mysql之log-slave-updates参数

    1.引言 使用Mysql的replication机制实现主从同步时,其是由三个线程实现了,主库一个I/O线程,从库一个I/O线程和一个SQL线程.配置时主库需要开始bin-log参数,即在配置文件中添 ...

  10. abp发布需要注意的问题

    1>报system.object不存在. 需要从相关目录下面复制System.Runtime.dll eg:C:\Program Files (x86)\Reference Assemblies ...