如果没定义好所在领域的交互协议,架构师和开发者基本上就错过了将稳定性引入系统的机会。最近,InfoQ向高性能计算专家Martin Thompson提出了一些关于协议设计和他的项目Simple Binary Encoding(SBE)的问题。

\\

InfoQ:在计算机科学和系统领域,协议是什么?

\\

\

协议是一个达成一致的、并受规则支配的交互集合。一个大多数人一直都在用的简单例子就是文件。和一个文件交互的协议包括:一个打开行为,紧跟着0或者多个读/写行为,最后是一个关闭行为。这个协议不仅定义了可以被执行的行为,更重要的是它定义了一套规则用于掌控这些行为可能被执行的顺序。在文件这个例子中,如果一个文件没有被打开,是不可能执行读、写或者关闭这些行为的。

\\

在系统设计中,我们经常听到人们讨论API,API是一张不完整的、用于说明应该如何使用一个系统的图纸。如果更多人发布用于和他们API进行交互的协议,那么系统的可用性将得到提高。

\\

不幸的是我们业界里很少使用术语。由于业界还不成熟,这一点也不奇怪。也许我们可以认为我们正处在计算机炼金术时代,随着时间推移,我们将会成长,获得更好的实践和认知。因此,人们经常误用“协议”这个术语来指代其他东西,常常是离题的东西。例如,流行的Google Protocol Buffers(GBP)其实是一个编解码器,但许多人称之为一个协议。我们也发现XML被称为一个协议,却被当作一门语法或者一种编码使用。为达成一个协议,由有序的规则支配的消息序列被编解码器编码成ASCII或者二进制格式。GBP和SBE是编解码器。SMTP是一个由一组消息组成的协议,这个协议用于和邮件服务器进行交互。

\

\\

InfoQ:所以,协议不仅仅只是握手和序列化模式?

\\

\

协议掌控着所有交互以确保系统不会进入不一致的状态。如果设计得好,这些系统将会拥有良好的扩展性,提供更高的可用性,更好的事情将会产生。

\\

我们每天都在使用协议。没有协议,我们将会坠落到无序之中。没有协议,我们就不能够依靠集体的力量实现一些伟大的事情。即使是低级的蚂蚁,一个遵守简单协议的群体也能够完成不可思议的事情。

\

\\

InfoQ:当我们写代码时,会遇到各种协议:TCP、FTP、HTTP等。典型地,我们在这些协议之上的若干层实现我们的解决方案。但理解这些协议如何工作是否有益?或者一个“黑盒”方法已经足够好了?

\\

\

它有助于理解我们的应用所依赖的协议层。我们不需要详细地了解各层的细节,除非你的工作内容属于那一层,或者仅仅是热爱,想要了解和学习其他层的知识。然而,我们能从理解各层提供了什么和各层的主要功能特性中获得很大的受益;这样,我们更高层的软件才能够和底层协议一起和谐地工作,而不是与它们相违背。我把这称为Mechanical Sympathy。

\\

理解通信层的一个方法是OSI(Open Systems Interconnection)模型。我们的应用明显都在第7层。我们通常需要实现应用层协议来确保应用的一致性。比如对等应用间通过在所有事务中添加一个序列号用以检测是否有消息丢失或者连接是否断开。FIX(Financial Instruments Exchange)协议中就有这种消息序列的概念。设计这个协议的人没有考虑或者可能不知道OSI模型。结果他们混淆了会话层协议和应用层协议,导致恢复或支持有弹性的数据组变得非常困难。这就是一个例子,因为缺乏对通信协议栈的了解,而导致系统比期望的更复杂、更脆弱且拥有更低的性能。

\

\\

InfoQ:什么时候我们应当考虑编写我们自己的协议?

\\

\

我们一直都在设计协议。当我们考虑交互模式的时候应该花更多的精力考虑协议。协议总和状态机如影随行。令人惊奇的是当人们停下其他工作,描绘出可能的交互模式,然后记录这些模式形成一个协议时,一个API将会得到很大的改善。访问一个对象的方法仅仅是传递一条消息给这个对象,但在大多数编程语言中都以一种高耦合的方式进行传递。随着我们采用一种更好的解耦方法,消息变成了第一等级的概念,这都受益于消息被组织进了一个协议。将我们的协议文档化有助于改进它们,并使一个系统更易于理解。

\

\\

InfoQ:SBE是一个用于生成高效且通用的协议的工具吗?

\\

\

SBE是一个非常高效的、用于编码和解码我们协议中的消息的编解码器。由于相对于其他编解码的实现,消息编码可能会占很大的开销,人们经常没有对一个系统进行充分地解耦。SBE将编码或解码一条消息的开销降低到近似于C++或者Java中访问一个对象的字段的开销。此外,SBE无需申请内存,所以对我们的垃圾回收器没有任何影响。正如一些人对许多真实世界中系统的剖析,我意识到消息的编解码,以及随之产生的垃圾是我们遭遇到的3大性能瓶颈之一。

