如果没定义好所在领域的交互协议,架构师和开发者基本上就错过了将稳定性引入系统的机会。最近,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 )关注我们,并与我们的编辑和其他读者朋友交流。
评论