protocbuf的简单理解
之前通信协议替换为protocbuf!新老交替,很多不同看法,也提出来一些负面因数:
1、老的内部通信协议体已经有一段时间了,稳定熟悉!
2、通过通信结构体进行交互,实际上并没有序列化和反序列化的过程!性能几乎零损耗
3、通信异常直接可以通过日志打印出来,定位问题时候可以直接查看关键信息
4、由于老代码用的是内部封装的通信结构体,几乎所有的老代码都直接或间接的引用了老通信协议体,替换工作量比较大
也存在另外一种正面意见:
1、老代码陈旧冗余,新增接口或修改接口让人头疼
2、需要业务层考虑字节序问题
3、由于是内存偏移操作,程序员风格的差异让整个协议文件变的很乱!更致命的是一旦发生错误定位起来非常困难
4、另外还有一些内部通信体限制问题
无论替换过程怎样,项目的车轮还在前进!protocbuf已经在产品中落地生根,一小段周期的接触,总结下:
protocbuf是google的一个开源项目,很多互联网公司早就在用了,像百度、腾讯这些巨头,而且在github里面的关注度也是一直颇高。
它也有很多的优势,从我的角度看最明显的是序列化速度快,而且序列化之后字节非常少。
就我之前所接触的几种序列化,JSON、SAMP、ASN.1性能都不如protocbuf,ASN.1和protocbuf组织有点像,都是树状结构!
但是ASN.1协议体除了TAG还需要一些辅助信息,对数据的编码也缺少压缩,像DCC、SOAP等网络协议性能更低。
另外protocbuf还有缓存机制、结构体式接口、兼容性等等一系列的优点
虽然protocbuf有着明显性能和压缩的优势,虽然这种网络通信里面至关重要,但是我们更关注其缺点:
1、protocbuf只提供序列化和反序列化的能力,如果用在网络通信里面,需要再封装。
2、protocbuf序列化之后可读性差,对抓包后面的码流分析起来非常困难,毕竟有时候工具不是万能的,手工是终极绝招
3、protocbuf描述性文档比较少,目前也没有普遍推广
另外是开发过程中的一些问题
4、protocbuf repeated类型,如果想替换已经加入的一个子元素,那几乎要重写所有的元素
5、protocbuf在没有数据传输的时候,序列化出来的长度是0.虽然这种做法提高了序列化性能和压缩了数据,但是在空数据的情况下,占位符对程序设计影响颇大
6、protocbuf版本在hp主机上要修改之后才能用
暂时就这么多吧,我也不知道还要多少坑等着我们,路过的兄弟请提点!
protocbuf的简单理解的更多相关文章
- git的简单理解及基础操作命令
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- [转]简单理解Socket
简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html 题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...
- Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
- Deep learning:四十六(DropConnect简单理解)
和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...
- Deep learning:四十二(Denoise Autoencoder简单理解)
前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...
- 简单理解dropout
dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...
- 我们为之奋斗过的C#-----C#的一个简单理解
我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...
- 简单理解ECMAScript2015中的箭头函数新特性
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
随机推荐
- 数据库SQL语言从入门到精通--Part 1--SQL语言概述
数据库从入门到精通合集(超详细,学习数据库必看) 一.SQL概述 关系数据库标准语言SQL(结构化查询语言). 结构化查询语言(Structured Query Language)简称SQL,是一种特 ...
- Codeforces Round #460 (Div. 2)-A Supermaket(贪心)
A. Supermarket time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- andorid jar/库源码解析之okhttp3
目录:andorid jar/库源码解析 Okhttp3: 作用: 用于网络编程(http,https)的快速开发. 栗子: // okHttpClient定义成全局静态,或者单例,不然重复new可能 ...
- turtle库应用实例3-叠加等边三角形绘制(一笔画)
叠加等边三角形绘制 ...
- Spring Boot 整合 Apache Dubbo
Apache Dubbo是一款高性能.轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 注意,是 Apache Dubb ...
- 你知道Spring是怎么解析配置类的吗?
彻底读懂Spring(二)你知道Spring是怎么解析配置类的吗? 推荐阅读: Spring官网阅读系列 彻底读懂Spring(一)读源码,我们可以从第一行读起 Spring执行流程图如下: 如果图片 ...
- 【Spark】通过创建DataFrame读取不同类型文件内容
文章目录 读取文本文件 第一种方法:通过RDD配合case class转换DataFrame 步骤 一.创建测试所需的文本文件 二.在spark-shell中执行以下操作 第二种方法:通过sparkS ...
- 设计模式GOF23之单例模式
单例模式的五种方式 主要:懒汉式,饿汉式 其他:双重检测锁(Double Checking模式),静态内部类,枚举模式 选取时机 延时加载,占用内部资源大:静态内部类好于懒汉 不延时加载,占用内部资源 ...
- SQL 选择列 IF表达式,Contains表达式的用法
因为业务需要需要使用到, 列中的字段或根据列值是否满足某一条件,进行输出.比如类似与 select if() ……from……:(但是SQL Server 没有 if 表达式) 比如,如果Scor ...
- JS理论-:一只tom猫告诉你构造函数 实例 实例原型 实例原型的实例原型是什么
参考地址:https://github.com/mqyqingfeng/Blog/issues/2 感谢这位大佬 下面说说我的理解: 第一,看下人物: tom--一只叫tom的猫 Cat()--猫的构 ...