为什么HTTP不是一种消息传递协议?(根据RabbitMQ)

4
在这个RabbitMQ文档中,MQTT、AMQP和STOMP被称为支持的消息协议。如果你考虑MQTT、AMQP和STOMP之间的区别,那对我来说是完全可以理解的。 然而,在文章的结尾部分,它变得令人困惑了。这是关于HTTP的。这一段指出:"HTTP不是一种消息协议"。我曾经认为HTTP也会以某种方式直接受到RabbitMQ的支持,但实际上只有在'低容量消息用途'(例如诊断)和在HTML中直接使用时才受到支持。 如果全世界有一半的人使用HTTP web api服务,为什么HTTP不能在消息协议之间共享呢?为什么HTTP不是一种消息协议,RabbitMQ使用的消息协议的定义是什么?
1个回答

7

HTTP完全属于同步 请求-响应 协议类别,这与异步 消息传递 协议截然相反,后者是 面向消息的中间件 典型协议。

使用 HTTP 作为 Web API 服务的“世界上一半”的用户并不将其用作基于松散耦合的消息传递式 Web API 服务,而是用作紧密耦合的请求-响应式 API。

消息传递协议具有某些特征(至少一次、恰好一次、最多一次、按顺序确切一次等),这些特征由协议定义和实现提供。试图在 HTTP 上进行 消息传递 很快就会退化为在高于 HTTP 的层面上复制这些要求(重试、序列号、重复处理等),并将 HTTP 淘汰为仅从消息角度提供很少价值的传输层。


感谢您的回答。这就是我一直在寻找的同步请求-响应与异步消息传递协议的分类。我能否简单地说,HTTP是单发单收之间的同步通信,而"消息传递"是单发多收之间的异步通信,其中协议上的代理或双方都提供排队、确认、超时等机制? - Coffe Cold
1
从协议的角度来看,它们是不同的。HTTP通常(虽然不总是)会在每个连续的请求中与服务器创建一个新的TCP连接,并且它有自己的握手等。例如,AMQP在实际协议(位/字节)级别和它如何管理套接字方面有很大的不同。这也是为什么你在防火墙方面会遇到困难的原因之一。 - theMayer
1
@CoffeCold 对的,一个消息产品将处理本地存储(排队)和重试/可靠性开箱即用。说到防火墙,它们是有时使用HTTP/S作为更高层次消息协议的传输协议的原因。出站HTTP/S连接是无处不在的。 - Remus Rusanu

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