Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Node.js 服务前端数据接口的演进

代码之力
December 05, 2016

Node.js 服务前端数据接口的演进

来自淘宝前端的九十 的分享

代码之力

December 05, 2016
Tweet

More Decks by 代码之力

Other Decks in Programming

Transcript

  1. 关于我 九⼗十 (a.k.a ⺩王光) @淘宝 2014 年开始在淘宝 FED 做⼀一些 Node.js

    相关的⼯工作 现在⼿手头在做⼀一些 Node.js 全栈项⺫⽬目和底层容器的⼯工作 Twitter: @GuangWong
  2. 业务应⽤用-业务逻辑 浏览器 界⾯面交付语⾔言 业务应⽤用- Node.js 部分 纯粹数据 根据业务需求交付数据接⼝口 对数据做约束、定义 Schema

    增强协作、异步开发效率 拼装 (渲染) HTML 也许 JSON Over HTTP 也许 Hessian Over HSF 前端在服务器和客户端的 基础技术⽅方案得以统⼀一 所谓半栈 Java / C++… 我们是怎么应⽤用 Node.js 的
  3. BFF 开始萌芽 桌⾯面 Web 底层系统 (Java 或 C++) 垂直业务系统 横向业务平台系统

    运营相关系统 等等 Node.js 部分 桌⾯面 Web 的半栈 ⾯面向多终端的视图数据⺴⽹网关 其他终端 (ReactNative、Weex) HTML JSON
  4. BFF 开始萌芽 桌⾯面 Web 底层系统 (Java 或 C++) 垂直业务系统 横向业务平台系统

    运营相关系统 等等 Node.js 部分 桌⾯面 Web 的半栈 ⾯面向多终端的视图数据⺴⽹网关 终端 (ReactNative、Weex) HTML JSON 怎么调⽤用?
  5. 不过依然有⼀一个⼩小问题 • 那些后端应⽤用⼤大部分都是 Java 的,⽤用的最多的序列化是 Hessian ! • Node.js 想调⽤用

    HSF 需要⼿手拼 Hessian ! • Java 反射拿到的类型信息⾃自动做了 Mapping • 分析 Jar ⾃自动做了 Mapping • 所以也算解决了 阿⾥里巴巴内部早有⼀一个服务框架 基本上也覆盖了多语⾔言调⽤用的问题 • 早期 Node.js 有 C++ 版本的 Binding • 现在也有纯 Node.js 的版本
  6. BFF 开始萌芽 桌⾯面 Web 底层系统 (Java 或 C++) 垂直业务系统 横向业务平台系统

    运营相关系统 等等 Node.js 部分 桌⾯面 Web 的半栈 ⾯面向多终端的视图数据⺴⽹网关 终端 (ReactNative、Weex) HTML JSON 怎么样才是⾯面向多终端 的视图数据⺴⽹网关?
  7. ⾯面向多终端的数据⺴⽹网关 ⼀一些尝试: GraphQL • 良好的查询语⾔言 • 对多终端的碎⽚片化版本⽀支持很赞 • 和 React

    体系兼容性好 • 完善的⼤大问题建模语⾔言 • 可以实现将多个系统、多个领域的模 型统⼀一表⽰示 • 客户端只需要使⽤用简单的查询语⾔言便 可覆盖各种问题 了解更多请⾄至淘宝 FED 博客
  8. ⾯面向多终端的数据⺴⽹网关 ⼀一些尝试: GraphQL • 良好的查询语⾔言 • 对多终端的碎⽚片化版本⽀支持很赞 • 和 React

    体系兼容性好 • 完善的⼤大问题建模语⾔言 • 可以实现将多个系统、多个领域的模 型统⼀一表⽰示 • 客户端只需要使⽤用简单的查询语⾔言便 可覆盖各种问题 了解更多请⾄至淘宝 FED 博客 { user(id: 3500401) { name, profilePicture(size: 50) { uri, width, height } } }
  9. 底层系统 (Java 或 C++) 垂直业务系统 横向业务平台系统 运营相关系统 等等 Node.js 部分

    App1 集群 终端 (ReactNative、Weex) JSON App2 集群 App3 集群 App4 集群
  10. 问题:业务脚本沙箱 了解更多请⾄至淘宝 FED 博客 src/node_contextify.cc Persistent<Context> context_; 基本只有在 Full GC

    时才能清理 1. 然⽽而 Node.js 分代内存管理策略,让费时费 ⼒力的 Full GC 很少使⽤用(2/8 法则是 GC 领 域⾮非常重要的发现) 2. 弱减少 new-space-size 的⼤大⼩小倒是能频繁 触发 Full GC 可程序效率就感⼈人了 3. 如果 keep 较⼤大的 new-space-size ,进⾏行⼀一 次⼤大型的 Full GC 也感⼈人 4. 所以怎么样都不靠谱
  11. 那回到 PL 的思路来处理吧 const ds = require('@ali/ds'); const moment =

    require('moment'); const result = ds.invoke('setNotice', { time: moment().add(1, 'days').format(), message: $params.message, userId: $context.userId }); module.exports = result; 问题:业务脚本沙箱
  12. 那回到 PL 的思路来处理吧 const ds = require('@ali/ds'); const moment =

    require('moment'); const result = ds.invoke('setNotice', { time: moment().add(1, 'days').format(), message: $params.message, userId: $context.userId }); module.exports = result; const ds = __sealing_unbinding('require', typeof require !== 'undefined' ? require : undefined)('@ali/ds'); const moment = __sealing_unbinding('require', typeof require !== 'undefined' ? require : undefined)('moment'); const result = ds.invoke('setNotice', { time: moment().add(1, 'days').format(), message: __sealing_unbinding('$params', typeof $params !== 'undefined' ? $params : undefined).message, userId: __sealing_unbinding('$context', typeof $context !== 'undefined' ? $context : undefined).userId }); module.exports = result; @ali/sealing 这只是⼀一个简单例⼦子,还有很多场景要处理 问题:业务脚本沙箱
  13. 问题:动态容灾 CDN ⽤用户 视图数据中⼼心 数据源 容灾数据 线下容灾数据 准备服务 1. 先拉取规则再计算副本地

    址 2. 拉取该副本,否则使⽤用打 底版本 1. 先拉取规则再计算副本地 址 2. 拉取该副本,否则使⽤用打 底版本 根据配置的参数发现规则, 汇报新发现的动态参数 定时根据发现的动态参数 的排列组合更新容灾数据