前言

由于笔者业团队的业务对即时通讯服务有很大的依赖,春节结束后的第一天,红包没到,产品同学先到了,产品同学和我说要做一款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

  1. -protobuf

定义.proto文件

proto文件 messages.proto

  1. package zxwj;

  2. syntax = "proto3";

  3. message helloworld

  4. {

  5.   string zzuid = 123;  

  6.   string zzstatus = 0;

  7. }  

编译.proto文件

使用protobuf.js命令行工具编译

  1. protoc --js_out=import_style=commonjs,binary:. messages.proto

protoc会编译输入文件,并且构建messages_pb,在sever中,可以以以下方式引用

  1. var messages = require('./messages_pb');

  2. var message = new messages.MyMessage();

编写server.js

  1. var basepb = require('./messages_pb');

  2. console.log(basepb);

  3. var message = new basepb.SearchRequest();

  4. console.log(message);

  5. message.setName("TS");

  6. message.setPassword("123456");

  7. var bytes = message.serializeBinary(); //对象序列化

  8. console.log(bytes);

  9. var message2 = basepb.SearchRequest.deserializeBinary(bytes); //进制序列化

  10. console.log(message2);

运行

  1. node sever.js

总结一下

上个案例并不具备线上产品能力,但是还可以能看出PB协议的优势所在

快,从官方的测试结果来看,整体比較起來,ProtoBuf.js 則是比纯JSON 的处理快上一倍以上,附官方Github测试结果(机器配置:i7-2600K。Node.js 版本:6.9.1)

  1. benchmarking encoding performance ...

  2. Type.encode to buffer x 547,361 ops/sec ±0.27% (94 runs sampled)

  3. JSON.stringify to string x 310,848 ops/sec ±0.73% (92 runs sampled)

  4. JSON.stringify to buffer x 173,608 ops/sec ±1.51% (86 runs sampled)

  5.      Type.encode to buffer was fastest

  6.   JSON.stringify to string was 43.5% slower

  7.   JSON.stringify to buffer was 68.7% slower

  8. benchmarking decoding performance ...

  9. Type.decode from buffer x 1,294,378 ops/sec ±0.86% (90 runs sampled)

  10. JSON.parse from string x 291,944 ops/sec ±0.72% (92 runs sampled)

  11. JSON.parse from buffer x 256,325 ops/sec ±1.50% (90 runs sampled)

  12.    Type.decode from buffer was fastest

  13.     JSON.parse from string was 77.4% slower

  14.     JSON.parse from buffer was 80.3% slower

  15. benchmarking combined performance ...

  16. Type to/from buffer x 254,126 ops/sec ±1.13% (91 runs sampled)

  17. JSON to/from string x 122,896 ops/sec ±1.29% (90 runs sampled)

  18. JSON to/from buffer x 88,005 ops/sec ±0.87% (89 runs sampled)

  19.        Type to/from buffer was fastest

  20.        JSON to/from string was 51.7% slower

  21.        JSON to/from buffer was 65.3% slower

  22. benchmarking verifying performance ...

  23. Type.verify x 6,246,765 ops/sec ±2.00% (87 runs sampled)

  24. benchmarking message from object performance ...

  25. Type.fromObject x 2,892,973 ops/sec ±0.70% (92 runs sampled)

  26. benchmarking message to object performance ...

  27. Type.toObject x 3,601,738 ops/sec ±0.72% (93 runs sampled)

接下来要做的事情

PB的优势场景是IM中的数据存储和交互,如果要实现一个高品质的IM,信息流的稳定和边界很重要,我们还需要完善以下几个部分

  • 稳定可维护的Node socket.io服务(socket篇)

  • PB的动态编译的特性和嵌套message,数据结构简单化(数据篇)

  • 前端对于二级制的的处理,例如ArrayBuffer,序列化与反序列化,MD5加密(加密篇)

一看看懂Protocol Buffer(协议篇)的更多相关文章

  1. Google Protocol Buffer 协议

    1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...

  2. protocol buffer第一篇:语法介绍

    先理解一下protocol buffer是什么东西. protocol buffer是google发明的一种数据序列化方案,和json是同种类型的玩意,它非常适合在rpc场景下使用.同json一样,p ...

  3. Protocol buffer序列化及其在微信蓝牙协议中的应用

    Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提 ...

  4. [原创翻译]Protocol Buffer Basics: C#

    Protocol Buffer 基础知识:c#    原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial   ...

  5. Google Protocol Buffer 的使用和原理[转]

    本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...

  6. 学习Google Protocol buffer之语法

    上一篇结尾的时候问了几个问题,其实主要就是这个protoBuffer协议的语法,弄清楚语法后边才好开展工作嘛,不然大眼而对小眼儿,互相不认识,就没法玩耍了.其实就是学习怎么用google提供的这套 p ...

  7. Google Protocol Buffer 简单介绍

    以下内容主要整理自官方文档. 为什么使用 Protocol Buffers .proto文件 Protocol Buffers 语法 编译.proto文件 Protocol Buffers API 枚 ...

  8. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  9. 【Google Protocol Buffer】Google Protocol Buffer

    http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...

随机推荐

  1. PHP中写定时任务

    1.写一个bat E:\Progra~1\wamp\php\php.exe -f "E:\service.php" 2.写接口文件 ignore_user_abort(); //即 ...

  2. 阿里oss图片上传

    <script type="text/javascript" src="../../static/js/manage/oss_uploader.js"&g ...

  3. ehcache缓存使用

    CacheUtils.java //工具类 保存cache缓存: CacheUtils.put(CacheUtils.SIGN_CACHE, childid + "_" + mNu ...

  4. 阿里云 ECS centos java timer进程异常/混乱......的解决方法

    之前就知道timer进程长久运行容易出问题,所以一直对timer进行了很长一段时间的日志监控和数据库记录,大概观察了几个月,没发现过问题....然后就没管理了,数据库记录也没做了,昨天这问题就来了,t ...

  5. kali 日志

    MAC协议安全攻防 kali 攻击 输入 macof -i eth0 -i 选择网卡 防御 使用交换机的安全特性 Port Security DCRS 需要开启 mac地址表学习使用cpu控制 mac ...

  6. 利用Qt Designer 进行 空间提升propomotion 的时候异常: NO such file or directory

    1. 因为在提升的时候,只设置了 类名,以及文件名,但是没有给定Qt 的uic 的指定搜索路径,因此报错 在生成的ui_xxxx.h文件必然找不到这个文件. 如下图: 2. 解决方法 在项目的属性中: ...

  7. 【Solidity】学习(4)

    solidity函数修饰符 view  没有改变任何值或者写任何东西.只能读取,不能修改 function sayHello() public view returns (string) { } pu ...

  8. 微信屏蔽APP分享链接的解决方案原理,剖析微信域名防封技术

    为什么很多商家在微信封域名如此严格的情况下,还会挤破头皮去做微信营销和推广呢?又有些人问,为什么别人的域名长时间推广都没事,自己的链接在微信内一推就被拦截呢?这里你可能需要注意一点事,事出无常必有妖. ...

  9. SQL Server AlwaysOn搭建

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/高性能解决方案 概述 环境: 域服务器:windows server 2008 R2 SP1,192.168.2.10 DNS:1 ...

  10. Akka-CQRS(4)- CQRS Writer Actor 示范

    我觉着,CQRS的写部分最核心.最复杂的部分应该是Writer-Actor了.其它的监管(supervising).分片部署等都比较规范,没太多的变动.几乎Writer-Actor所有的业务逻辑都在R ...