在今年的Pycon大會上,Instagram分享了他們使用Python的方法和心得。作為一款全球性質的,月活躍用戶破7億的產品,Instagram的經驗可以給我們很多啟發。現在就讓我們看看他們分享的經驗吧。
為什麼Instagram選擇Python?
1、易於部署
2、容易招人
3、語言成熟且Django好用
4、使用Django的User model服務30億用戶
我們對我們的Python做了哪些hack?
1、增加分佈式數據庫的支持
2、禁止垃圾回收來優化內存使用率
3、跨多數據中心運行我們應用
讚美Python
1、Python總是快速解決問題,可以快速實現初版
2、Python是被驗證過的技術,大家都說好
3、用戶優先:專注為用戶提供價值
Python是有點慢,但我們不在乎,我們的瓶頸是開發的進度!
解決Python效率的問題
1、構建工具來監控性能,理解性能瓶頸所在。
2、把穩定的、大訪問量的部分用C/C++改寫,比如memcached訪問。
3、用Cython來處理代碼轉換的問題。
4、我們也在考略用Async,或者改換Python運行時。
為什麼我們要遷移到Python3?
1、改善開發效率
2、提升性能
3、社區支持,畢竟Python2已經不支持了。
如此巨大的服務,如何完成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%的用戶測試,最後才公開升級。
遷移到Python3過程中遇到的挑戰:
1、Unicode問題
2、數據格式不兼容問題
3、迭代器問題
4、字典排序問題
遷移到Python3後,性能變化如何?
CPU節省12%,內存佔用下降30%。
在Python3遷移的過程中,Instagram的月活從4.5億增長到了6.5億。所以Instagram推薦大家也遷移Python3,因為Python3有如下優秀的特性:
1、類型提示:你可以在代碼中加入額外的說明,指定類型。
2、異步IO,和異步框架。
3、更好的社區,提供更好的工具,如性能測試、內存檢測等。
最後,Instagram愛Python