一些背景知识。
非常大的单片Django应用程序。 所有部件都使用同一个数据库。 我们需要不同的服务,所以我们可以单独升级系统的某些部分,而不会影响休息。
我们使用的RabbitMQ作为一个经纪人芹菜。
现在,我们有两个选择:
- 使用REST接口HTTP服务。
- JSONRPC了AMQP的事件循环服务
我的团队朝着HTTP倾斜,因为这是他们所熟悉的,但我认为使用RPC over AMQP的优点远大于它。
AMQP为我们提供了功能,轻松添加负载平衡和高可用性,有保证的消息交付。
而对于HTTP,我们要创建客户端的HTTP包装与REST接口的工作,我们必须把在一个负载平衡器,为了有HA等进行设置,基础设施
随着AMQP我可以酿出服务的另一个实例,它会连接到相同的队列作为其他实例和BAM,HA和负载平衡。
我失去了我的想法AMQP的东西?
首先,
- REST,RPC - 架构模式,AMQP - 丝级和HTTP - 应用协议,该协议在TCP / IP之上运行
- 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服务优势的经验是:
- 他们良好的映射网络接口上
- 人们所熟悉的他们
- 便于调试(HTTP由于通用)
- 易API提供第三方服务。
基于AMQP的解决方案优势:
请注意,您可以在基于AMQP的API之上提供的RESTful API的第三方服务,而REST是不是一个协议,而是范式,但你应该想想构建AQMP RPC API。 我已经以这种方式提供的API外部第三方服务,并提供访问API上的这对老的代码库运行或者它是不可能增加AMQP支持基础设施的一部分做了。
如果我是对你的问题是关于如何更好地组织你的软件的不同部分,而不是如何提供API给最终用户之间的通信。
如果你有一个高负荷项目的RabbitMQ是该死的好片的软件,你可以轻松地添加任意数量的在不同的机器上运行的工人。 此外,它具有镜像和集群开箱。 还有一两件事,RabbitMQ的是建立在Erlang的OTP,这是高可靠的顶部,稳定的平台......(BLA-BLA-BLA),它不仅是营销,但工程师太好。 我曾与RabbitMQ的问题只有一次,nginx的日志了在同一个分区所在的RabbitMQ运行所有的磁盘空间。
UPD(2018 5月): SAURABH Bhoomkar发布的链接MQ与HTTP上2012年6月7日写的阿诺德Shoon文章,这里是它的一个副本:
我会通过我的旧文件和在我的笔记来了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月):由于注意到了@Kevin在下面的评论,这是值得怀疑的是RabbitMQ的尺度更好,然后REST风格servies。 我原来的答案是基于简单地增加更多的工人,这仅仅是一个比例的部分,只要单AMQP代理能力不超标,这是事实,但之后它需要像更先进的技术, 高可用性(镜像)队列 ,这使得HTTP和基于AMQP的服务有一些非平凡的复杂性,在基础设施建设水平成比例。
经过仔细考虑后我也删除,维持AMQP代理(RabbitMQ的)比任何HTTP服务器简单:原来的答案写于2013年6月,有很多自认为时间而改变,但主要的变化是,我在这两种方法得到更深入的了解,所以最好现在我可以说,“你可能会有所不同。”
还要注意,比较HTTP和AMQP是苹果和橘子一定程度,所以,请不要解释这个答案,因为最终的指导,立足自己的决定上,而是把它作为来源之一或为您的进一步研究提供参考找出确切的解决方案将满足您的具体情况。
溶液OP的讽刺不得不接受被,AMQP或其它MQ解决方案通常用于从仅HTTP服务固有的不可靠性绝缘呼叫者 - 提供超时的一些级和重试逻辑和消息持久性,因此没有按呼叫者”不用为了实现自己的HTTP保温代码。 一个非常薄的HTTP网关或适配器层上的可靠AMQP核心,以选择直来直去AMQP使用更可靠的客户端协议一样JSONRPC常常是这种情况下的最佳解决方案。