b站为何选择Go语言重构后台代码
从一位曾经在哔哩哔哩任职的开发人员那里,了解了一下B站的技术发展历程:最开始是用PHP语言开发的,后来B站的中台逐步被Node占领,而后台技术为了更高的并发、更稳健,以及为了大数据分析,逐步向JAVA靠拢,这便导致了哔哩哔哩的技术整体较为混乱。
B站早期几乎天天故障,随着团队和业务扩大,各方面的压力都增加,处处冒火。代码混乱,框架结构混乱,已经到了难以维护的地步,需要理清脉络,在这样的情况下统一技术栈是毫无疑问该做的事。最后发现重写反而是最优的解决方案。
为什么是Go?
归根到底,重写后台工程是哔哩哔哩统一技术栈的一次尝试,至于最后为啥选择了Go,很重要的一点在于Go能够满足哔哩哔哩平台重构优化的需求;另一点是其研发总监毛剑本身是一位Go语言的忠实布道者。
那我们站在哔哩哔哩的角度来分析以下:
第一:Go内置的net/http包基本上把我们平常用到的网络功能都实现了,这些特性对于网络视频平台哔哩哔哩来讲,解决其当前所面临的问题是绰绰有余的。
第二:公司有自己的Go语言团队
哔哩哔哩的研发总监毛剑,此前的工作经历均以Go为主,同时他也带了自己的Go团队共同加入,在这样的背景下,相对于JAVA、Python,选择用Go来重构后台显然能够起到事半功倍的效果。
所以哔哩哔哩采用Go语言来重写后台JAVA工程,有行业发展的必然性,也有场景、功能实现的需求性,还有技术负责人根据现实情形做出选择的主观判断性。随着行业的不断发展,各种新兴语言不断出现,一个项目中多种语言并存、互补的现象是必然的,也许几十年后你还会发现用Go写的后台被其他语言改写了,或者某种你以为已经成为历史的语言卷土重来也不是没有可能。
而从今天bilibili泄露出来的Go的源代码我们也可以看到,对于bilibili这样日以几千万的访问量,Go语言实现高并发还是非常靠谱的。
参考 https://juejin.im/entry/59dae7155188252e7547a569
Go语言的特点
1、学习曲线容易
Go语言语法简单,包含了类C语法。在国内大家都追求快 越快越好,因为Go语言容易学习,学习曲线很低,又很容易上手,这也导致了Go在墙内比墙外先开花的原因之一。
2、效率:快速的编译时间,开发效率和运行效率高
开发过程中相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。Go拥有接近C的运行效率和接近PHP的开发效率。
3、强大的标准库
这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。 Go 语言的 lib 库麻雀虽小五脏俱全。 Go 语言的 lib 库中基本上有绝大多数常用的库,虽然有些库还不是很好,但我觉得不是问题,因为我相信在未来的发展中会把这些问题解决掉。
4、部署方便:二进制文件,Copy部署
这一点是很多人选择Go的最大理由,因为部署太方便了,所以现在也有很多人用Go开发运维程序。
5、简单的并发
并行和异步编程几乎无痛点。Go 语言的 Goroutine 和 Channel 这两个神器简直就是并发和异步编程的巨大福音。像 C、C++、Java、Python 和 JavaScript 这些语言的并发和异步方式太控制就比较复杂了,而且容易出错,而 Go 解决这个问题非常地优雅和流畅。这对于编程多年受尽并发和异步折磨的编程者来说,完全就是让人眼前一亮的感觉。Go 是一种非常高效的语言,高度支持并发性。Go是为大数据、微服务、并发而生的一种编程语言。
前面只是从技术的角度分析go 语言的优势,但是技术只是一个方面,一个语言真正能不能发展起来,是否适合公司的业务,对于公司业务是否原因用go去代替其他语言,关键还要看这几点。
有没有一个比较好的社区。 像 C、C++、Java、Python 和 JavaScript 的生态圈都是非常丰富和火爆的。尤其是有很多商业机构参与的社区那就更为人气爆棚了,比如 Linux 的社区。
有没有一个工业化的标准。 像 C、C++、Java 都是有标准化组织的。尤其是 Java,其在架构上还搞出了像 J2EE 这样的企业级标准。
有没有一个或多个杀手级应用。 C、C++ 和 Java 的杀手级应用不用多说了,就算是对于 PHP 这样还不能算是一个好的编程语言来说,因为是 Linux 时代的第一个杀手级解决方案 LAMP 中的关键技术,所以,也发展起来了。
上述的这三点是非常关键的,新的技术只需要占到其中一到两点就已经很不错了,何况有的技术,比如 Java,是三点全占到了,所以,Java 的发展是如此好。当然,除了上面这三点重要的,还有一些其它的影响因素,比如:
学习曲线是否低,上手是否快。 这点非常重要,C++ 在这点上越做越不好了。
有没有一个不错的提高开发效率的开发框架。 如:Java 的 Spring 框架,C++ 的 STL 等。
是否有一个或多个巨型的技术公司作为后盾。 如:Java 和 Linux 后面的 IBM、Sun……
有没有解决软件开发中的痛点。 如:Java 解决了 C 和 C++ 的内存管理问题。
是否有几个杀手级别的应用。如很多大公司都是用Java代替原来的c# ,这也是Java最流行的原因之一
当然,我个人觉得,Go 可能会吞食很多 C、C++、Java 的项目。不过,Go 语言所吞食主要的项目应该是中间层的项目,既不是非常底层也不会是业务层。
也就是说,Go 语言不会吞食底层到 C 和 C++ 那个级别的,也不会吞食到高层如 Java 业务层的项目。Go 语言能吞食的一定是 PaaS 上的项目,比如一些消息缓存中间件、服务发现、服务代理、控制系统、Agent、日志收集等等,没有复杂的业务场景,也到不了特别底层(如操作系统)的中间平台层的软件项目或工具。而 C 和 C++ 会被打到更底层,Java 会被打到更上层的业务层。