hyperv 发表于 2017-2-24 10:11:15

花样直播秩序监管后台NodeJS总结

花样直播秩序监管后台NodeJS总结




[*]花样直播秩序监管后台NodeJS总结

[*]平台成果

[*]业务侧
[*]技术侧


[*]项目架构

[*]秩序后台时序图
[*]秩序后台前端架构

[*]前端目录结构
[*]前端请求流程图


[*]NodeJS Server模块选型
[*]nodejs server目录结构


[*]NodeJS后台开发の初体验

[*]bookshelf实践
[*]NodeJS对接花样后台server协议
[*]tof鉴权
[*]短信服务
[*]NodeJS体验tips
[*]ES6 in NodeJS


[*]TODO
[*]参考文档


  花样直播秩序监管后台作为互动视频项目中首个以NodeJS开发的项目,应该把项目开发中遇到的挑战进行总结沉淀,供其他同学参考。

平台成果

业务侧


[*]秩序后台2015年12月15日跟随花样直播客户端首版一同发布。
[*]上线至今,共处理平台违规(含“警告”处理)1000多起,为花样直播平台的规范化保驾护航。
[*]接入公司短信服务。
[*]为解决秩序监管同学手动填写excel,输出操作日志记录的痛点,平台提供操作日志导出能力,提升运营人员工作效率。
[*]细粒度权限管理能力。
[*]监控墙依据用户操作习惯自动刷新。

技术侧


[*]NodeJS在互动视频项目中的首次试水
[*]打通NodeJS与后台服务进行protobuf协议通信的能力
[*]打通NodeJS进行tof鉴权的能力,并输出文档
[*]打通NodeJS调用C接口的能力
[*]接入公司L5服务,享受到L5提供的内网DNS解析、负载均衡等能力
项目架构

http://km.oa.com/files/post_photo/471/275471/7ec6d441fe3ff858cf2ce6aa2abf8a391458540483.jpg
M(ysql)E(xpress)A(ngular)N(ode)
使用CDB来替代传统MEAN架构中的MongoDB。
原因如下:
  Cloud Database(CDB)是腾讯公司为第三方开发人员提供的DB存储解决方案。TMC的主要特点包括:高性能、高可靠的Mysql服务;同时整合自动化管理工具,最大程度减少开发人员在部署、监控、扩容和故障恢复等方面的投入,使开发者可以集中精力进行产品开发和运营。



秩序后台时序图
http://km.oa.com/files/photos/pictures/201603/1458540254_38_w1447_h952.png

秩序后台前端架构

前端目录结构
http://km.oa.com/files/photos/pictures/201603/1458540286_46_w1294_h948.png

前端请求流程图
http://km.oa.com/files/photos/pictures/201603/1458540298_3_w951_h965.png

NodeJS Server模块选型


[*]后台开发框架:Express
[*]MySql数据库驱动器:node_mysql
[*]ORM框架:Bookshelf
[*]proto buff解析模块:protobufjs
[*]buffer处理模块:node-struct
[*]会话管理模块:express-seesion
[*]单元测试工具:mocha
[*]进程管理器:PM2(主要用于:守护进程、热重启以及输出服务器本地日志)
[*]异步流程控制模块:async
[*]excel导出模块:excel-export

nodejs server目录结构
http://km.oa.com/files/photos/pictures/201603/1458540348_93_w332_h492.png

|--bin
|启动程序的主脚本
|--models
|程序的数据库模型,在软件应用中,model通常代表一条数据库表的记录。
|包含Base.js,其余的model都是继承于Base,在Base.js中统一处理数据库连接等公共操作。
|--collections
|像表一样的一组model。 一个collection 通常代表一个完整的数据库表。
|包含Base.js,其余的collection都是继承于Base,在Base.js中统一处理分页,sql字符转义等公共操作。
|--controllers
|和其他的典型的MVC一样,负责应用的业务逻辑。controllers根据路由处理数据、查询数据库,处理来自秩序处罚平台的前端请求。
|包含Base.js,其余的collection都是继承于Base,在Base.js中统一处理数据校验,日期格式化,根据请求类型获取客户端传参,根据传参生成处罚内容等公共操作。
|--routes
|存放路由。
|包含Base.js,其余的route都是继承于Base,避免在每个route文件中重复书写加载express.Router()中间件的代码。
|--modules
|一些服务模块,比如protobuff解析模块,发送短信模块等。
|--config
|配置文件,比如根据NODE_ENV加载合适的数据库连接配置。
|--logs
|存放日志的目录
|--test
|测试脚本
|--package.json
|给npm的项目配置
|--README.md
|项目文档

