为了让你在网易云听一首歌,后端工程师都做了什么?

网易云音乐这3年经历了用户量的爆炸式增长,作为一款口碑爆棚的音乐社区App,在业务快速发展的背景下,后端的架构又经历了怎样的发展历程呢?
 
本文回顾了一个大型互联网应用的后端发展历程,其中涉及到的一些技术内部基本有自研的替代品,出于通用性考虑替换成了相应的开源产品 。
 
本文的读者对象假设已经具备一定计算机基础,如果你希望了解一个亿级用户互联网应用的服务端会涉及到哪些技术,那么请继续读下去吧~
 
从听一首歌说起故事从你打开网易云音乐的APP,点开一个歌单听歌开始 。那么为了满足你听歌的简单愿望,我们的服务端攻城狮们都做了些啥呢?
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
 
你点开歌单,发起了一个HTTP请求,为了响应你的请求,我们搭建了一台服务器运行服务端程序,我们选择免费开源的linux+Tomcat 。
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
>> 企鹅和猫啥时候成搭档了
为了编写服务端程序,需要一种编程语言和服务端编程框架,我们选择了业界流行的JAVA+Spring/SpringBoot 。
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
>> 喝着咖啡就把代码写了,码农的春天来了
 
我撑不住了服务器有了,代码也写好了,现在我们可以开始服务不同用户的各种请求了 。有一天你发现突然歌单打不开了,歌也听不了了,看上去服务器挂了 。我们的工程师紧急联系PE发现服务器的load很高,CPU、内存、网卡都吃紧,看上去是我们的热心用户太多,服务器容量已经撑不住了 。
经过这件事之后,大家一致觉得只有一台机器太不靠谱了,晚上都没法踏实睡觉 。单台服务器无法支撑日益增长的业务请求,CPU、内存、网卡都到了瓶颈,而且一旦挂了就形成单点故障,影响服务的可用率,这时我们又添了几台机器搭建成集群,通过分布式集群来实现业务的平滑扩展 。
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
>> 脑补的分布式集群
太费资源了吧服务器越来越多,如果一个物理机只运行一个服务端进程,资源无法得到充分利用,这时我们引入虚拟化技术(KVM,Docker)在一台物理机上运行多台虚拟机,每个虚拟机共享底层的物理机资源(CPU、内存、网卡、硬盘),将物理资源进行虚拟化按需分配,这就是云计算 。
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
 
业务稳步增长,机器越来越多,我们发现每天中午和晚上是用户活跃的高峰期,机器的load会随着升高,其他时间段则是低谷,机器则比较空闲 。不同的请求量对服务器的资源配置提出了不同的要求,如果高峰期可以自动扩容,低峰期自动缩容,就可以实现资源的最大化利用,避免浪费,这时我们需要生产级别的容器编排系统(K8S) 。
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
 
负载均衡用户操作客户端时实际上是向指定的域名(music.163.com)发起HTTP调用,这个时候需要去DNS服务器查询域名对应的服务器IP,为了对外暴露统一的IP,实现后端服务器的负载均衡,我们在客户端和后端服务器间加入了一层反向代理(Nginx),如此一来所有的服务端API都通过Nginx来转发,服务的扩容可以只用修改Nginx增加内网机器IP就行 。
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
>>Nginx相当于一个统一的出口代理
业务快速发展,接口爆炸式增长,每次上线都配置Nginx不仅繁琐,而且容易带来稳定性隐患,此时迫切需要一个API网关来统一收拢所有的API注册和露出 。
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
 
 
数据存哪儿?用户开始使用我们的服务之后,存储用户的各种数据需要数据库,除了关系型数据库(MySQL),还有各种NoSQL数据库(Hbase,MongoDB) 。随着数据容量的不断增长,单机数据库已经无法满足需求,这时自带分库分表的分布式数据库就开始派上用场了 。
为了让你在网易云听一首歌,后端工程师都做了什么?

文章插图
 
写数据库的增删改查代码比较繁琐,需要一个ORM框架(Mybatis)来实现对象和关系型数据库之间的映射,这样读取数据的时候,每一行数据都可以映射成内存中的一个对象,存储数据的时候每个对象又可以映射成数据库的一行数据 。


推荐阅读