知乎从Python转为Go,是否是表明Go比Python好?

众所周知,知乎早在几年前就将推荐系统从 Python 转为了 Go。因而乎,一部分人就说 Go 比 Python 好,Go 和 Python 两大社区的相关开发人员为此也争论过很多,彷佛,谁也没彻底说服谁。前端


知乎从Python转为Go,是否是表明Go比Python好?我认为,各有优势,谁也取代不了谁,会长期共存!编程


“由 Python 语言转向 Go 语言就说明 Go 语言比 Python 语言好”彻底是一种片面理解。后端


“语言至上论”是解决不了业务问题的,选 Go 也不行,Java 也不行。安全


Go 的优点是文件易部署,协程机制相对成熟且简单,以及静态编译语言的效率,还有就是编程模式相对简单。这大概是如今愈来愈多企业尝试Go的缘由,除了知乎,B 站也把核心部件从 PHP 转到了Go。服务器


除此以外,BAT 等互联网巨头,内部都有系统采用了 Go 语言。
微信


那是否是说 Python、PHP 不行了?固然不是也不该该是这样的。若是要坚持Python、PHP,也是没问题。一个系统沉积过久的话,会产生不少大大小小、零零散散的“技术债”,这其间就涉及解决成本的考量,重构、重写、抑或从新设计核心模块或新模块?由此又带来技术选择的问题。还有Python、PHP人才储备的问题,还有团队但愿尝试新技术的考虑。这些问题交织在一块儿,就不是哪一个编程语言好跟坏这么简单的事儿了。因此仍是要回到业务层面来看技术解决之道。架构


不得不说,Go的协程,一个“go”就能解决绝大多数问题,确实写代码很简洁,Python 新添的 asyncio 仍是相对复杂,Future、Task等等仍是有很多门道的。因此,技术永远只有合适的,而没有最佳的,也没有非此即彼的好坏分明。并发


我相信,若是团队在 Python 方面积累厚实,且热衷专一于 Python,选择Python 应该就是个大几率事件。Python 如今已经应用颇广,特别是在 AI 领域带动下,Python 人才也不像之前那样难找工做了,铁打的营盘流水的兵,是否是知乎也面临人才流动压力?此外,毕竟 Python 的生态,在这么多编程语言中,是首屈一指的,Go 虽热,但在社区方面恐怕仍是比不上 Python、PHP,这也是一个现实问题。知乎前端换了 React,我没感受比原来的 AngularJS 进步,但不能就此说 React 不行。尝试用 Go 写一些原来 Python 的范围,也是同理。并且一个系统同时应用多种开发语言、一系列技术栈,都是再正常不过的事了。app


Python 有本身的场景,不会被完全替换的,担忧也是多虑的,反正都是“增删改查”嘛!async


至于,知乎为何选择 Go,内部的一些工程师透露:选择 Go 并非一我的的决定,而是整个团队深思熟虑后的结果!


众所周知,知乎社区后端的主力编程语言是 Python。


随着知乎用户的迅速增加和业务复杂度的持续增长,核心业务的流量在过去一年内增加了好几倍,对应的服务端的压力也愈来愈大。随着业务发展,咱们发现 Python 做为动态解释型语言,较低的运行效率和较高的后期维护成本带来的问题逐渐暴露出来:


  1. 运行效率较低。知乎目前机房机柜空间已经不足,按照目前的用户和流量增加速度,可预见将在短时间内服务器资源告急(针对这一点,知乎正在由单机房架构升级为异地多活架构);

  2. Python 过于灵活的语言特性,致使多人协做和项目维护成本较高


受益于近些年开源社区的发展和容器等关键技术的普及,知乎的基础平台技术选型一直较为开放。在开放的标准之上,各个语言都有成熟的开源的中间件可供选择。这使得业务作选型时能够根据问题场景选择更合适的工具,语言也是同样。


基于此,为了解决资源占用问题和动态语言的维护成本问题,咱们决定尝试使用静态语言对资源占用极高的核心业务进行重构。


为何选择 Golang?


如上所述,知乎在后端技术选型上比较开放。在过去几年里,除了 Python 做为主力语言开发,知乎内部也不乏 Java、Golang、NodeJS 和 Rust 等语言开发的项目。


Golang 是当时知乎内部讨论交流最活跃的编程语言之一,考虑到如下几点,知乎决定尝试用 Golang 重构内部高并发量的核心业务:


  1. 自然的并发优点,特别适合 IO 密集应用

  2. 知乎内部基础组件的 Golang 版生态比较完善

  3. 静态类型,多人协做开发和维护更加安全可靠

  4. 构建好后只需一个可执行文件便可,方便部署

  5. 学习成本低,且开发效率较 Python 没有明显降


相比另外一门也很优秀的待选语言—— Java,Golang 在知乎内部生态环境、部署的方便程度和工程师的兴趣上都更胜一筹,最终咱们决定,选择 Golang 做为开发语言。


最后,咱们作个简单总结:第一点,重构语言的选择,关键要跟公司技术背景和业务场景结合起来第二点,架构尽可能灵活,并不断自我迭代;第三点,监控要早点开展,并尽量底层化、通用化。

本文分享自微信公众号 - 业余草(yyucao)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索