知心王姐小饭桌 IM消息应用开发:一看看懂Protocol Buffer(协议篇)
前言
由于笔者业团队的业务对即时通讯服务有很大的依赖,春节结束后的第一天,红包没到,产品同学先到了,产品同学和我说要做一款IM,看到需求文档后和设计图后笔者大吃一斤
这不就是一个翻版的web qq吗?
可以可以
联想到最最近美团的大象,头条的Lark,用户与用户,商家与用户,企业同事的沟通,及其衍生的配套增值服务,真是需求旺盛的强需求啊
如果我要做一个WebIM应用
现在的Web应用通常会考虑ajax轮询或者是long polling的方式来实现,但是频繁的建立https连接,会带来多余请求和消息精准性的问题,本质上是TCP,消息边界不清晰,会有黏包的情况
类似我司ios和andorid客户端,采用socket+PB协议来解决及时通讯问题,采用socket服务,依赖google的oc PB协议包来实现,socket是基于TCP协议,由通信协议和编程API组成的,原理一次HTTP协议握手成功后,与服务器建立双向连接,数据就可以直接从TCP 通道传输基于事件的方式,二级制传输,反编译为json或者xml
笔者在查阅翻google PB开发者文档时,看到17年下半年google发布了官方的js的版本,配合websocket,可以与PB协议进行配合,在实现原理上,优于现有的ajax轮询或者是long polling的实现方式
So,Let's rock !
Protocol Buffer是个什么东东?
Protocol Buffer是Google提供的一种数据序列化协议,下面是我从网上找到的Google官方对protobuf的定义:
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
为什么是Node,为何要和Protocol Buffer打交道?
做为javascript开发者,对我们最好的数据序列化协议当然是JSON,pb协议相较于之前流行的XML更加的简洁高效
pb属于二进制协议,更容易解析,解析速度比文本协议有二向箔级别的压制,so,在聊天场景下,udp传输明显是优于tcp的
后台通信基本是基于二进制的,以往我们开发中用到的纯文本协议是后台同学在封装一层实现的,例如我司的服务,就维护了两套,一套二进制的,一套http接口的,如果可以用Node打通了pb,可以将维护成本降到最低,理论上只有一套底层二级制服务
ps. 类似PB这样的东西,还有MessagePack和Apache Thrift
说的这么热闹,老夫已经迫不及待了!
想必你已经说,别逼逼,show me the code,怎么好的开发都么上进呢?
好吧,Let's Rock & Roll!
官方案例
我们来操作一下
安装google-protobuf
2017年4月开始官方支持javascript
github
develops
npm install google
-protobuf
定义.proto文件
proto文件 messages.proto
package zxwj;
syntax = "proto3";
message helloworld
{
string zzuid = 123;
string zzstatus = 0;
}
编译.proto文件
使用protobuf.js命令行工具编译
protoc --js_out=import_style=commonjs,binary:. messages.proto
protoc会编译输入文件,并且构建messages_pb,在sever中,可以以以下方式引用
var messages = require('./messages_pb');
var message = new messages.MyMessage();
编写server.js
var basepb = require('./messages_pb');
console.log(basepb);
var message = new basepb.SearchRequest();
console.log(message);
message.setName("TS");
message.setPassword("123456");
var bytes = message.serializeBinary(); //对象序列化
console.log(bytes);
var message2 = basepb.SearchRequest.deserializeBinary(bytes); //进制序列化
console.log(message2);
运行
node sever.js
总结一下
上个案例并不具备线上产品能力,但是还可以能看出PB协议的优势所在
快,从官方的测试结果来看,整体比較起來,ProtoBuf.js 則是比纯JSON 的处理快上一倍以上,附官方Github测试结果(机器配置:i7-2600K。Node.js 版本:6.9.1)
benchmarking encoding performance ...
Type.encode to buffer x 547,361 ops/sec ±0.27% (94 runs sampled)
JSON.stringify to string x 310,848 ops/sec ±0.73% (92 runs sampled)
JSON.stringify to buffer x 173,608 ops/sec ±1.51% (86 runs sampled)
Type.encode to buffer was fastest
JSON.stringify to string was 43.5% slower
JSON.stringify to buffer was 68.7% slower
benchmarking decoding performance ...
Type.decode from buffer x 1,294,378 ops/sec ±0.86% (90 runs sampled)
JSON.parse from string x 291,944 ops/sec ±0.72% (92 runs sampled)
JSON.parse from buffer x 256,325 ops/sec ±1.50% (90 runs sampled)
Type.decode from buffer was fastest
JSON.parse from string was 77.4% slower
JSON.parse from buffer was 80.3% slower
benchmarking combined performance ...
Type to/from buffer x 254,126 ops/sec ±1.13% (91 runs sampled)
JSON to/from string x 122,896 ops/sec ±1.29% (90 runs sampled)
JSON to/from buffer x 88,005 ops/sec ±0.87% (89 runs sampled)
Type to/from buffer was fastest
JSON to/from string was 51.7% slower
JSON to/from buffer was 65.3% slower
benchmarking verifying performance ...
Type.verify x 6,246,765 ops/sec ±2.00% (87 runs sampled)
benchmarking message from object performance ...
Type.fromObject x 2,892,973 ops/sec ±0.70% (92 runs sampled)
benchmarking message to object performance ...
Type.toObject x 3,601,738 ops/sec ±0.72% (93 runs sampled)
接下来要做的事情
PB的优势场景是IM中的数据存储和交互,如果要实现一个高品质的IM,信息流的稳定和边界很重要,我们还需要完善以下几个部分
稳定可维护的Node socket.io服务(socket篇)
PB的动态编译的特性和嵌套message,数据结构简单化(数据篇)
前端对于二级制的的处理,例如ArrayBuffer,序列化与反序列化,MD5加密(加密篇)
知心王姐小饭桌 IM消息应用开发:一看看懂Protocol Buffer(协议篇)相关推荐
- uniapp兼容H5和小程序订阅消息授权开发封装,使用方便
本文使用 uniapp 框架开发,因为H5的订阅消息和小程序的订阅消息的授权流程不一样,但是很多地方需要使用授权,所以我封装了一个兼容H5和小程序订阅消息授权的方法,使用比较方便,希望能够帮助到你,实 ...
- uni-app微信小程序订阅消息功能开发(流程讲解篇)
温馨提示 微信小程序中废弃了"模板消息",,微信小程序模板消息 使用场景 首先我们需要明白微信订阅消息使用场景,比如客户点了一份美团外卖客户需要知道当前订单商家是否接单,或订单是否 ...
- PMCAFF | 小饭桌实战沙盘心得:积累不确定性中的确定性优势,一步步走向成功...
在不确定的创业浪潮里,有哪些确定性是我们可以把握,从而慢慢积累成为自己的创业优势,最终成为市场赢家的? 通过周末小饭桌这次下午2:30-晚上10点的沙盘演练,有幸同时收获了失败与成功,看到了对比胜出的 ...
- 小饭桌沙盘演戏商战-老友记成长
小饭桌沙盘演戏商战-老友记成长 CEO-应磊 副董-吴师展 CFO-康杰 CPO-骆勤 CMO-刘羡然 HR-宋硕 第一次知道小饭桌,似乎还是@fenng推荐的(微博).看了小饭桌的会议介绍,发现来头 ...
- 微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题
微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题 参考文章: (1)微信小程序模板消息(服务通知消息)原始post工具 ...
- in java中文版百度云 thinking_小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送...
前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,<借助云开发实现小程序订阅消息和模板消息的推送功能>是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序 ...
- 小程序消息服务器webapi,小程序订阅消息
# 小程序订阅消息 # 功能介绍 消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验. 订阅消息推送位置:服务通知 订阅消息下发条件:用户自主订阅 订阅消 ...
- 小程序统一服务消息_微信团队发布小程序模板消息能力调整通知:小程序订阅消息接口正式上线...
10月13日,微信团队发布了小程序模板消息能力调整通知.微信团队表示,此前的模板消息接口将停止使用,小程序订阅消息接口正式上线.据了解,新上线的小程序订阅消息,同时支持一次性和长期性订阅消息,用户可以 ...
- 微信小程序模板消息群发解决思路
基于微信的通知渠道,微信为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验.(微信6.5.2及以上版本支持模板功能.低于该版本将无法收到模板消息.) 模板推送位置:服务通 ...
最新文章
- 独家 | 使用机器学习预测房价(附链接)
- 好用的爬虫软件?动态ip软件告诉你
- 机器学习:数据驱动的科学
- python requests 发送 上传 多个文件
- 【Arduino】十秒挑战
- Realm数据库版本迁移
- UITableView,UICollectionView,UIScrollView快速返回顶部
- Leetcode--209. 长度最小的子数组
- * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法
- bzoj2547 [Ctsc2002]玩具兵 dp+二分匹配
- 苹果为何没赶上5G手机的“首班车”?
- The Suspects(并查集入门)
- android 设置特殊字体,Android引入外部自定义特殊字体的方法
- PHP168整站系统0DAY漏洞预警
- 在Micrium uC/Probe中添加IAR生成的.out文件的问题
- 90后程序员的头发危机
- ocr---训练自己的数据实现文本检测(kears实现east网络)
- 高级密码学复习1-HUST版
- 使用蒙特卡罗方法计算圆周率
- html文字段落设置,p字间距 html段落内文字设置字间距间隔
热门文章
- 大数分解Pollard_rho模板
- .NET周报【11月第2期 2022-11-15】
- 一个人的朝圣深度感悟_朝圣之末找到更强大的WordWrap函数
- VO,DTO,DO,PO区别
- ubuntu 16.04极速安装ROS-Kinetic,以及常见错误处理
- 2018应届毕业生找工作经历
- vs2008编译QT开源项目--太阳神三国杀源码分析(三) 皮肤
- mysql varchar 单引号_char、varchar数据类型值在使用时可以要用单引号或双引号括起来。...
- F: Pond Skater(BFS)
- Cortex-M系列:错误异常