[ 好文分享 ] 美团旅店Node全栈开辟实践

转自:美团手艺团队
作者:美团手艺团队
分享来由:很好的分享,可见,基于Node的前后端星散的架构是越显盛行和重要,前端攻城狮们,Node学起来啊!!

《[ 好文分享 ] 美团旅店Node全栈开辟实践》

前后端星散的背景

“前后端星散”明显已不是什么新颖的话题,Zakas在2013年10月份就曾宣布过一篇博客《Node.js and the new web front-end》议论Node背景下新时代的前端。毫无疑问,Node的涌现给JavaScript言语带来了新的生气愿望,也使得前端开辟者有了更多的可能性。

前后端星散表面上看似乎是一场“圈地活动”,但实质上前后端星散是为了处置惩罚以往开辟情势的一些诟病和痛点,同时也是投合大的行业趋向的明智之举。我地点的美团旅店事业部客岁7月份建立,新的营业、新的开辟团队,这一切使得我们的前后端星散推动的很完全。停止如今,前端承载的一切营业和线上效劳都是基于Node,临盆环境已有近20台效劳器。云云带来的全新前后端合作体式格局能够让专业的人做专业的事,不管前端后端都能较之前更专注在本身善于的方面。

开辟情势、手艺栈

《[ 好文分享 ] 美团旅店Node全栈开辟实践》

传统的开辟情势只须要专注在多终端的显现上(浏览器、WebView)。而如今,浏览器只是前端的个中一环,延长出来的另有Node端的架构、效劳的运维才能等。上图是我们如今的效劳架构:Nginx位于Node效劳之前,用做负载平衡、效劳调理、Gzip紧缩等。以后就是Node效劳,我们经由历程PM2.5举行Node效劳的Cluster布置和负载平衡(充分利用多核上风),同时作为轻量的中间层,担任路由、Controllers、Views、以及视图的衬着,数据的猎取经由历程RESTful的API接口运用JSON花样交互。而后端则只须要担任营业逻辑、数据存储、Models,并为前端供应JSON数据即可。

如许转变以后,Node端能够举行首屏衬着等页面加载方面的优化,页面衬着出来以后后续的交互、衬着都交由浏览器端的JavaScript代码来完成,Node端的模板和浏览器端的模板大部分状况下都是雷同的,所以我们须要斟酌模板重用的题目。我们用Juicer替换了Express框架默许的模板引擎,Juicer是一个高效、轻量的前端 (Javascript) 模板引擎,效力和易用是它寻求的目的。除此以外,它还能够运转在 Node.js 环境中。经由历程Juicer,能够处置惩罚Node端和浏览器端的模板、Helper复用题目。而且基于前后端星散的工程架构下,前端的代码堆栈和后端断绝,前端自力担任前端静态资本文件、模板文件、Controller的保护和宣布。

根据如许从新定义前后端分工以后,前端能够做的事变较以往更多了,比方微信SDK的接入,因为微信JS SDK的运用须要在效劳端举行署名,所以如今我们不须要后端介入,前端完全能够自力完成微信SDK的接入。另外像我们内部和商家端SSO登录逻辑的接入都完全由前端自力完成。

手艺选型的思索

关于前端的手艺选型,我们始终保持理性、拥抱的立场。我们不会为了自觉求新而引入新的手艺,手艺选型是针对我们如今大团队的场景,为了处置惩罚以往合作历程当中发明的一些痛点和不足。比方引入Node是为了革新前后端的工作流和效力,提拔前后端的开辟体验。再比方如今我们项目中采纳的Angular、React也是针对特定的营业场景,为了提拔开辟效力、加强代码的可保护性。在我们的营业运用中,面向商家、背景的一些增编削查体系,Angular能够明显的提拔开辟效力,而React我们如今只是在面向用户的PC端项目中在做一些尝试和实践。

带来的应战

如许的分工和架构情势在给前端带来更多可能性、更多方便的同时,也带来了不小的应战,比拟传统的前端角色而言,我们须要更多的关注线上效劳的状态,历程内存占用、CPU占用的细致状态,以及线上非常的监控等。在我们拥抱Node的同时,对前端的才能要求是更上一阶的。一段看起来平常的JS代码,在浏览器端和在Node端两种差别的运转环境下,就可能会暴露出一些以往关注不到的题目,比方内存泄漏:一个闭包或许一个用于缓存数据的对象,跟浏览器差别,Node对内存泄漏非常敏感,因为线上运用有不计其数以至百万计的流量,所以哪怕是一个字节的内存泄漏也会形成内存聚集,从而致使渣滓接纳历程耗时增添,运用相应迟缓,晓得历程内存溢出,运用重启或崩溃。

内存泄漏题目的定位

以下是我们在临盆环境遭受的一个案例:近来发明线上效劳的内存占用在效劳重启后会呈线性的增进,历程启动18小时后,内存就已占用靠近1.6G摆布,以后不久便会凌驾V8的内存限定致使效劳重启。从图中能够看出,在修复之前内存运用状况一直在随时候举行周期性的波动,波动的缘由就是线上Node历程不停的重启致使的。

《[ 好文分享 ] 美团旅店Node全栈开辟实践》
尽人皆知,在V8的渣滓接纳机制下,平常的代码很少涌现内存泄漏的状况,然则一旦涌现内存泄漏每每较难排查。但形成内存泄漏的实质缘由只要一个,就是应该接纳的对象没有平常被接纳,变成了须生代中的常驻对象。幸亏借助一些罕见的排查东西能够协助我们定位内存泄漏的详细缘由:

