面向服务的体系结构-AMQP或HTTP
有点背景 非常大的单片Django应用程序。所有组件都使用相同的数据库。我们需要分离服务,以便能够独立升级系统的某些部分,而不影响其余部分 我们使用RabbitMQ作为芹菜的中间商 现在我们有两个选择:面向服务的体系结构-AMQP或HTTP,http,rabbitmq,soa,scaling,amqp,Http,Rabbitmq,Soa,Scaling,Amqp,有点背景 非常大的单片Django应用程序。所有组件都使用相同的数据库。我们需要分离服务,以便能够独立升级系统的某些部分,而不影响其余部分 我们使用RabbitMQ作为芹菜的中间商 现在我们有两个选择: HTTP服务使用REST接口 将AMQP上的JSONRPC连接到事件循环服务 我的团队倾向于HTTP,因为这是他们所熟悉的,但我认为使用RPC优于AMQP的优势远远超过了它 AMQP为我们提供了轻松添加负载平衡和高可用性的能力,并保证了消息的传递 而对于HTTP,我们必须创建客户端HTTP包装器
- REST、RPC体系结构模式、AMQP-wire级别和HTTP-application协议,它们运行在TCP/IP之上
- 当HTTP是通用协议时,AMQP是一个特定的协议,因此,HTTP与AMQP相比具有极高的开销
- AMQP性质是异步的,其中HTTP性质是同步的
- REST和RPC都使用数据序列化,数据序列化的格式由您决定,具体取决于基础结构。如果您在任何地方都使用python,我认为您可以使用python本机序列化-
,它应该比JSON或任何其他格式更快pickle
- HTTP+REST和AMQP+RPC都可以在异构和/或分布式环境中运行
- 它们很好地映射到web界面上
- 人们对他们很熟悉
- 易于调试(由于HTTP的通用性)
- 轻松为第三方服务提供API
- 他妈的快
- 灵活的
- 成本效益(在资源使用意义上)
- 如果您的使用者以固定速率处理进程(即无法处理HTTP服务器的洪水[突发]),则使用MQ为服务提供了缓冲其他请求的灵活性,而不是使其陷入困境
- 与时间无关的处理和消息传递交换模式——如果线程正在执行一个fire-and-forget,那么MQ比HTTP更适合该模式
- 长寿命进程更适合MQ,因为您可以发送请求,并有一个单独的线程侦听响应(注意WS-Addressing允许HTTP以这种方式处理,但需要两个端点来支持该功能)
- 松散耦合,其中一个进程可以继续工作,即使另一个进程不可用,而HTTP必须重试
- 请求优先级排序,其中更重要的消息可以跳到队列的前面
- XA事务–MQ完全兼容XA–HTTP不兼容
- 容错性–MQ消息在服务器或网络故障下仍然有效–HTTP不能
- MQ提供了一次且仅一次的消息“有保证”传递,http没有
- MQ提供了对大型消息进行消息分段和消息分组的能力–HTTP没有这种能力,因为它单独处理每个事务
- MQ提供了一个发布/订阅接口,其中as HTTP是点对点的