NodeJS后台开发の初体验

bookshelf实践
http://km.oa.com/files/photos/pictures/201603/1458540335_56_w360_h86.png
  bookshelf.js是一款优秀的ORM框架,能够把数据库中的关系数据映射成为程序中的对象,使得数据库操作对程序员更友好 : )
优点:


[*]不需要开发者在model层中定义scheme,而是通过所连接的数据库表自动初始化model。
[*]依赖bluebird管理异步操作,避免使用者陷入callback hell(回调地狱)
  一些坑:


[*]默认主键名为id,需要在初始化model的时候通过idAttribute字段初始化为自己的主键名。
[*]delete的where子句只支持主键查询,且不支持复合条件。
[*]save()操作默认为update,若要insert,应该这样使用:save(null, {method: 'insert'})。

NodeJS对接花样后台server协议
  秩序后台NodeJS层需要对接各个花样后台server:


[*]封禁/解封艺人上麦、冻结/解冻房间状态变更通知:datasvr
[*]冻结/解冻房间踢人动作:roomsvr
[*]封禁/解封艺人登录:usermgrsvr
  问题:这些后台服务的通信序列化协议都是采用:固定包头+protobuf(包体)的形式,而并不是对JavaScript开发者最友好的JSON格式。这是主要是因为GoogleProtobuf这样的二进制序列化协议相比JSON、XML这样的文本序列化协议,序列化后的数据体积更小,解析(序列化与反序列化)速度更快。在更加注重性能的服务端,可以牺牲JSON人眼可读的优点,来换取性能。
  解决方案:


[*]使用protobufjs模块将js对象,根据约定好的protobuf协议,序列化成Buffer
[*]使用node-struct模块,初始化固定的协议头,并向其中填充对应的值。
[*]  将构造协议包的过程封装成一个构造函数,通过传参来序列化不同服务所需要的协议包
http://km.oa.com/files/photos/pictures/201603/1458540380_34_w876_h404.png

[*]  使用UDP协议传送给后台,异步方式


tof鉴权


[*]秩序后台tof鉴权指引:http://tapd.oa.com/interactiveAV/markdown_wikis/#1010115221005141277
[*]依据频道粒度进行权限管理

短信服务
  支持短信群发功能,方便运营同学以短信的形式向主播和会长发布通告。
  采取过的解决方案:

1. 使用签约平台的外网短信cgi,且不校验QQ登录态(因为秩序后台是oa站点,无法获得qq登录态)
    - 优点:开发成本低
    - 缺点:安全风险极高
2. nodejs调用C接口,并且使用nodejs实现短信服务私有的jsonToBinary协议
    - 优点:安全,实现的jsonToBinary方法可以在未来的nodejs代码中复用
    - 缺点:开发成本很高,且依赖高版本gcc,未来如果通过增加机器的方式平行扩容,需要升级机器的gcc版本,也有可能带来一些不可知的问题
3. 调用yaaf协议
    - 优点:安全,未来若遇到与yaaf协议通信的场景,可复用。
    - 缺点:开发成本高,且依赖的第三方模块非常多,有很多兼容性问题:node与gcc的兼容性,node与某些第三方node addon的兼容性
4. 调用花样管理后台:huayangadmin.oa.com本身的短信能力
    - 优点:安全,开发成本低
    - 缺点:秩序后台的域名是zhixu.huayang.oa.com,由于跨域的问题,花样管理后台无法获得秩序后台的oa登录态,如果需要适配,开发成本较高。
5. 调用签约签约平台的外网短信cgi,校验来源IP和uin
    - 优点:开发成本低
    - 缺点:有很低的安全风险
6. nodejs调用发送短信和jsonToBinary的c接口(最终方案)
    - 优点:开发成本低,安全
    - 缺点:依赖高版本gcc,未来如果通过增加机器的方式平行扩容,需要升级机器的gcc版本,也有可能带来一些不可知的问题。且需要使用织云下发msgqagent来支持,对前端不友好。

NodeJS体验tips