\

\\

协议的设计和实现不仅仅只针对系统架构师和底层平台开发者。在一个系统的交互环节引入考虑周到的协议将带来许多好处,其中之一是稳定性,降低异常事例的发生率。无论被隐式地在较底层中使用,如TCP,还是在开发团队中发布一套明确的指令集合,协议展示了系统作者的意图,并允许参与者在一个事务中如实地执行这个意图。

\\

参考英文原文:Protocol Design and Implementation with Martin Thompson

\\


感谢赵震一对本文的审校。

\\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

Martin Thompson:协议设计与实现相关推荐

  1. 2017-2018-1 20155327 实验五 通讯协议设计

    2017-2018-1 20155327 实验五 通讯协议设计 实验一: 实验要求: 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中 ...

  2. 2018-2019-1 20165212 实验五 通讯协议设计

    2018-2019-1 20165212 实验五 通讯协议设计 OpenSSL简介 OpenSSL是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及 ...

  3. 【Paper】2015_异构无人机群鲁棒一致性协议设计_孙长银

    原文地址:[1]孙长银,余瑶,张兰.异构无人机群鲁棒一致性协议设计[J].中国科学:技术科学,2015,45(06):573-582. 2015_异构无人机群鲁棒一致性协议设计_孙长银 4 分布式鲁棒 ...

  4. 【MORE协议】基于MORE的改进协议设计的MATLAB仿真

    0.完整源码获得方式 方式1:微信或者QQ联系博主 方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 1.软件版本 MATLAB2021a 2.本算法理论知识 随着无线通信 ...

  5. 一次彻底搞透协议设计(没做过通讯底层也没有关系)!

    系统设计,协议先行. 大部分人不了解协议的设计细节,更多使用已有协议进行应用层设计,例如: (1)使用HTTP,设计get/post/cookie参数,以及json包格式: (2)使用dubbo,而不 ...

  6. 2017-2018-1 201553334 实验五 通讯协议设计

    2017-2018-1 201553334 实验五 通讯协议设计 1.在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业 提交运行 ...

  7. 2017-2018-1 20155222 201552228 实验五 通讯协议设计

    2017-2018-1 20155222 201552228 实验五 通讯协议设计 实验内容和要求 通讯协议设计-1 在Ubuntu中完成 http://www.cnblogs.com/rocedu/ ...

  8. 浅析低延迟直播协议设计:RTP/RTCP

    作者:王宇航,红点直播联合创始人&CTO.毕业于中国科学技术大学,风云直播创始团队成员,曾参与逆向Adobe 来源:UPYUN Open Talk 声明:本文已获得授权. Flash非公开加密 ...

  9. 编译原理实验报告_任意给定一个正规式 r (包括连接、或、闭包运算),根据 Thompson算法设计一个程序,生成与该正规式等价的 NFA N 。

    任意给定一个正规式 r (包括连接.或.闭包运算),根据 Thompson算法设计一个程序,生成与该正规式等价的 NFA N . 百度网盘下载 传送门 提取码:bzjn

最新文章

  1. mysql复习增删改查
  2. 初步了解Windows Safer API
  3. python turtle 椭圆_【python turtle如何画椭圆】
  4. Latex除法a/b \frac{a}{b}
  5. Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
  6. mysql注入攻击getshell_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战
  7. python怎么把代码做成软件_python代码能做成软件吗
  8. 知乎spark与hadoop讨论
  9. Jquery--一个form中两个submit事件如何进行区分
  10. Android 整合高德地图SDK实现 地图预览,定位,模拟导航
  11. Enhancement(5)--Field Exits {转载}
  12. ch01变量和数据结构
  13. NR PRACH(四)PRACH与SSB的映射
  14. 单片机炫彩灯实训报告_51单片机呼吸灯实验报告.doc
  15. 乌鸦飞过flash素材下载_会声会影仿AE文字动画特效教程-会声会影中文官网
  16. Diabetes 糖尿病及其并发症.|2021/1/25(未完待续)
  17. javascript百炼成仙 第一章 掌握JavaScript基础1.4数据类型
  18. 100G 数据,只有 100M 内存,怎么排序?
  19. 《Windows Server 2012网络操作系统项目教程》实训报告
  20. 【多元统计分析】12.逐步回归

热门文章

  1. 三种激活函数——Sigmoid,Tanh, ReLU以及卷积感受野的计算
  2. The connection to adb is down和no configs match configspec错误
  3. 提交的JDK输入法光标跟随,被要求予以详细说明
  4. 《辐射3》技能、Perk
  5. 短信群发有字数限制吗?看完这篇文章,你就知道了!
  6. Truffle 是什么?
  7. 3D游戏编程大师技巧
  8. C语言中的read()、write()、fputs()、fgets()
  9. 图片使用css3滤镜改变图片颜色
  10. 数据透视创建传统布局_更改数据透视图布局