为什么选择nginx+lua重构百度音乐API

Posted 太合音乐技术团队

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么选择nginx+lua重构百度音乐API相关的知识,希望对你有一定的参考价值。

【背景】:

百度音乐历史上主要使用php开发API,但中间出过几次严重事故,如UC异常导致PHP hang住结果整个API全部500;如歌曲首页多个后端服务串行调用导致接口响应严重超时;让我们下决心选择更适合开发API的框架。

百度音乐从2015年开始,尝试用openresty(nginx+lua)来重构了部分用户访问频度和对响应时间要求时间比较高的API接口,访问量top10的接口重构完成后,API服务器数量节省了一半,API并发响应时间缩短了40%。

百度音乐spinoff之后,我们在总结经验和教训的基础上,逐步推广到更多业务,openapi、T榜、Tpass、音乐人等新业务的开发也采用了这种模式。今天开篇简单讲一下为什么选择lua,什么场景下适合用lua,欢迎大家共同讨论!


【架构】:

首先要说的是业务场景和架构如果你的服务复杂度和用户量级就是php+数据库最多加个mc或者redis就能搞定的那就不用往下看了你用啥都行如果你当前或者未来需要服务上亿用户有几十个独立后端或者第三方服务需要组合调用那么你必须慎重选择你的API开发框架。


众所周知,API是整个前端业务的接入网关,屏蔽和封装了后端各个独立子系统,通常情况下,APP上的一个功能(如音乐常见的单曲播放页)发起的API请求可能同时调用了用户基本信息服务、评论服务、收藏服务、歌单服务等。如果是PHP串行调用,整个接口的访问速度可能就是1+1+1+1=4;如果使用java或者C来开发,对于API团队的技术能力和产品变更灵活性要求就会比较高。


抽象来说:既不能让一个慢查询或者后端服务异常就把整个API阻塞;也不能为了性能而忽略了业务快速变更的需求我们需要考虑技术的成熟度安全性和可扩展性

同时,技术开发是为了业务但不能局限于业务必须有一定的前瞻性

总之技术选型就是一个综合考量换取平衡中取的临时最优解。


如下是OpenResty的官方介绍:

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 mysql、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。


下面谈谈我自己的理解:

【性能】:

  1. Nginx本身多进程模型和事务机制使得在处理请求和代理等方面的性能无需多言;

  2. 在连接 MySQL Redis 和发起 HTTP 请求时工作进程不能傻傻的等待网络IO的返回支持异步事件驱动和连接池;

  3. 有完备的缓存机制不仅需要支持 Redis Memcached 等外部缓存在自己的进程内也有shared_dict缓存系统;


【稳定】

  1. 跨平台稳定方便调试便于部署和维护;

  2. 有成熟产品和大型项目验证目前已知BAT、京东、360和不少CDN公司都在实际项目中使用并积极参与社区贡献;


【学习成本和推广】:

  1. Nginx第三方模块和lua扩展等第三方库丰富;

  2. 同步写代码的方式实现异步非阻塞不要让开发者感知到回调和异步;

  3. 学习速度快,日常业务者只需要掌握lua语法不需要关心内部实现和nginx模块开发等技术,经过我们内部实验,一个掌握php或者python语法的后端工程师,经过1-2周的学习和锻炼,就能用lua写出高性能的API接口;


以上就是我们选用lua来开发api的原因,当然1000个架构师就有1000个设计风格,还需要综合考虑团队人员组成、业务变更频率等等,永远没有最佳的方案,只有最适合自己的方案。技术在发展现在适合的并不一定永远适合而且肯定不会永远适合,也许现在就有更适合的解决方案但我相信有一个开放和学习的心态这些都不是问题。


我们团队也基于openresty开发了一些module和扩展,希望能帮到更多的开发者,详见:https://github.com/taihedeveloper


最后:真挚感章亦春(agentzh)大神和openresty开源团队的贡献者们!站在巨人的肩膀让我们看得更远,走得更快!



欢迎分享并关注太合音乐技术团队


以上是关于为什么选择nginx+lua重构百度音乐API的主要内容,如果未能解决你的问题,请参考以下文章

百度音乐API抓取

nginx lua 安装

音乐视频站api接口

百度音乐的应用简介

音乐平台API 和接口调用

怎么把收藏的文件保存到百度网盘