比较TCP / IP应用程序与HTTP应用程序[关闭]


13

我对开发使用Java编写的面向用户的大型网站感兴趣。

至于设计,我正在考虑开发独立的模块化服务,这些服务可以作为我的主要Web应用程序的数据提供者。

至于编写这些模块化服务(数据提供程序),我可以利用现有的框架(如Spring)并按照RESTful设计模式开发这些服务,并通过HTTP和消息格式(如JSON)公开资源...或者我可以利用现有的网络像Netty这样的框架(http://netty.io/)和像Protobufs这样的序列化格式(https://developers.google.com/protocol-buffers/docs/overview),并开发一个TCP服务器来来回发送序列化的protobuf有效载荷。

您何时应选择一个?使用Protobufs之类的序列化格式并通过网络发送字节流会有任何好处吗?仅使用JSON会产生开销吗?使用TCP / IP和使用HTTP之间有多少开销?什么时候应该使用Spring over Netty来建立这样的服务,反之亦然?


听起来您似乎在考虑技术堆栈,而不是实际需求。在不知道您需要什么的情况下,我们中的任何人如何回答这个问题?您是否正在创建应该具有接近零延迟的多人游戏?还是一个社交书签应用程序,其中大多数访问已通过HTTP进行,您可能一次要缓存几个小时的数据,甚至根本不在乎刷新,更不用说延迟了?
亚罗诺(Aaronaught)2013年

3
我认为OP不会要求我们为他做出选择。他只是在问一个高级问题,即如何做出这样的选择以及考虑哪些因素。为这个问题提供一个高层次的答案没有什么错..我做到了。
DXM 2013年

我通常反对使用二进制格式,除非您确实需要这样做。没有二进制文件格式,没有二进制序列化等。例如,在Java中,二进制序列化会导致Java版本与您自己的软件版本之间不兼容,但是我认为XML的兼容性不那么强。我认为以下TCP / IP> HTTP> XML当然,这取决于您在做什么。我认为JSON是XML的替代方法。我对Spring或Netty不太了解,尽管我确实读过人们在使用Spring。
凯德尔

+1 DXM,在考虑做出这样的决定时,我想问一些高级问题,以供深思。
HiChews123

Answers:


21

关于在REST上使用JSON与带二进制协议的TCP / IP相比,肯定有优缺点,我想您已经在怀疑二进制协议会更快。我无法确切地告诉您速度有多快(这取决于很多因素),但我想大概相差1-2个数量级。

乍一看,如果某个东西比其他东西慢10到100倍,那么您可能会产生下意识的反应并追求“快速”。但是,这种速度差异仅在于协议本身。如果在服务器端有数据库/文件访问权限,则不会受到您选择传输层的影响。在某些情况下,这可能会使您的传输层速度变得不那么重要。

HTTP REST和JSON的出色表现有很多原因:

  • 几乎任何人都可以轻松使用它们。您可以编写您的Web应用程序,然后转过来发布您的API,供世界其他地方使用。现在,任何人都可以达到相同的终点并获得您的服务
  • 它们很容易调试,您可以打开一个数据包嗅探器,或者简单地将传入的请求转储到文本文件中,看看发生了什么。你不能用二进制协议做到这一点
  • 它们很容易扩展。您可以在以后添加更多属性和数据,而不会破坏与旧客户端的兼容性。
  • 可以由javascript客户端使用(不确定他们是否已有protobuf JS解析器,不相信有一个解析器)

通过TCP / IP的Protobuf:

  • 他们更快

如果这是我的选择,那么我会使用HTTP REST和JSON。有很多其他公司和网站都采用这种方式是有原因的。另外请记住,将来您始终可以支持2个端点。如果您的设计正确,则应将端点选择与服务器端业务逻辑或数据库完全脱钩。因此,如果以后您意识到所有/某些请求都需要更快的速度,那么您应该能够以最小的麻烦添加protobuf。但是,立即使用REST / JSON可以使您更快地动手,并使您走得更远。

就Netty vs Spring而言。我没有直接使用Netty,但我相信它只是一个轻量级的Web服务器,因为Spring是一个框架,可以为您提供更多功能。它具有数据访问层,后台作业调度和(我认为)MVC模型,因此它的重量更大。选择哪一个?如果您决定采用HTTP方式,那么下一个问题可能是您的应用程序的标准如何?如果您要编写一些不适合标准模型的疯狂的自定义逻辑,而您只需要一个HTTP服务器层,请使用Netty。

但是,我怀疑您的应用程序不是那么特别,它可能会受益于Spring提供的许多功能。但这意味着您应该围绕Spring的框架构建应用程序,并按照他们期望的方式进行操作,这意味着在深入研究产品之前要先了解更多有关Spring的知识。总体而言,框架之所以出色,是因为它们再次使您起步更快,但是缺点是您必须适应其模型,而不是自己进行设计,然后期望框架能够正常工作。

(*)-过去曾指出我的帖子并没有反映整个世界的观点,因此我会继续记录,并补充说我对Netty的经验有限(我之前使用过Play框架基于Netty)或Spring(我只读过它)。所以听一口盐就好。


1
+1,特别是对于“这种速度差异仅在于协议本身。如果在服务器端进行数据库/文件访问,则不会受到您对传输层的选择的影响”。99%的情况就是这样,过早的优化(在错误的位置)根本无法解决问题。
Shivan Dragon

感谢您冗长的答复和对两者进行比较的深入分析。我了解构建RESTful应用程序的好处,因为公共客户端可以轻松使用它。但是,在这种情况下,我希望将所有内容保留在内部并且不希望公开该服务(我负责序列化/反序列化),所以我不明白为什么不使用自定义二进制协议不是首选。是的,您可以使用现有框架更快地投入使用,但是以被锁定在它们的API和较不精细的控制中为代价。
HiChews123

所有客户端(不仅是公共客户端)都容易使用REST,但肯定包括在内。我公司的产品已经开发了大约一年。我们有“专有”协议,恰好休息了。我们只是向其他人开放。他们在商学院教给您的一件事是“选择思维”,做出决定时要给您尽可能多的选择,以便您日后做出决定。因此,在所有设置相等的情况下,我选择REST并不是因为我今天拥有JS客户端或API访问权限,而是可以选择将来是否需要它。再说一次,如果...
DXM

...您已开始使用二进制协议,请继续使用它。96%的机会选择协议不会对您的最终应用产生任何影响,因此我不会过多地考虑该决定。正如我在答案中所说的那样,通过良好的设计,无论如何您应该能够在以后交换协议。我想做的另一件事是尝试这两种情况,如果我在做决定时处于困境,我会掷硬币并选择选项A。下一次我做类似的项目时,我选择选项B,以便随后可以返回并比较/对比我的经验。有时候,这是您自己决定哪个更好的唯一方法
DXM

@DXM,好评如潮!
HiChews123

0

这实际上是一个非问题。根据Internet协议套件,tcp是传输层中的协议,而http是应用程序层中的协议。您正在相互比较完全不同的事物。(在此处查看更多信息:http : //en.wikipedia.org/wiki/Internet_protocol_suite

实际上,大多数http通过tcp / ip。因此,要回答您的问题,是的,您应该使用tcp / ip。然后,您要在该协议之上添加一个应用程序层协议(例如http),然后添加一种数据格式(例如json,xml,html)。Netty让您使用http,而protobuff等于json,xml,html。

这完全取决于您的要求以及需要传输的数据类型。您是否需要协议中的会话,握手可以改善协议配置,一次发送多少数据,是否需要加密?这些是选择应用程序协议时需要回答的问题。

选择数据表示格式(json,xml,html,protobuff等)取决于您的带宽,可读性,语言/工具支持等。

您无法将http与tcp进行比较。

请记住,速度并不是一切。如果您无法以明智的方式表达自己的意见,那么速度是没有用的。


5
他的问题中没有什么暗示他不知道网络堆栈各层之间的区别。他问他应该使用HTTP(假定HTTP在TCP / IP之上的事实)还是将TCP / IP与他自己的自定义协议一起使用。他的问题没有错。
迈克尔

我当然不同意。那不是我对他的理解
Iiveqy 2013年

1
是的,我知道HTTP位于TCP / IP之上,我的问题的确确实是在考虑权衡因素(延迟,开发速度等)方面做出决定。不过,感谢您提出问题供我考虑!
HiChews123

2
@ acspd7我会避免创建自己的协议,那里已经有很多已被证明的协议,除非您的协议能给您提供优于竞争对手的优势,否则使用标准协议可能会更好。我已经实现了自定义协议,这很有趣!但是,加密,打孔,保持生命,握手(不同的网络需要不同的帧长)等都是使事情变得更好的工作。更不用说您需要的所有文档。在进行自定义操作之前,请先考虑一下您真正需要的功能。
iveqy

1
GPB有据可查,并且被许多其他人所使用,因此我看不到使用它的任何问题。比XML和JSON更简洁的功能应该很棒!(您可能缺乏人类可读性,但是如果不是必需的...)。但是,您不错过任何一层吗?通常,您在tcp和xml,json,protobuff之间有一层。像http,ssh等之类的东西
iveqy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.