基于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 ...
随机推荐
- 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记
REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...
- 关于行内元素之间有空隙的问题,例如span与input之间
问题如图: 想要的是下面的效果,而却出现上面的效果,解决方法如下: 对于行元素span或者input来说 很多人会用inline-block来显示他们,但是往往发现 中间会留一段小空隙 , 其实这个 ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- JaunsGraph数据模型
JanusGraph采用邻接表(adjacency list)的方式存储图,也即图以顶点(vertex)和其邻接表组成.邻接表中保存某个顶点的所有入射边(incident edges). 通过将图采用 ...
- UITabelViewCell自定义(zhuan)
很多时候,我们需要自定义UITableView来满足我们的特殊要求.这时候,关于UITableView和cell的自定义和技巧太多了,就需要不断的总结和归纳. 1.添加自定义的Cell. 这个 ...
- start-stop-daemon
start-stop-daemon是OpenRC计划的一部分,这个程序最先出现在Debian系的Linux发行版中,这里有个比较古老的手册页面,更详细更直观的办法当然是通过man start-stop ...
- Play on Words UVA - 10129 欧拉路径
关于欧拉回路和欧拉路径 定义:欧拉回路:每条边恰好只走一次,并能回到出发点的路径欧拉路径:经过每一条边一次,但是不要求回到起始点 ①首先看欧拉回路存在性的判定: 一.无向图每个顶点的度数都是偶数,则存 ...
- Java正则表达式之Matcher类的find和matches方法的区别
讨论整个问题之前,先看个例子: 从上面的例子可以看出 matches()是整个字符串完全匹配时,才会返回true 而find()则只需要字符串中,找到某部分的子字符串匹配则返回true ...
- golang解析xml
解析xml标签或者html标签,都是xml文档格式.要是返回的html标签,可以用第三方依赖库goquery来解析. 下面说下,解析xml标签的格式.直接上代码,代码如下: package main ...
- 集合Set映射一对多(使用xml文件)
如果持久化类设置了包含实体引用的对象,则需要使用一对多关联来映射集合(Set)元素. 我们可以通过任意一个Set集合来映射这个列表对象. 下面来看看看设置对象的持久化类. 在这种情况下,一个问题可以有 ...