《Node在个人直播中的应用》 linkzhu

前端狗

2019/09/18 发布于 技术 分类

文字内容
1. Node在个人直播中的应用 IMWEB-linkzhu
2. 介绍 •腾讯前端工程师——朱林(link) •IMWEB团队成员 •齐齐互动视频、花样直播、NOW直播 •现在主要负责NodeJS在互动视频业务中的落地。
3. Contents 01 Part one 为啥要用Node? 02 Part two 异构系统中的通信实践 03 Part three 小结
4. PART 1 为啥要用Node?
5. Why Node? • 新应用NOW直播 • APP研发为主 • 直播内容秩序监管系统
6. Why Node? SEO 浏览器渲染负担 前后端耦合度 缓存利用率
7. Why Node? javascript everywhere! 一种开发语言 一种数据结构 全局性思维 沟通成本低
8. 异构系统中的通信实践 •Protocol Buffer PART 2 •CKV •ZooKeeper
9. 异构共存
10. 异构共存
11. 异构共存 如何解决NodeJS应用与已有系统或服务的交互问题呢?
12. 异构共存 开播服务(C++) 登录服务(CKV/C++) 首页推荐服务(ZooKeeper) 协议(传输协议+数据序列化协议) NOW直播秩序监管系统(Node) 私信/黑名单/...
13. 异构共存 传输协议: HTTP TCP UDP ...
14. 异构共存 传输协议: HTTP TCP UDP ...
15. 传输协议 HTTP: 应用层协议 应用广泛 支持任何类型的数据对象传输 无状态,不保持长连接 文本协议
16. 传输协议 Socket: 传输层协议 TCP & UDP 字节级传输数据 支持实时交互
17. 传输协议 HTTP: 文本协议 Server: Nginx \r\n Connection: keep-alive \r\n Content-Length: 707 http协议的接收端通过\r\n切分每一个字段,并通过字符串匹配得到每个字段的名 字与取值。
18. 传输协议 Socket: 二进制协议 Ngin x000 keep -ali ve00 0707 Server Connection Content-length
19. 传输协议 Socket: 封解二进制包
20. 异构共存 数据序列化协议: JSON XML 私有二进制协议 Protocol Buffer ...
21. 异构共存 数据序列化协议: JSON XML 私有二进制协议 Protocol Buffer ...
22. 数据序列化协议 •二进制协议 • 二进制协议对于计算机来说更容易解析(通过位移计算),在解 析速度上是JSON、XML这样的文本协议不可比拟的。 • 有tcp和udp两种选择,在一些场景下,udp传输的效率会更高。
23. 数据序列化协议 •私有的二进制协议 • {int32 id: 101, char[8] str: ‘Hello’} • 101Hello: 101 Hello
24. 数据序列化协议 •私有的二进制协议 怎么扩展字段???
25. 数据序列化协议 你值得更好的! 更小!更快!更灵活!
26. 异构共存 数据序列化协议: JSON XML 私有二进制协议 Protocol Buffer ...
27. Protobuf是什么鬼?
28. 官方定义: Protocol Buffers 是一种轻便高效的结构化数据 存储格式,可以用于结构化数据序列化,很适 合做数据存储或 RPC 数据交换格式。它可用于 通讯协议、数据存储等领域的语言无关、平台 无关、可扩展的序列化结构数据格式。目前提 供了 C++、Java、Python 三种语言的 API。
30. 一个栗子 NodeJS解析protobuf文件的第三方模块: protobuf.js:https://github.com/dcodeIO/ProtoBuf.js Google protobuf js: https://github.com/google/protobuf/tree/master/js protocol-buffers: https://github.com/mafintosh/protocol-buffers
31. 一个简单的栗子帮助理解
32. 一个栗子 书写protobuf文件 一个比较好的习惯是认真对待 proto 文件的文件名。比如将命名规则定于如下: packageName.MessageName.proto 在上例中,package 名字叫做 lm,定义了一个消息 helloworld,该消息有三 个成员,类型为 int32 的 id,另一个为类型为 string 的成员 str。opt 是一个 可选的成员,即消息中可以不包含该成员。
33. 一个栗子 使用protobuf.js的命令行工具编译 .proto 文件 https://github.com/dcodeIO/ProtoBuf.js/wiki/pbjs
34. 一个栗子 使用protobuf.js的命令行工具编译 .proto 文件: # ./pbjs ../../lm.message.proto -t commonjs > ../../lm.message.js 得到编译后的符合commonjs规范的js文件:
35. 一个栗子 编写 Writer
36. 一个栗子 编写Reader
37. 一个栗子 运行结果
38. 我们为什么要跟protobuf打交道? •私有的二进制协议 • {int32 id: 101, char[8] str: ‘Hello’} • 101Hello: 101 Hello 12个字节
39. 我们为什么要跟protobuf打交道? •Protocol Buffer • {int32 id: 101, string str: ‘Hello’} • 9个字节
40. 我们为什么要跟protobuf打交道? •JSON • {id: 101, str: ‘Hello’} • 24个字节
41. 我们为什么要跟protobuf打交道? 12 vs 9 vs 24 兼具二进制的高性能和JSON的灵活
42. 一个栗子 这个例子本身并无意义,但只要您稍加修改就可以将它变成更加有用的程序。比如 将磁盘替换为网络 socket,那么就可以实现基于网络的数据交换任务。而存储和交 换正是 Protobuf 最有效的应用领域。
43. 动态链接库
44. 动态链接库 • 避免造轮子 • 计算密集型任务 • npm install ffi
45. CKV (Cloud Key-Value)
46. 什么是CKV Memcached++ 专业运 营团队 双点 热备 集中 备份, 定点 回档 负载 均衡 高性 能
47. Why CKV 即时申请即时使用,开发者无需自行安装memcached。 -提供便利的运维系统,统计系统,拨测系统。 专 业 运 营 团 队 业务永远不用关注扩容,机器故障等问题。
48. Why CKV •接入机镜像,相互容灾 •存储机双机热备,自动切换 双 点 热 备 •集中备份中心,任意时间回档 •主备自动切换or人工切换 接入机 主机 备机
49. Why CKV •可配备集中备份中心。 集 中 备 份 , 定 点 回 档 •集中备份中心可完成定点回档。 镜像文件备份 + 流水旁路 + 恢复中心
50. Why CKV 负 载 均 衡 CKV后台有自动对负载过高的存储机进行负载调平,使 存储机器达到最佳的使用率。不必担心一批访问量都非 常低的业务分布再同一台机器上造成机器低负载或者使 用率达不到要求,成本增加。
51. Why CKV 高 性 能 •存储单机可同时提供19w/s的读和11w/s的写。 •接入单机提供19w/s的穿过能力。
52. 限制条件&适用场景 • Key长度不超过10K • Value长度不超过10M • 数据总量适合存储在内存中 • 任何Key-Value形式,写量很大的数据 • 延时敏感的业务
54. 什么是ZooKeeper?
55. 理想中的分布式应用,各个服务各司其职
56. 实际中的分布式应用,惊群、死锁、数据一致性...
57. ZooKeeper解决了什么问题? 核心:解决分布式系统中的一致性问题
58. ZooKeeper解决了什么问题? 核心:解决分布式系统中的一致性问题 评分系统 秩序监管 个性化推荐 开播状态 主播类型 …
59. ZooKeeper解决了什么问题? HOW?
60. ZooKeeper解决了什么问题? zookeeper会维护一个目录结点树,如下图:
61. ZooKeeper解决了什么问题? 每个节点znode可以被监控,包括监控某个目录中存储的数据变化,子目 录节点的变化,一旦变化可以通知设置监控的客户端。如下图:
62. PART 3 小结
63. Q&A THANKS!
64. JS大法!一统江湖! 写在最后!