Instagram:用Django服務30億用戶

編程語言 Django Instagram Python Python部落 2017-06-18

在今年的Pycon大會上,Instagram分享了他們使用Python的方法和心得。作為一款全球性質的,月活躍用戶破7億的產品,Instagram的經驗可以給我們很多啟發。現在就讓我們看看他們分享的經驗吧。

為什麼Instagram選擇Python?

1、易於部署

2、容易招人

3、語言成熟且Django好用

4、使用Django的User model服務30億用戶

Instagram:用Django服務30億用戶

我們對我們的Python做了哪些hack?

1、增加分佈式數據庫的支持

2、禁止垃圾回收來優化內存使用率

3、跨多數據中心運行我們應用

Instagram:用Django服務30億用戶

讚美Python

1、Python總是快速解決問題,可以快速實現初版

2、Python是被驗證過的技術,大家都說好

3、用戶優先:專注為用戶提供價值

Python是有點慢,但我們不在乎,我們的瓶頸是開發的進度!

Instagram:用Django服務30億用戶

解決Python效率的問題

1、構建工具來監控性能,理解性能瓶頸所在。

2、把穩定的、大訪問量的部分用C/C++改寫,比如memcached訪問。

3、用Cython來處理代碼轉換的問題。

4、我們也在考略用Async,或者改換Python運行時。

Instagram:用Django服務30億用戶

為什麼我們要遷移到Python3?

1、改善開發效率

2、提升性能

3、社區支持,畢竟Python2已經不支持了。

Instagram:用Django服務30億用戶

如此巨大的服務,如何完成Python2到Python3的遷移?

從代碼管理上

Instagram不區分分支,都在單一master分支上開發。他們認為:

1、分支同步會有額外的負載,而且有時候會出錯。

2、分支合併有巨大的風險。

3、喪失了互相學習的機會

Instagram也沒有使用多個代碼庫的辦法。他們認為:

1、多個代碼庫之間有很多通用代碼需要共用。

2、程序員需要在多個項目之前切換思維。

3、管理多個代碼庫耗費精力。

Instagram也沒有采用微服務,因為:

1、微服務意味著大量的代碼重構。

2、架構效率更低。

3、部署更復雜。

他們最後選擇的辦法是:讓master分支兼容Python2和Python3

在實際操作中

Instagram安排了一個整塊時間做遷移,到一個時間點後,所有的代碼都是Python3的了。

這個過程中,替換第三方包以及代碼修改用了3-4個月,然後測試進行了2個月,最後部署流程進行了4個月。

替換第三方包以及代碼修改時,有四個步驟:

1、不是Python3的包不添加。

2、刪除不兼容的包,比如thrift,ipaddr,django-paging,python-memcached,hiredis,enum34,httplib2,dnspython,twisted,django-templatetag-sugar,pyapns,django-sentry,jsonfig,phpserialize.....

3、升級兼容包,比如Django。

4、使用codemod升級代碼,這一步會把很多Python2語法自動更改為Python3代碼。

測試的過程當然就是修Bug啦,但是測試不足以證明代碼已經沒問題了,因為:

1、測試不可能有100%的覆蓋率。

2、很多外部服務都被mock了。

3、單元測試測不出數據不兼容的問題

所以Instagram採取了灰度部署的策略

開發測試,內部測試,0.1%的用戶測試,20%的用戶測試,最後才公開升級。

Instagram:用Django服務30億用戶

遷移到Python3過程中遇到的挑戰:

1、Unicode問題

2、數據格式不兼容問題

3、迭代器問題

4、字典排序問題

Instagram:用Django服務30億用戶

遷移到Python3後,性能變化如何?

CPU節省12%,內存佔用下降30%。

Instagram:用Django服務30億用戶

在Python3遷移的過程中,Instagram的月活從4.5億增長到了6.5億。所以Instagram推薦大家也遷移Python3,因為Python3有如下優秀的特性:

1、類型提示:你可以在代碼中加入額外的說明,指定類型。

2、異步IO,和異步框架。

3、更好的社區,提供更好的工具,如性能測試、內存檢測等。

最後,Instagram愛Python

Instagram:用Django服務30億用戶

相關推薦

推薦中...