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