Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
530
Thrift下的Node.js跨语言异构.pdf
shiningray
0
560
ActionCable和实时交互
shiningray
0
700
Git, Code Review & Continous Integration
shiningray
0
240
Fiber and em-synchrony
shiningray
2
430
屌丝程序员如何打造日PV百万的网站架构.pdf
shiningray
68
26k
Other Decks in Programming
See All in Programming
スマート反転とウェブアクセシビリティ
camiha
0
180
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
440
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
290
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
160
アクセシビリティから考える情報設計
high_g_engineer
0
350
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
650
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
What We Talk About When We Talk About XP
m_seki
2
490
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
650
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
56
38k
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
200
Featured
See All Featured
Design in an AI World
tapps
1
310
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Building an army of robots
kneath
306
46k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
410
Bash Introduction
62gerente
615
220k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
350
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
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