Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Node.js 服务前端数据接口的演进
Search
代码之力
December 05, 2016
Programming
480
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Node.js 服务前端数据接口的演进
来自淘宝前端的九十 的分享
代码之力
December 05, 2016
More Decks by 代码之力
See All by 代码之力
兔基-多通证的自治贴吧
shiningray
1
320
Nodejs直出套路
shiningray
2
520
Thrift下的Node.js跨语言异构.pdf
shiningray
0
550
ActionCable和实时交互
shiningray
0
690
Git, Code Review & Continous Integration
shiningray
0
240
Fiber and em-synchrony
shiningray
2
420
屌丝程序员如何打造日PV百万的网站架构.pdf
shiningray
68
26k
Other Decks in Programming
See All in Programming
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
190
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
190
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
690
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
620
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
470
その節約、円になってますか?
isamumumu
0
430
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.6k
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
250
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
730
Foundation Models frameworkで画像分析
ryodeveloper
1
160
AIが無かった頃の素敵な出会いの話
codmoninc
1
280
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
190
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
160
Ethics towards AI in product and experience design
skipperchong
2
330
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
The SEO Collaboration Effect
kristinabergwall1
1
510
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
370
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
220
BBQ
matthewcrist
89
10k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
430
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
A Tale of Four Properties
chriscoyier
163
24k
Transcript
关于我 九⼗十 (a.k.a ⺩王光) @淘宝 2014 年开始在淘宝 FED 做⼀一些 Node.js
相关的⼯工作 现在⼿手头在做⼀一些 Node.js 全栈项⺫⽬目和底层容器的⼯工作 Twitter: @GuangWong
Node.js 服务前端数据接⼝口的演进 九⼗十 @ 淘宝
我们经历了什么 桌⾯面 Web 时代 BFF 的思想开始萌芽 中⼼心化的视图数据服务 2014 2015 2016
多终端开始爆发 {
桌⾯面 Web 时代 我们赶上了⼀一个时代的尾巴 拱宸桥 (1631年) @ 杭州 / 京杭⼤大运河的终点也是起点
业务应⽤用 浏览器 界⾯面交付语⾔言 根据业务模型渲染⻚页⾯面(交付 物) ⼤大多数情况是 HTML ⼤大多数情况是展⽰示 HTML JS
也只是简单增强 Java / C++ / Node.js… 这个时代的特点
业务应⽤用-业务逻辑 浏览器 界⾯面交付语⾔言 业务应⽤用- Node.js 部分 纯粹数据 根据业务需求交付数据接⼝口 对数据做约束、定义 Schema
增强协作、异步开发效率 拼装 (渲染) HTML 也许 JSON Over HTTP 也许 Hessian Over HSF 前端在服务器和客户端的 基础技术⽅方案得以统⼀一 所谓半栈 Java / C++… 我们是怎么应⽤用 Node.js 的
终端开始爆发
多端不⽌止是端种类的爆发 更是端能⼒力的爆发 ⼀一不⼩小⼼心把 HTML ⾰革命没了 都没有界⾯面交付语⾔言… 半栈玩不下去了...
BFF 的思想开始萌芽 多端时代的开始 Iron Bridge (1779年) @ UK / 世界⾸首座铸铁⼤大桥,结构却是⽊木⼯工的结构
术语解释 BFF(Backend for Frontend) 1. BFF(Backend for Frontend)意为前端专设⼀一个服务端 2. 从底层服务抓取数据、组装、裁剪,然后提供给前端
3. BFF 专为前端服务,要能够快速响应前端的变化,提供各种 各样的数据
术语解释 BFF(Backend for Frontend) 1. BFF(Backend for Frontend)意为前端专设⼀一个服务端 2. 从底层服务抓取数据、组装、裁剪,然后提供给前端
3. BFF 专为前端服务,要能够快速响应前端的变化,提供各种 各样的数据
BFF 开始萌芽 桌⾯面 Web 底层系统 (Java 或 C++) 垂直业务系统 横向业务平台系统
运营相关系统 等等 Node.js 部分 桌⾯面 Web 的半栈 ⾯面向多终端的视图数据⺴⽹网关 其他终端 (ReactNative、Weex) HTML JSON
BFF 开始萌芽 桌⾯面 Web 底层系统 (Java 或 C++) 垂直业务系统 横向业务平台系统
运营相关系统 等等 Node.js 部分 桌⾯面 Web 的半栈 ⾯面向多终端的视图数据⺴⽹网关 终端 (ReactNative、Weex) HTML JSON 怎么调⽤用?
不过依然有⼀一个⼩小问题 • 那些后端应⽤用⼤大部分都是 Java 的,⽤用的最多的序列化是 Hessian ! • Node.js 想调⽤用
HSF 需要⼿手拼 Hessian ! • Java 反射拿到的类型信息⾃自动做了 Mapping • 分析 Jar ⾃自动做了 Mapping • 所以也算解决了 阿⾥里巴巴内部早有⼀一个服务框架 基本上也覆盖了多语⾔言调⽤用的问题 • 早期 Node.js 有 C++ 版本的 Binding • 现在也有纯 Node.js 的版本
BFF 开始萌芽 桌⾯面 Web 底层系统 (Java 或 C++) 垂直业务系统 横向业务平台系统
运营相关系统 等等 Node.js 部分 桌⾯面 Web 的半栈 ⾯面向多终端的视图数据⺴⽹网关 终端 (ReactNative、Weex) HTML JSON 怎么样才是⾯面向多终端 的视图数据⺴⽹网关?
⾯面向多终端的数据⺴⽹网关 ⼀一些尝试: GraphQL • 良好的查询语⾔言 • 对多终端的碎⽚片化版本⽀支持很赞 • 和 React
体系兼容性好 • 完善的⼤大问题建模语⾔言 • 可以实现将多个系统、多个领域的模 型统⼀一表⽰示 • 客户端只需要使⽤用简单的查询语⾔言便 可覆盖各种问题 了解更多请⾄至淘宝 FED 博客
⾯面向多终端的数据⺴⽹网关 ⼀一些尝试: GraphQL • 良好的查询语⾔言 • 对多终端的碎⽚片化版本⽀支持很赞 • 和 React
体系兼容性好 • 完善的⼤大问题建模语⾔言 • 可以实现将多个系统、多个领域的模 型统⼀一表⽰示 • 客户端只需要使⽤用简单的查询语⾔言便 可覆盖各种问题 了解更多请⾄至淘宝 FED 博客 { user(id: 3500401) { name, profilePicture(size: 50) { uri, width, height } } }
但是 GraphQL 对下层的数据体系的领域模型抽象要求很⾼高 ⼀一些简单的⽅方案⽐比如 JSON-RPC 覆盖这个问题成本更低 不过能沉淀下的价值也相应变⼩小 这就要看投⼊入产出了
当⼀一个应⽤用的 桌⾯面 Web 的半栈 被彻底拿掉 就剩⼀一个包数据的⺴⽹网关了 每个业务搞⼀一个集群包视图数据?
底层系统 (Java 或 C++) 垂直业务系统 横向业务平台系统 运营相关系统 等等 Node.js 部分
App1 集群 终端 (ReactNative、Weex) JSON App2 集群 App3 集群 App4 集群
开始尝试 中⼼心化的视图数据服务
中⼼心化的视图数据服务 就像 55144 根钢丝吊起来的⾦金⻔门⼤大桥 ⾦金⻔门⼤大桥 (1937年) @ 旧⾦金⼭山 / 著名的悬索桥,20
世纪桥梁⼯工程奇迹
中⼼心化的视图数据服务 数据源层:统⼀一收拢接⼊入 垂直业务系统 横向业务平台系统 运营相关系统 等等 业务脚本沙箱 ⾯面向多端的⺴⽹网关 CDN 容灾
异常警报 限流策略 慢接⼝口治理 多终端 (ReactNative、Weex) JSON 中⼼心化的视图服务 Powered By Node.js
问题:业务脚本沙箱 → 安全执⾏行第三⽅方脚本 → require(‘vm’).runInNewContext() 业务脚本沙箱 Resolved
问题:业务脚本沙箱 → 安全执⾏行第三⽅方脚本 → require(‘vm’).runInNewContext() 业务脚本沙箱 Resolved
问题:业务脚本沙箱 了解更多请⾄至淘宝 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. 所以怎么样都不靠谱
那回到 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; 问题:业务脚本沙箱
那回到 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 这只是⼀一个简单例⼦子,还有很多场景要处理 问题:业务脚本沙箱
问题:⾃自动容灾 还记得那次鞋⼚厂挂掉的事情么? 虽然挂掉之后股价竟然涨了... ⻚页⾯面直接报错了!空窗了! 我宝要求严格多了…
问题:⾃自动容灾 ⾸首先我们要定义接⼝口和⽤用户的关系 ⽤用户隐私 ⽤用户弱关联 ⽆无⽤用户关联 打底 (默认参数容灾) X √ √
动态容灾 (动态参数容灾) X X √ 如个⼈人中⼼心 如个性化推荐 纯展⽰示
问题:打底容灾 CDN ⽤用户 视图数据中⼼心 数据源 打底数据 线下容灾数据 准备服务 浏览器向 CDN
请求打底 机房内部⺴⽹网络 根据配置的默认参数定时 更新
问题:动态容灾 CDN ⽤用户 视图数据中⼼心 数据源 容灾数据 线下容灾数据 准备服务 1. 先拉取规则再计算副本地
址 2. 拉取该副本,否则使⽤用打 底版本 1. 先拉取规则再计算副本地 址 2. 拉取该副本,否则使⽤用打 底版本 根据配置的参数发现规则, 汇报新发现的动态参数 定时根据发现的动态参数 的排列组合更新容灾数据
以上是我们⾛走过的路 没有哪种模式更优秀、更先进 只有哪种更适合你当前的场景 如果你的问题越来越复杂 ⼦子系统越来越多,终端越来越多 中⼼心化的 BFF 未尝不是⼀一种好⽅方式 如果你是⼀一个初创团队 那些简单实⽤用的⽅方案是最有效的
还有很多想要分享,可是时间短暂 欢迎来 taobaofed.org ⼀一起交流 THX Follow me on Twitter @GuangWong