[*]require()引入的文件,需要加上文件后缀,提高解析效率。require()在分析标识符的过程中,出现了标识符不包含文件扩展名的情况,nodejs会按.js、.node、.json的次序补足扩展名,依次尝试。所以,如果是.node和.json文件,在传递给require()的标识符中带上扩展名,会加快一点速度。
[*]使用node-ffi调用c语言的接口。需要注意的是node-ffi目前支持c接口的封装,并不支持c++。其次,如果所使用的node版本的小版本号大于45(即大版本号大于io.js 3.0),安装node-ffi需要依赖支持c++ 11语法的编译器。而gcc 4.8+的版本才开始很好的支持c++ 11的语法。解决办法:
[*]找一台装了gcc 4.8的机器,安装与你生产环境相同的node版本,在那台机器上安装node-ffi然后再拷到你的生产机器上。或者直接将项目代码迁移到装有高版本gcc的机器上
[*]在你的生产机器上安装gcc 4.8+,但不改变原有的系统路径的gcc(避免影响机器上的其他业务),安装好的在新版本的gcc的/bin目录下,执行export PATH=``pwd``:$PATH 不过需要注意的是,安装高版本gcc的时候可能会因为公司网络环境的问题,无法安装一些依赖,可以通过~/.wgetrc将wget的代理设置为230机器。
[*]愉快的安装node-gyp(全局)和node-ffi
[*]利用node-gyp或者请后台同学帮忙,把C的源码文件封装成Linux下的.so动态链接库,Windows下应该是.dll文件,不过Windows场景比较少。
[*]参见ffi的文档和example,在node中实现c接口的调用。


ES6 in NodeJS
  本次项目基于NodeJS 5.2开发,该版本已支持ECMAScript6的部分特性,考虑到JavaScript是ECMAScript标准最重要的方言,也是前端工程师的主力开发语言,项目决定使用ES6进行开发,拥抱未来。
这一部分参考ouven对ES6的调研


[*]require()加载的模块,应该用const声明
const request = require('request');

[*]对象字面量增强,不应与ES5的对象字面量声明混用

// bad
let name = 'hehe';
let uin = '1234567';
let obj = {
name,
anchorUin: uin
}
// good
let name = 'hehe';
let anchorUin = '1234567';
let obj = {
name,
anchorUin
}
// good
let name = 'hehe';
let uin = '1234567';
let obj = {
name: name,
anchorUin: uin
}


[*]nodejs支持的ES6新特性,没列出的新特性均为不支持。



ES6新特性NodeJS兼容性



let,const,块级作用域
strict模式支持


class类
strict模式支持


Map, Set, WeakMap, WeakSet
支持


generators
支持


进制转换
支持


对象字面量扩展
支持


promises
支持


String对象新API
支持


symbols
支持


字符串模版
支持




[*]  本人实践中用的最多的特性:

[*]let,const
[*]Arrow Function
[*]对象字面量扩展
[*]字符串模版


[*]  吐槽:

[*]ES6的新特性在Nodejs中比babel还要差,而新版的babel已经能够支持es6的90%新特性了。
[*]还是挺想用函数参数增强的
[*]找回 Node.js 里面那些遗失的 ES6 特性
[*]个人觉得目前能在node中用的ES6特性没什么用,都是一些语法糖。



TODO


[*]  框架移植性

[*]后续管理后台类业务接入可以复用model、collection、controller、router层中的Base.js的公共能力。
[*]直接复用module层中protobuf协议解析、发送短信等模块。
[*]将目前秩序后台的业务代码与纯粹的server端代码进行剥离。
[*]借助织云实现自动化部署。


[*]  与目前管理后台框架的对比

[*]现有基于JAVA/Python的管理后台,有强大的配置化能力,前端的工作量相对较少,主要的工作量是在后台。这也带来了一个问题就是,当后台人力紧张时,管理后台需求由于优先级的问题,始终排不上。
[*]秩序后台这一套基于NodeJS的框架,相当于做了CGI的工作,也有直接操作数据库的能力,虽然暂时没有强大的配置化能力,但是对前端同学十分友好,能够让前端开发的同学快速介入管理后台服务端的工作,释放CGI的人力。



参考文档
  理解RESTful架构
我是怎么构建Node.js程序的
Implementing Pagination in Bookshelf.js and Express applications
翻译:Node.js十大常见的开发者错误
EcmaScript6 全规范(含node)
Nodejs下的ES6兼容性与性能分析
ES6 编码规范全部(含node部分)
Babel下的ES6兼容性与规范
找回 Node.js 里面那些遗失的 ES6 特性
页: [1]
查看完整版本: 花样直播秩序监管后台NodeJS总结