{"action":"opened","issue":{"url":"https://api.github.com/repos/tmallfe/tmallfe.github.io/issues/30","labels_url":"https://api.github.com/repos/tmallfe/tmallfe.github.io/issues/30/labels{/name}","comments_url":"https://api.github.com/repos/tmallfe/tmallfe.github.io/issues/30/comments","events_url":"https://api.github.com/repos/tmallfe/tmallfe.github.io/issues/30/events","html_url":"https://github.com/tmallfe/tmallfe.github.io/issues/30","id":120967352,"number":30,"title":"天猫双11前端分享系列（六）：大规模 Node.js 应用（续）","user":{"login":"dead-horse","id":985607,"avatar_url":"https://avatars.githubusercontent.com/u/985607?v=3","gravatar_id":"","url":"https://api.github.com/users/dead-horse","html_url":"https://github.com/dead-horse","followers_url":"https://api.github.com/users/dead-horse/followers","following_url":"https://api.github.com/users/dead-horse/following{/other_user}","gists_url":"https://api.github.com/users/dead-horse/gists{/gist_id}","starred_url":"https://api.github.com/users/dead-horse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dead-horse/subscriptions","organizations_url":"https://api.github.com/users/dead-horse/orgs","repos_url":"https://api.github.com/users/dead-horse/repos","events_url":"https://api.github.com/users/dead-horse/events{/privacy}","received_events_url":"https://api.github.com/users/dead-horse/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2015-12-08T09:25:33Z","updated_at":"2015-12-08T09:25:33Z","closed_at":null,"body":"[前一篇文章](https://github.com/tmallfe/tmallfe.github.io/issues/28)讲述了我们是怎样应用 Node.js 解决模板渲染的实际问题的，而这一篇我们来看看天猫是如何一步步将 node 推广到各个业务线上的。\r\n\r\n---------------\r\n\r\n\r\n前面讲述了我们通过 node 在今年双十一中承担了大量的页面渲染工作，包括：\r\n\r\n- 天猫首页、大部分天猫频道页、双十一会场以及所有天猫的活动页面都全部基于 node 应用提供服务。\r\n- 商品详情、店铺和搜索页等主流程链路上，以及天猫超市和天猫会员等业务线上的页面渲染。\r\n- 提供给内部运营小二的天猫页面搭建平台 web 层基于 node 进行开发，双十一期间在此平台上搭建了超过 1000+ 个双十一相关活动页面。\r\n\r\n单单看上面列出来的内容可能无法很直观的感受到到底 node 在天猫覆盖了多少业务。大家拿出手机，用浏览器打开天猫首页：\r\n\r\n![](https://os.alipayobjects.com/rmsportal/PXWLjltQzUEYogT.png)\r\n\r\n___从天猫无线首页上点进的任何一个天猫的链接，包括搜索后的列表页、每一个店铺或者商品详情页，都经由 node 渲染产生。___ \r\n\r\n罗马不是一天建成的，天猫将 node 覆盖到如此广的业务范围也是通过一年多的时间慢慢的渗透改造完成。这篇文章想和大家分享一下天猫是如何一步步将页面渲染部分通过 node 替换掉 php 和 java 的。\r\n\r\n## 契机\r\n\r\n在一年半之前，天猫的所有的活动页面、首页和频道页都是基于 TMS 搭建，由 php 在一个独特的 CDN 集群上进行渲染，然而由于之前 php 系统已经没有人维护了，且各种业务共享同一个环境导致 php 版本一直停留在很老的版本无法升级，性能和安全性上有各种问题。\r\n\r\n此时亟需一个新的系统来取代旧的 php 体系，而 node 当时已经在业界和公司内慢慢的被应用起来了，特别是在阿里内部，已经有较为成熟的开发环境（包括私有 npm 服务、与内部其他系统的打通、与发布和监控体系的打通），而在做模板渲染层而言，node 可以很容易的做到前后端共享模板语言，加上性能也不差，前端又比较熟悉，所以最终我们选择了基于 node 进行改造。\r\n\r\n于是我们基于 node 快速的开发了第一个版本的 wormhole（node 渲染容器），并将天猫的首页迁移到了这套系统上。迁移完成之后，我们对新（node）老（php）首页做了一个性能对比：\r\n\r\n![](https://os.alipayobjects.com/rmsportal/WaOeOXWNqKwCvMy.png)\r\n![](https://os.alipayobjects.com/rmsportal/VsQOpWJdLFRfUtJ.png)\r\n\r\n尽管这个结果有一部分因素是因为老系统功能上比新系统要复杂，但是也在很大一定程度上说明了采用 node 的新架构来做这件事情是没有问题的。\r\n\r\n## 小考\r\n\r\n每年的双十一都是对天猫整个技术架构的一次考验，而 2014 年的双十一对于天猫的 node 来说也是一次非常重要的小考：我们在双十一前把天猫首页改成了 node 版本并全量发布了。当时我们在 CDN 的一个独立集群上同时部署了 php 和 node 两套系统，将天猫首页的业务迁移上了 node，而其他的页面仍然采用 php 进行渲染。\r\n\r\n![](https://os.alipayobjects.com/rmsportal/uXJwsRwxDsKVAks.png)\r\n\r\n在双十一当天零点的流量高峰中，node 的表现非常稳定，在同样的环境下，可以说是完胜之前的 php 系统。在此之后，我们终于有足够的底气对老板说：我们要把天猫的 view 这一层全部交给 node。\r\n\r\n## 规模化之路\r\n\r\n在天猫首页上经过了 14 年双十一的考验之后，我们对 node 是否能够支撑天猫的业务场景已经没有疑虑了，剩下的问题就是如何大规模的将 node 应用到天猫的各个业务上去。\r\n\r\n首先我们解决的第一件事情是将天猫前端的模块化开发体系和资源加载方案融入到 node 中，然后推广到各个业务线上，然后又基于 node 构建了一个模块化页面搭建平台，打通前端、运营和后端数据产出系统，承接了天猫所有活动页和频道页等强运营需求的页面。具体的技术方案大家可以查看前一篇文章：[天猫双11前端分享系列（四）：大规模 Node.js 应用](https://github.com/tmallfe/tmallfe.github.io/issues/28)。\r\n\r\n通过这一系列的技术改造之后，我们___把所有新的业务需求全部使用 node 进行渲染___，然后将之前所有用 php 渲染的页面迁移到 node 之上，仅仅用了几个月时间，基本将天猫移动端的 web 页面和所有的活动页、频道页都迁移完成。\r\n\r\n## 双十一大考\r\n\r\n经过大半年时间的重构和迁移，到今年年中的时候，天猫的大部分消费者端的页面都已经跑在了 node 之上，这时又要开始准备新一年的双十一了，比起去年只有一个天猫首页而言，对 node 的压力大了不止一个数量级。\r\n\r\n我们评估基于今年的访问量，如果我们再把天猫首页、活动页直接放在 CDN 上进行渲染，对于 CDN 的机器成本来说是不可接受的，而且随着机器数量的增加，对于文件同步系统的压力也越来越大，效率越来越低。因此我们和 CDN 团队合作，将所有的活动页面从直接渲染模式迁移到缓存化 CDN + 源站的模式，并在这个模式下[对 node 应用的监控和稳定性上做了非常多的工作](https://github.com/tmallfe/tmallfe.github.io/issues/28)。\r\n而对于那些应用集群上的业务，我们也统一做了版本更新、监控完善和性能压测容量评估，保证各个业务方使用的 node 容器的稳定性。\r\n\r\n最终，在今年的双十一中，node 支撑了天猫消费者端在无线设备上绝大多数的 web 页面渲染，PC 上除了核心链路外的绝大部分页面渲染工作，并且表现非常稳定，未出现任何一起由 node 引发的线上故障，而基于缓存化 CDN 的活动页面渲染服务，支撑双十一零点高峰的访问量也毫无压力，用少量的机器完成了去年双十一巨量投入才解决的问题。\r\n\r\n## End\r\n\r\n记得在去年刚开始在天猫推动 node 的时候做了一个 slide 和大老板汇报，中间有一页是介绍业界是如何使用 node 的：\r\n\r\n![](https://os.alipayobjects.com/rmsportal/oVfqRNBysQYwpDR.png)\r\n\r\n在一年多之后的今天，天猫的 node 应用经过这次双十一的考验之后，相信也完全有资格出现在这页 slide 之上了！"}}