开启辅助访问
 找回密码
 立即注册

为啥bilibili后端要用go来写?

zhangxhll 回答数5 浏览数1253
为啥bilibili后端要用go来写?
使用道具 举报
| 来自北京 用Deepseek满血版问问看
PO豬 | 来自北京
哔哩哔哩很早以前就混迹于 Go 语言圈子了。有亲爹谷歌的扶持,有大厂背书,社区和生态持续良好发展,Go 语言的前途一片光明
Go 语言特色
简洁、快速、安全
并行、有趣、开源
内存管理、数组安全、编译迅速
Go 语言用途
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,使用一个表达式来形容Go语言,目前除了作为老一代霸主的 BAT(百度、阿里巴巴、腾讯)以及作为新一代翘楚的 TMD(今日头条、美团、滴滴)之外,还有很多知名的互联网公司都在招聘掌握 Go 语言的开发工程师和系统运维人员。
————————————————
根据自己这半年自学编程的经历,班门弄斧,分享一下GO语言学习路线。另外这边大神较多,我的回答只是抛砖引玉,肯定有不足的地方,麻烦到时候轻拍,先谢过。


希望这篇对您有帮助,写得不好的地方还请海涵。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。也希望自己能深入下去,未来好好研究Go编程语言,做更多实际工程,共勉!
14天搞定Go语言,从0到1保姆级教程-Beego框架项目实战
14天搞定Go语言,从0到1保姆级教程-Go语言密码学算法
14天搞定Go语言,从0到1保姆级教程-Go语言开发实战
持续更新中……欢迎点赞、关注
用Deepseek满血版问问看
回复
使用道具 举报
GcQhnDrs | 来自北京
前B站员工。
先说结论,拿出一个可以对比的语言 Java。因为背景为 PHP、Python 这样的研发团队,在保证工程质量和业务推进的过程中,转 Go 比转 Java 的学习成本和 IT 成本都更低
Go 相对 Java,对于有 Python 或者 PHP 背景的人而言。上手的速度会更快,因为语法简单且单一。再加上并发原语支持以及相对更低的运维成本。工程上选 Go 的做法也就顺理成章了。
其实 Go 里面也有很多反直觉的东西。这些并不会让人觉得这是一门简洁的语言。至少这不是优雅的体现。比如 for range ...
编程语言每多一个特性,就会增加简化问题的可能性,也会存在提升工程复杂度的可能性。因为对于很多转语言的团队,这需要一些已有的工程实践做背书。
Go 相比 Java 是一门更现代化的语言。但这种现代化也只是为了追求符合大多数人利益而在工程上做的权衡。还有像 Scala,Rust 这些同样现代化但是相对 Java 更复杂的语言还在不断地被各种领域尝试并且其中有不少在广泛使用的产品。
回复
使用道具 举报
zhgz | 来自北京
港真,不就是注册个正式会员,要不要这么吓人T_T


另外,这样答题真的有错吗?


还有,你让一个只知道JAVA、C++、前端后端的正经程序员怎么选啊喂?


咳咳,回到正题,我们还是分析后台吧。从一位曾经在哔哩哔哩任职的开发人员那里,了解了一下B站的技术发展历程:最开始是用PHP语言开发的,后来B站的中台逐步被Node占领,而后台技术为了更高的并发、更稳健,以及为了大数据分析,逐步向JAVA靠拢,这便导致了哔哩哔哩的技术整体较为混乱。

生活经验告诉我们,房间需要定期进行整理,如果长时间不打理会变得杂乱无章,同样的,作为一个有着巨大用户量并且正在发展中的视频网站来说,定期清理杂乱无章的技术栈,为用户提供更稳定的服务、更优质的使用体验显然是非常有必要的。否则当视频正看到关键时刻,一记黑屏大法便足以败了你所有的兴致。

并非重写全部的后台工程,而仅仅是与账号相关的业务

根据毛剑的回答,目前哔哩哔哩使用Go语言重构JAVA后台应该已经是板上钉钉的事了,但他们并非是要重写所有的后台,因为就大数据分析方向来说,还是JAVA的天下,重构的部分仅仅是账号有关的业务。

其实很多程序员都有自己热衷的语言以及程序设计偏好,甚至有技术洁癖的程序员,在代码能正常运行的情况下,是不会允许任何人碰自己的代码的,老子的代码天下无敌!


电视剧《硅谷》视频截图,程序员的谜之自信

但是,前提是代码能正常运行,而哔哩哔哩的后台,正如其研发总监毛剑所说的那样:B站早期几乎天天故障,随着团队和业务扩大,各方面的压力都增加,处处冒火。这样的状态与其像补衣服那样不停地打补丁,新补丁盖旧补丁,缝缝补补又三年,着实不如重写来得干脆。至于统一到什么语言其实都是无可厚非的,不管黑猫白猫,能捉到耗子就是好猫

为什么是Go?

归根到底,这次重写后台工程是哔哩哔哩统一技术栈的一次尝试,至于最后为啥选择了Go,很重要的一点在于Go能够满足哔哩哔哩平台重构优化的需求;另一点是其研发总监毛剑本身是一位Go语言的忠实布道者。如果被问急了,毛剑团队会不会来一句:为什么不能是Go?


前面说过了,选择哪种语言都无可厚非,因此这里不针对Go与JAVA两种语言做孰优孰劣的评判。就事论事,我们站在哔哩哔哩的角度,来说说做此选择的优势所在。


  • Go语言本身具有其语言亮点

最近几年,Go语言开始走向火爆,国内外很多公司都已经将Go语言应用到公司核心业务系统中。比如Google、AWS和MonGoDB等国外巨头,以及像阿里云CDN、华为、饿了么、七牛等国内公司也都在积极拥抱Go语言。

