一个自定义REST协议采用二进制而不是像HTTP一样基于文本的方式,这是一个好事情吗?

5
您是否看到过创建自定义二进制REST协议而不使用基本的HTTP REST实现的好理由?
我目前正在使用.Net开发一个面向服务架构框架,负责托管和消费服务。我不想基于现有的框架,比如Remoting或WCF,因为我想要完全灵活性和控制,以执行定制优化。
所以在这里,我试图找到处理此SOA框架的最佳协议。我喜欢REST的请求/响应无状态连接特性和用于定义资源的URI,但我不喜欢HTTP的基于文本的特性。
以下是我不喜欢HTTP的论点,请指正我是否错误:
- 首先是证据,解析文本比解析二进制效率低。我更希望使用包含内容长度的固定长度二进制头和二进制内容。 - 其次,HTTP请求没有序列号的概念,因此将响应与其请求关联的唯一方法是用于发送请求和接收响应的套接字连接。这意味着针对指定套接字只能同时存在一个挂起的请求,因此如果服务使用者要并行发送多个请求,则需要打开多个套接字到服务器。自定义REST协议可以为请求定义一个序列号,因此请求和响应将与序列号而不是套接字关联,并且可以在同一个套接字上并行发送多个请求。我认为标准的HTTP没有这种方式,使用自定义基于文本的协议可以实现这一点,但为什么不使其基于二进制以获得更好的性能呢?
为了增加一些背景知识,我的SOA框架不需要从非.Net消费者处访问,因此我没有使用.Net二进制格式化程序或其他自定义二进制格式化程序的限制。
那么,我是否有理由想要自定义二进制REST协议?如果您认为我错了,请告诉我您的论点。
谢谢。
4个回答

8

REST是一种用于构建Web服务的架构风格。Roy Fielding基于他设计HTTP的经验提出了它,但它超越了HTTP。例如,您可以在普通电子邮件交换上部署RESTful服务。

您的资源的REST表示可以是任何您喜欢的东西,尽管Roy非常强调人们应该尝试使用精心设计的标准表示。二进制没有问题。实际上,像JPEG和PNG这样的图像表示就是二进制的。Google的Protocol Buffers也提供了一种创建结构化数据紧凑二进制表示的方法。

因此,简短的答案是,您可以完全实现RESTful并使用二进制表示以及自行开发的二进制替代HTTP。

但是,我非常强烈建议您使用HTTP以提高效率。如果您使用自己的协议,则会失去所有由美妙的HTTP缓存基础设施提供的支持。全部客户端负载落在您的服务器上,而不是分散在中间缓存上。

2010年10月4日:在我们基于HTTP的REST API中,我们现在支持Java序列化对象和Kryo二进制表示,除了XML、JSON和XHTML外。Kryo序列化库的性能明显优于其他库,而不需要任何特殊协议。减少带宽的另一种选择是使用HTTP压缩以及文本表示。


感谢您的想法。由我的SOA框架托管的服务将主要负责执行操作,而不是返回静态内容。因此,它们不会受益于缓存基础设施。我认为我会坚持使用二进制以获得更好的性能。 - Jeff Cyr

3
您的数据包可以是任何您喜欢的格式,可以是XML、纯文本、JSON或二进制格式。我认为没有必要强制使用特定的格式(使用最适合的格式即可)。
但是,当提到“二进制格式”时,大多数人会听到一种固定格式的字段长度和其他非常烦人的事情。通常,如果您不是从数据传输的角度迫切需要,我认为没有理由走这条路线[虽然您可以对.NET对象进行二进制序列化,以便它们可以被重新实例化[或查看“.net”的“协议缓冲区”库]。
总结:在我看来,这样做是可以的。随意选择适合自己的方式。

谢谢您的回答,我会考虑使用可变长度的标头,这样做将更容易地构建协议扩展。 - Jeff Cyr

1
你曾经看到过创建自定义二进制rest协议的好理由,而不是使用基本的http rest实现吗?
我不确定我是否理解你的术语。 REST表示可以完全是二进制的,并且仍然通过纯HTTP传输。没有必要发明一个新协议来传输二进制数据。只需将您的要求减少到一个文档良好的媒体类型(您可以自由发明)。
关于二进制资源表示, Fielding本人认为二进制不仅可接受,而且在某些情况下可能是必需的。
无论您选择直接二进制,与文本混合的Base64还是纯文本,如果您打算称其为“REST”,别忘了超文本约束
所以,如果你想创建一个自定义的,仅二进制,以超文本驱动的媒体类型,那是完全合理的。
如果你在谈论发明一些自定义的HTTP扩展,我建议除非绝对必要,否则不要这样做(而且你所描述的并不像是达到那个级别)。

1
基于这个声明,我建议选择两种方案之一。要么是直接使用TCP/IP套接字,要么是WCF。这些选项为您提供了最大的灵活性。如果您想要成为传输不可知的,并且在应用程序协议方面从干净的状态开始,则WCF是一个很好的解决方案。
REST强制实施一组限制,以限制您的分布式应用程序的行为,以获得某些有益的特性。如果您将服务端点视为调用操作的方式,则我建议REST根本不适合您的需求。
不过,我认为您在这一点上最担心的不应该是发送二进制还是文本负载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接