社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

Instagram: 用Django服务30亿用户

Python程序员 • 6 年前 • 1359 次点击  

在今年的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




今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/paNxLlW0OH
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2335
 
1359 次点击