基于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(转)的更多相关文章
- 两年内从零到每月十亿 PV 的发展来谈 Pinterest 的架构设计(转)
原文:Scaling Pinterest - From 0 To 10s Of Billions Of Page Views A Month In Two Years 译文:两年内从零到每月十亿 PV ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- [系统开发] 一个基于Django和PureCSS的内容管理系统
这是我刚开发的一套基于Django和PureCSS的内容管理系统,目标是优雅.简洁.实用,目前功能还在完善中. 系统参考了网上的教程,除了文章管理.搜索.RSS,还增加了类别管理.用户管理,以及评论管 ...
- python 全栈开发,Day95(RESTful API介绍,基于Django实现RESTful API,DRF 序列化)
昨日内容回顾 1. rest framework serializer(序列化)的简单使用 QuerySet([ obj, obj, obj]) --> JSON格式数据 0. 安装和导入: p ...
- 在IIS上部署基于django WEB框架的python网站应用
django是一款基于python语言的WEB开源框架,本文给出了如何将基于django写的python网站部署到window的IIS上. 笔者的运行环境: Window xp sp3 IIS 5.1 ...
- 基于Django+celery二次开发动态配置定时任务 ( 二)
一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...
- 基于django的个人博客网站建立(三)
基于django的个人博客网站建立(三) 前言 网站效果可点击这里访问 今天主要完成的是文章在页面的显示以及评论,留言 具体内容 首先我希望主页面是显示我的所有文章,于是在主页面的视图函数中返回了所有 ...
- 开发基于Django和Websocket的堡垒机
WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...
- mac 下基于firebreath 开发多浏览器支持的浏览器插件
mac 下基于firebreath 开发多浏览器支持的浏览器插件 首先要区分什么是浏览器扩展和浏览器插件;插件可以像本地程序一样做的更多 一. 关于 firebreath http://www.fir ...
随机推荐
- ibatis 动态列查询问题解决
http://hi.baidu.com/java513/blog/item/ace7c516c400390d4a90a7c8.html 这个问题是因为你查询的sql的列是变化的,但是ibati ...
- 未能加载文件或程序集“WebGrease, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
方法一:在web.config的configuration接点中添加,最好是添加在configuration节点的最后 <runtime> <assemblyBinding xmln ...
- 自己动手开发更好用的markdown编辑器-06(自动更新)
这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/05/12/hexomd-06/ 文章目录 1. 自动更新方案 2. 实现 ...
- Java线程安全同步容器
线程安全同步容器(使用 synchronized关键字) 1.ArrayList->Vector,Stack 2.HashMap->HashTable(key.value不能为null) ...
- 集成学习1-Boosting
转自http://blog.csdn.net/lvhao92/article/details/51079018 集成学习大致分为两类,一类串行生成.如Boosting.一类为并行化.如Bagging和 ...
- oracle的一些问题
好久时间没有用oracle,这次因为有个项目的需要,又重新温习了一下oracle. 我使用的oracle的版本是windows oracle 11g_R2. 首先先说一下安装.这个没有太大的问题,主要 ...
- java-MapDemo
Map数据结构的使用 package com.example; import java.util.HashMap; import java.util.Map; /** * MapDemo.java D ...
- PHP下载远程文件的3种方法以及性能考虑
今天在做导出Excel的时候,总是要测试导出的Excel文件,频繁的下载和打开,很麻烦 就想着写段代码一气呵成 服务端导出Excel==>下载Excel文件到本地==>并打开的操作. 这 ...
- sqrt函数实现(神奇的算法)
我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...
- SlidingMenu——使用前的配置
一: 首先下载lib:SlidingMenu.然后将起导入eclipse中,然后将其clean一下,重新生成R文件. 二: 因为SlidingMenu依赖ActionBarSherlock,所以需要下 ...