为什么选择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 等都进行一致的高性能响应。
下面谈谈我自己的理解:
【性能】:
Nginx本身多进程模型和事务机制,使得在处理请求和代理等方面的性能无需多言;
在连接 MySQL 、Redis 和发起 HTTP 请求时,工作进程不能傻傻的等待网络IO的返回,支持异步事件驱动和连接池;
有完备的缓存机制,不仅需要支持 Redis 、Memcached 等外部缓存,在自己的进程内也有shared_dict缓存系统;
【稳定】:
跨平台,稳定,方便调试,便于部署和维护;
有成熟产品和大型项目验证,目前已知BAT、京东、360和不少CDN公司都在实际项目中使用并积极参与社区贡献;
【学习成本和推广】:
Nginx第三方模块和lua扩展等第三方库丰富;
同步写代码的方式实现异步非阻塞,不要让开发者感知到回调和异步;
学习速度快,日常业务者只需要掌握lua语法,不需要关心内部实现和nginx模块开发等技术,经过我们内部实验,一个掌握php或者python语法的后端工程师,经过1-2周的学习和锻炼,就能用lua写出高性能的API接口;
以上就是我们选用lua来开发api的原因,当然1000个架构师就有1000个设计风格,还需要综合考虑团队人员组成、业务变更频率等等,永远没有最佳的方案,只有最适合自己的方案。技术在发展,现在适合的并不一定永远适合而且肯定不会永远适合,也许现在就有更适合的解决方案,但我相信有一个开放和学习的心态,这些都不是问题。
我们团队也基于openresty开发了一些module和扩展,希望能帮到更多的开发者,详见:https://github.com/taihedeveloper
最后:真挚感谢章亦春(agentzh)大神和openresty开源团队的贡献者们!站在巨人的肩膀让我们看得更远,走得更快!
欢迎分享并关注太合音乐技术团队
以上是关于为什么选择nginx+lua重构百度音乐API的主要内容,如果未能解决你的问题,请参考以下文章