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
470
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
510
Thrift下的Node.js跨语言异构.pdf
shiningray
0
550
ActionCable和实时交互
shiningray
0
690
Git, Code Review & Continous Integration
shiningray
0
230
Fiber and em-synchrony
shiningray
2
410
屌丝程序员如何打造日PV百万的网站架构.pdf
shiningray
68
26k
Other Decks in Programming
See All in Programming
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
510
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
4
1k
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
680
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
New "Type" system on PicoRuby
pocke
1
730
AIとRubyの静的型付け
ukin0k0
0
550
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.5k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
330
AIエージェントの隔離技術の徹底比較
kawayu
0
470
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
340
Modding RubyKaigi for Myself
yui_knk
0
910
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
GraphQLとの向き合い方2022年版
quramy
50
15k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
The Pragmatic Product Professional
lauravandoore
37
7.3k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Site-Speed That Sticks
csswizardry
13
1.2k
The SEO Collaboration Effect
kristinabergwall1
1
480
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
The browser strikes back
jonoalderson
0
1.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
200
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