设为首页 收藏本站
查看: 1535|回复: 0

[经验分享] 花样直播秩序监管后台NodeJS总结

[复制链接]

尚未签到

发表于 2017-2-24 10:11:15 | 显示全部楼层 |阅读模式
花样直播秩序监管后台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解析、负载均衡等能力
    项目架构


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



秩序后台时序图


秩序后台前端架构

前端目录结构


前端请求流程图


NodeJS Server模块选型


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

nodejs server目录结构


|--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实践

  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模块,初始化固定的协议头,并向其中填充对应的值。
  •   将构造协议包的过程封装成一个构造函数,通过传参来序列化不同服务所需要的协议包


  •   使用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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346496-1-1.html 上篇帖子: ionic+nodejs开发遇到的跨域和post请求数据问题 下篇帖子: nodeJS连接MongoDB的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表