JAVA目前仍是企业级开发中的主流选择,如果说JAVA是武林名门,历史悠久、沉稳持重,那么Go就是一个新开山立派的年轻一代,更有冲劲和活力:它没有继承的OO,在很大程度上解决了编译速度慢的痛点,它的强一致类型,破解了程序难维护、文档可读性差等难题,有效缩短了更新所需要的时长,让交叉编译变得更加简单。总之,Go的主要特色让它受到了更多程序员的关注。


另外,Go内置的net/http包基本上把我们平常用到的网络功能都实现了,这些特性对于网络视频平台哔哩哔哩来讲,解决其当前所面临的问题是绰绰有余的。


  • 公司有自己的Go语言团队

哔哩哔哩的研发总监毛剑,此前的工作经历均以Go为主,同时他也带了自己的Go团队共同加入,在这样的背景下,相对于JAVA,选择用Go来重构后台显然能够起到事半功倍的效果。

其实,这件事对于毛剑的技术团队来说,用自己擅长的语言做自己应该做的事儿,说破大天儿去,也无可非议。不管是JAVA还是Go,公司最看重的不是编程语言,而是最终所呈现的系统,语言只不过是工具而已;对于用户而言,只要有完美的体验,后台用什么语言不重要。所以,在相对统一的情况下,让各种语言发挥它们最大的优势,为产品的稳健运行提供更好的保障,应该是最明智的选择。

综上,这次哔哩哔哩采用Go语言来重写后台JAVA工程,有行业发展的必然性,也有场景、功能实现的需求性,还有技术负责人根据现实情形做出选择的主观判断性。随着行业的不断发展,各种新兴语言不断出现,一个项目中多种语言并存、互补的现象是必然的,说不定哪一天你还会发现用Go写的后台被其他语言改写了,或者某种你以为已经成为历史的语言卷土重来也不是没有可能。


哼!虽然答不上你的考试题,后台还是可以八一八的~


B站“你会找程序员做男 女朋友吗?”视频截图。这个弹幕我只看到了前半句(●'◡'●)ノ♥

<hr/>推荐阅读:
慕课网:Go语言“十诫”
Go标准库flag包的“小陷阱”
从 PHP 成功转 Go,我经历了什么?
史上最全Go语言知识图谱 (Go Knowledge Graph)
回复
使用道具 举报
susaniou | 未知
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语言实现高并发还是非常靠谱的。
二、Go语言的特点
1、学习曲线容易
Go语言语法简单,包含了类C语法。因为Go语言容易学习,所以一个普通的大学生花几个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。


Go 语言的语法特性简直是太简单了,简单到你几乎玩不出什么花招,直来直去的,学习曲线很低,上手非常快。
2、效率:快速的编译时间,开发效率和运行效率高
开发过程中相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。Go拥有接近C的运行效率和接近PHP的开发效率。


C 语言的理念是信任程序员,保持语言的小巧,不屏蔽底层且底层友好,关注语言的执行效率和性能。而 Python 的姿态是用尽量少的代码完成尽量多的事。于是我能够感觉到,Go 语言想要把 C 和 Python 统一起来,这是多棒的一件事啊。


3、出身名门、血统纯正
之所以说Go出身名门,从Go语言的创造者就可见端倪,Go语言绝对血统纯正。其次Go语言出自Google公司,Google在业界的知名度和实力自然不用多说。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途。


4、自由高效:组合的思想、无侵入式的接口
Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程、面向接口编程、函数式编程。程序员们可以各取所需、自由组合、想怎么玩就怎么玩。
5、强大的标准库
这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。Go 语言的 lib 库麻雀虽小五脏俱全。Go 语言的 lib 库中基本上有绝大多数常用的库,虽然有些库还不是很好,但我觉得不是问题,因为我相信在未来的发展中会把这些问题解决掉。
6、部署方便:二进制文件,Copy部署
这一点是很多人选择Go的最大理由,因为部署太方便了,所以现在也有很多人用Go开发运维程序。
7、简单的并发
并行和异步编程几乎无痛点。Go 语言的 Goroutine 和 Channel 这两个神器简直就是并发和异步编程的巨大福音。像 C、C++、Java、Python 和 JavaScript 这些语言的并发和异步方式太控制就比较复杂了,而且容易出错,而 Go 解决这个问题非常地优雅和流畅。这对于编程多年受尽并发和异步折磨的编程者来说,完全就是让人眼前一亮的感觉。Go 是一种非常高效的语言,高度支持并发性。Go是为大数据、微服务、并发而生的一种编程语言。

  • Go 作为一门语言致力于使事情简单化。它并未引入很多新概念,而是聚焦于打造一门简单的语言,它使用起来异常快速并且简单。其唯一的创新之处是 goroutines 和通道。Goroutines 是 Go 面向线程的轻量级方法,而通道是 goroutines 之间通信的优先方式。
  • 创建 Goroutines 的成本很低,只需几千个字节的额外内存,正由于此,才使得同时运行数百个甚至数千个 goroutines 成为可能。可以借助通道实现 goroutines 之间的通信。Goroutines 以及基于通道的并发性方法使其非常容易使用所有可用的 CPU 内核,并处理并发的 IO。相较于 Python/Java,在一个 goroutine 上运行一个函数需要最小的代码。
8、稳定性
Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test。
回复
使用道具 举报
yike | 来自北京
如何看待哔哩哔哩用Go语言重写所有的Java后台工程?
回复
使用道具 举报
快速回复
您需要登录后才可以回帖 登录 | 立即注册

当贝投影