一开始,
- REST、RPC - 架构模式、AMQP - 线路级和 HTTP - 在 TCP/IP 之上运行的应用程序协议
- AMQP 是 HTTP 时的特定协议 - 通用协议,因此,与 AMQP 相比,HTTP 的开销非常高
- AMQP 本质是异步的,而 HTTP 本质是同步的
- REST 和 RPC 都使用数据序列化,哪种格式取决于您并且取决于基础设施。如果您在任何地方都使用 python,我认为您可以使用 python 原生序列化 -
pickle,它应该比 JSON 或任何其他格式更快。
- HTTP+REST 和 AMQP+RPC 都可以在异构和/或分布式环境中运行
因此,如果您选择使用什么:HTTP+REST 或 AMQP+RPC,答案实际上取决于基础架构复杂性和资源使用情况。如果没有任何特定要求,这两种解决方案都可以正常工作,但我宁愿做一些抽象,以便能够透明地在它们之间切换。
您告诉您的团队熟悉 HTTP 但不熟悉 AMQP。如果开发时间很重要,您就会得到答案。
如果您想以最小的复杂性构建 HA 基础架构,我想 AMQP 协议就是您想要的。
我对它们都有过体验,RESTful 服务的优点是:
- 它们在网络界面上得到了很好的映射
- 人们对它们很熟悉
- 易于调试(由于 HTTP 的通用性)
- 轻松向第三方服务提供 API。
基于 AMQP 的解决方案的优势:
请注意,您可以在基于 AMQP 的 API 之上向第三方服务提供 RESTful API,而 REST 不是协议而是范例,但您应该考虑使用它来构建您的 AQMP RPC api。我这样做是为了向外部第三方服务提供 API,并提供对在旧代码库上运行或无法添加 AMQP 支持的基础架构部分的 API 访问。
如果我是对的,您的问题是关于如何更好地组织软件不同部分之间的通信,而不是如何向最终用户提供 API。
如果您有一个高负载项目,RabbitMQ 是一款非常棒的软件,您可以轻松添加在不同机器上运行的任意数量的工作程序。它还具有开箱即用的镜像和集群功能。还有一件事,RabbitMQ 是建立在 Erlang OTP 之上的,这是一个高可靠、稳定的平台……(bla-bla-bla),它不仅对营销有好处,对工程师也有好处。当 nginx 日志占用运行 RabbitMQ 的同一分区上的所有磁盘空间时,我只遇到过一次 RabbitMQ 问题。
UPD(2018 年 5 月):
Saurabh Bhoomkar 发布了 Arnold Shoon 于 2012 年 6 月 7 日撰写的 MQ vs. HTTP 文章的链接,这是它的副本:
我在翻阅我的旧文件时偶然发现了我关于 MQ 的笔记,并认为我应该分享一些使用 MQ 与 HTTP 的理由:
- 如果您的消费者以固定速率处理(即无法处理对 HTTP 服务器 [突发] 的洪水),那么使用 MQ 可以让服务灵活地缓冲其他请求,而不是让它陷入困境。
- 与时间无关的处理和消息交换模式 - 如果线程正在执行即发即弃,则 MQ 比 HTTP 更适合该模式。
- 长寿命进程更适合 MQ,因为您可以发送请求并让单独的线程监听响应(注意 WS-Addressing 允许 HTTP 以这种方式处理,但需要两个端点都支持该功能)。李>
- 松散耦合,一个进程可以继续工作,即使另一个进程不可用,而 HTTP 必须重试。
- 请求优先级,更重要的消息可以跳到队列的前面。
- XA 事务 – MQ 完全符合 XA – HTTP 不符合。
- 容错 - MQ 消息在服务器或网络故障时仍然存在 - HTTP 不能。
- MQ 只提供一次“可靠”的消息传递,而 http 没有。
- MQ 提供了对大型消息进行消息分段和消息分组的能力 - HTTP 没有这种能力,因为它单独处理每个事务。
- MQ 提供了一个发布/订阅接口,其中 HTTP 是点对点的。
UPD(2018 年 12 月):
正如下面 cmets 中的 @Kevin 所注意到的,RabbitMQ 的扩展性优于 RESTful 服务是值得怀疑的。我最初的答案是基于简单地添加更多工作人员,这只是扩展的一部分,只要不超过单个 AMQP 代理容量,这是真的,尽管之后它需要更高级的技术,如 Highly Available (Mirrored) Queues,这使得 HTTP 和基于 AMQP 的服务在基础架构级别进行扩展时具有一定的复杂性。
经过仔细考虑,我还删除了维护 AMQP 代理 (RabbitMQ) 比任何 HTTP 服务器都简单:原始答案写于 2013 年 6 月,自那时以来发生了很多变化,但主要变化是我对两种方法,所以我现在能说的最好的就是“你的里程可能会有所不同”。
另请注意,在某种程度上比较 HTTP 和 AMQP 是苹果与橙子的区别,因此请不要将此答案解释为您做出决定的最终指导,而应将其作为来源之一或作为参考您的进一步研究,以找出与您的特定情况相匹配的确切解决方案。