- v8-profiler
- node-heapdump
- node-mtrace
- dtrace
- node-memwatch

这里我们运用node-heapdump来在模仿接见的前提下天生堆内存的snapshot,并经由历程Chrome的开辟者调试东西对天生的snapshot文件举行剖析。经由历程对照效劳刚启动时以及运用AB模仿并发接见一段时候后的heapdump信息能够比较轻易的定位到内存泄漏的题目点:是因为Juicer默许开启了cache,会默许对编译后的模板举行缓存,因而跟着接见的增进和并发要求,cache对象会延续增进且不被接纳,因而封闭cache并从新布置上线后线上恢复平常。

因为在浏览器的场景中运转时候短,且运转在用户的机械上,即使内存运用过量或许内存泄漏,也只会影响到用户的终端。而且运转时候短,跟着历程的退出,内存也会随之开释,几乎没有太多内存治理的必要。但在Node端一样的代码就可能会暴露出题目。

线上效劳的运维和监控

前后端星散除了意味着代码堆栈的星散、开辟合作的星散以外,还涉及到线上效劳的自力宣布和零丁布置。与之俱来的当然是前端怎样更好地对线上效劳举行更细粒度的运维和监控,我们的SA会更多的关注线上效劳的团体目标和可用性,而前端更愿望能够细粒度的相识线上Node的历程状态以及非常状况。

PM2是一款优异且开源的Node历程治理东西。我们在PM2的基础上做了一些革新,同时在云端布置了数据收集、数据及时猎取的效劳,从而形成了我们如今已运用到线上的Node布置监控平台PM2.5,它能够将线上Node效劳历程级别的细粒度信息聚合在云端举行处置惩罚和可视化展现,PM2.5能够监控Node Server和历程的各项目标状态,且能够设置报警并在各终端(Web、iPhone、Apple Watch)展现。

PM2.5的效劳架构

简朴引见下PM2.5的效劳架构:临盆环境的Node效劳经由历程PM2.5 CLI举行布置,PM2.5 CLI会延续不停的将Node历程的各项数据上报到PM2.5的云端。云端收到上报的数据后会对原始数据举行处置惩罚并存储至MongoDB。而Web端和iOS运用都邑经由历程WebSocket效劳从效劳端取得及时的数据流,然后经由历程前端举行可视化的信息展现。

《[ 好文分享 ] 美团旅店Node全栈开辟实践》

PM2.5的内部完成

当Node历程经由历程PM2.5启动时,PM2.5 CLI会同云端效劳举行握手,握手胜利后才会络绎不绝的举行数据的上报。上报时起首会将数据举行AES256加密,然后运用TCP通讯将数据上报到效劳器,这里用到了开源的Axon,云端效劳器收到数据后会将数据入库存储到MongoDB中,同时会举行监控报警的扫描,假如当前数据相符用户定阅的监控报警前提,则会经由历程云端的Push效劳向iOS客户端推送报警信息。云端同时运转WebSocket效劳,为多个终端(Web平台、iOS运用)供应及时数据的推送。

这里值得一提的是,PM2.5的客户端是基于React-Native开辟,如今已提交Apple Store正在考核,考核经由历程后就能够从Apple Store中下载到了,客户端供应了效劳和历程基础目标的检察,同时能够合营Web平台的监控报警设置完成7×24小时对效劳的监控。

《[ 好文分享 ] 美团旅店Node全栈开辟实践》

别的监控设备的接入

为了确保线上效劳的牢靠、稳固,我们还接入了别的一些监控设备和日记平台,便于对线上的毛病和接见日记举行追踪、剖析和定位处置惩罚。

Zabbix

Zabbix是一种分布式体系监控以及收集监控功用的企业级开源中间件,主如果被运维运用。Zabbix重要用于对效劳举行心跳检测、监控效劳的各项目标,当某些目标非常或凌驾设定的阈值时举行短信、大象、邮件的报警。

Sentry 毛病日记收集

Sentry是一个毛病日记效劳器,能够将顺序毛病的细致状况集合捕捉。而且供应种种罕见言语的SDK供营业接入。但Sentry在效劳器端会有采样,平常不能替换及时毛病日记报警的监控。

日记监控平台

日记监控平台是美团内部的一个日记收集体系,如今美团一致运用flume收集日记,flume具有吸收scribe花样日记的才能,而日记监控平台也是以scibe花样日记来收集。日记在全部收集流程中以两种情势存在,分别是原始日记和剖析后的日记。如今我们运用日记监控平台重要用于将接见日记的花样化数据上报,以后就能够经由历程Hive/Presto对接见数据举行查询了。

机能监控平台

机能监控平台为美团各平台和产品线供应简朴易用的、端到端的机能数据效劳。同时也供应了种种罕见言语的SDK供营业接入。重要用于剖析Node端的接口相应,以及浏览器端的页面载入机能。

小结

以上是美团旅店前端在运用Node举行全栈开辟的历程当中探索前行的一些心得,也是引子,重要引见了我们旅店事业部的前后端星散架构,线上内存泄漏题目的排查,和所运用的Node效劳监控平台PM2.5,后续我会分享更多我们的Node方面的一些实践,以及PM2.5监控平台的背地完成,愿望能对你有所协助,也迎接人人能够介入进来配合交换前后端星散和Node相干的手艺点。

    原文作者:kraaas
    原文地址: https://segmentfault.com/a/1190000002961282
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