基于Django的Disqus如何支持每月80億PV
現(xiàn)在我們Disqus能夠處理一個(gè)月80億PV,每秒處理45000個(gè)請(qǐng)求。在把評(píng)論發(fā)送到很多不同的人的時(shí)候,我們學(xué)到了一些東西。眾所周知 Disqus是用Django來(lái)處理絕大部分的web流量。在使用任何web框架之時(shí),都要在開發(fā)速度 vs 性能、快速上手 vs 定制等之間做取舍。而Disqus更趨向于快速開發(fā)和容易上手,同時(shí)兼顧性能和靈活定制。
那么為什么web框架慢?
表面上,對(duì)于web框架的第一印象就是慢,因?yàn)樵谀愕膽?yīng)用里有很多你不需要的代碼,這是一個(gè)正常的印象。在實(shí)踐中,緩慢往往不是由于膨脹的框架和語(yǔ) 言選擇造成的。緩慢應(yīng)該是由于你的請(qǐng)求在你的網(wǎng)絡(luò)里與其他的服務(wù)進(jìn)行通信的結(jié)果。在我們的場(chǎng)景下,這些’其他的服務(wù)’是 PostgreSQL、Redis、Cassandra和Memcached。緩慢的數(shù)據(jù)庫(kù)查詢和網(wǎng)絡(luò)延遲通常會(huì)拖累像Django這樣一個(gè)健壯框架的性 能。
為了規(guī)避這些延遲,人們使用各種各樣的緩存技術(shù)。最常見的方法就是使用Django內(nèi)建的cache庫(kù)。
常見的應(yīng)用緩存如下:
- data = cache.get('stuff')
- if data is None:
- data = list(Stuff.objects.all())
- cache.set('stuff', data)
- return data
如果你熟悉Django,這應(yīng)該是個(gè)很常用的模式。這種形式的緩存是非常簡(jiǎn)單明了,并且在大多數(shù)情況下都適用。配合Memcached,它就足夠快了,但是為了響應(yīng)一個(gè)請(qǐng)求仍然有很多工作需要做。
處理每秒45000次請(qǐng)求
我們已經(jīng)對(duì)處理很慢的東西做了緩存。不過在達(dá)到每秒45000次請(qǐng)求的時(shí)候仍然有很多工作需要做。我們可能會(huì)返回JSON,渲染HTML模版,簡(jiǎn)單 的解析HTML或者執(zhí)行Django中間件。問題是,我們希望能夠讓這些工作更快返回,讓Django來(lái)處理它擅長(zhǎng)的:只處理唯一的數(shù)據(jù)。
在每秒45000次請(qǐng)求里面,有多少是唯一的?在這里面有多少請(qǐng)求的返回與下一個(gè)返回不一樣?你真的需要在返回結(jié)果一樣的時(shí)候做重復(fù)的工作嗎?我們需要將整個(gè)HTTP返回緩存起來(lái)以是我們不用做重復(fù)工作。
介紹Varnish
Varnish是神馬?Varnish是工作于負(fù)載均衡和Django后端之間,作為HTTP緩存層。這意味著它能夠?qū)⒄麄€(gè)HTTP返回緩存起來(lái),讓那些不唯一的請(qǐng)求不用命中Django服務(wù)器。
之前,Varnish使我們的一個(gè)黑盒子。我們安裝并且最小程度的配置它,老實(shí)說(shuō),它工作的非常棒。但我覺得我們還能做的更多。
我花了一些時(shí)間來(lái)學(xué)習(xí)更多關(guān)于Varnish和我們能用得上的東西。隨著時(shí)間的過去,我們能夠讓每秒數(shù)千次請(qǐng)求不用命中Django服務(wù)器。今天, 在每秒45000次請(qǐng)求里面,只有15000次請(qǐng)求會(huì)命中我們的應(yīng)用服務(wù)器。剩下的被Varnish接收,它運(yùn)行的非??旌陀行А?/p>
因?yàn)檫@對(duì)我們非常有用,也是一段很好的學(xué)習(xí)經(jīng)歷,這個(gè)主題也成為了我近期的一些演講的主題。
最近,我在芝加哥的DjangoCon大會(huì)上有一個(gè)演講。這個(gè)演講是面向不熟悉Varnish的人,用希望來(lái)鼓舞和驅(qū)動(dòng)他們學(xué)習(xí)更多。對(duì)我而言,我 對(duì)這次演講很興奮,因?yàn)檫@個(gè)主題是很少被應(yīng)用開發(fā)者提到的。這是一個(gè)我希望幾年前就能聽到的演講,希望能夠讓人明白HTTP是如何工作,以及如何使用像 Varnish這樣的工具來(lái)管理它的交互。(HTTP for Great Good)
在那之前,我出席了在紐約舉辦的VUG7(Varnish 用戶組),并且深入介紹了一些解決我們問題的技巧。這次演講里涉及到很多我們使用的Varnish配置語(yǔ)言。 (Caching is Hard: Varnish @ Disqus)
tl;dr
學(xué)習(xí)Varnish,它不會(huì)解決你全部的問題,但它值得你投入時(shí)間來(lái)學(xué)習(xí)它和評(píng)估它的價(jià)值。
如果這類型的東西很吸引你,并且你跟我一樣也喜歡一周至少5天對(duì)著電腦吼叫,速度聯(lián)系我們,我們?cè)谡腥耍?/p>
(編注:原文評(píng)論也精彩,值得一看。)
補(bǔ)充信息:
Disqus是一家第三方社會(huì)化評(píng)論系統(tǒng),主要為網(wǎng)站主提供評(píng)論托管服務(wù)。WordPress、Blogger、Tumblr等第三方博客平臺(tái)均提 供了Disqus第三方評(píng)論插件。Disqus的主要目標(biāo)是通過提供功能強(qiáng)大的第三評(píng)論系統(tǒng),將當(dāng)前不同網(wǎng)站的相對(duì)孤立、隔絕的評(píng)論系統(tǒng),連接成具有社會(huì) 化特性的大網(wǎng)。通過Disqus評(píng)論系統(tǒng)所具備的評(píng)論回復(fù)通知、評(píng)論分享和熱文分享等社會(huì)化功能,網(wǎng)站主可以有效的提高網(wǎng)站用戶的活躍度和流量。
用戶使用Disqus,在不同網(wǎng)站上評(píng)論,無(wú)需重復(fù)注冊(cè)賬號(hào),只需使用Disqus賬號(hào)或者第三方平臺(tái)賬號(hào),即可方便的進(jìn)行評(píng)論,且所有評(píng)論都會(huì)存 儲(chǔ)、保存在Disqus賬號(hào)后臺(tái),方便隨時(shí)查看、回顧。而且,當(dāng)有用戶回復(fù)自己的評(píng)論時(shí),可以選擇使用郵箱接收相關(guān)信息,保證所有評(píng)論的后續(xù)行為都可以隨 時(shí)掌握。于此同時(shí),Disqus將社交交友功能也很好的融入到了評(píng)論系統(tǒng)中,當(dāng)用戶在某一網(wǎng)站上看到有與自己類似觀點(diǎn)的評(píng)論時(shí),可對(duì)該評(píng)論的評(píng)論者進(jìn)行關(guān) 注,關(guān)注后,該評(píng)論者以后的所有評(píng)論都會(huì)顯示在自己的賬號(hào)后臺(tái)。
原文鏈接:http://blog.disqus.com/post/62187806135/scaling-django-to-8-billion-page-views