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

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

Avatar for 代码之力 代码之力
December 05, 2016

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

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

Avatar for 代码之力

代码之力

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. 拉取该副本,否则使⽤用打 底版本 根据配置的参数发现规则, 汇报新发现的动态参数 定时根据发现的动态参数 的排列组合更新容灾数据