在今年的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%的用户测试,最后才公开升级。