OpenStack中的Nova各个服务之间以松耦合的方式使用AMQP进行通信(RPC)。使用AMQP的发布/订阅模式来进行RPC有如下优势:
1)
客户端及服务端之间解耦:客户端不需要知道有哪些服务端以及服务端的地址;
2)
客户端与服务端之间完全的同步性:客户端的RPC不需要服务端正好在运行;
3)
远程调用的随机均衡:如果有多个服务端在运行,单向RPC会透明的分发到最一个可用的服务端。
Nova用到了direct,fanout,topic三种类型的交换器(Exchange),整个架构图如下:
Nova基于AMQP实现了两种类型的RPC:
rpc.call:请求响应类型,一个请求发送出去以后,需要等待响应;调用需要指定目标服务结点;
rpc.cast:单向RPC,只将请求发送出去,不需要等待结果;不关心请求由哪个服务结点完成。
Nova RPC结构
下图说明了Nova RPC机制的主要结成部分(以使用RabbitMQ为例)。从调用关系上来说,Nova服务要么以调用方(Invoker:API,Scheduler)角色来使用消息队列,要么以服务方(Worker:Compute,Volume,Network)角色来使用消息队列。调用方通过rpc.call和rpc.cast发送消息;服务方从消息队列接收消息,并对rpc.call请求做出响应。
从生命周期上来说,TopicPublisher,DirectConsumer,DirectPublisher三部分是在rpc.call发起的时候创建的;而TopicConsumer是Nova的各个服务在启动时创建,并在服务结束时销毁。Nova中每一个服务在启动时会创建两个TopicConsumer:一个以NODE-TYPE为交换器键(Exchange Key),一个以NODE-TYPE.HOST为交换器键。
rpc.call调用流程
1).
初始化一个TopicPublisher,发送消息到消息队列;在发送消息之前,初始化一个DirectConsumer(以消息ID为交换器的名称),用于等待响应消息;
2).
消息被交换器分发到NODE-TYPE.HOST消息队列(下图中的topic.host),并被相应服务结点(根据host确定)的TopicConsumer获取到;
3).
服务结点根据消息内容(调用函数及参数)调用相应服务;调用完成后,初始化一个DirectPublisher,并根据消息ID将响应消息发送到相应的消息队列;
4).
响应消息被调用方的DirectConsumer获取到,调用完成。
rpc.cast调用流程
1).
初始化一个TopicPublisher,并将消息发送到消息队列;
2).
消息被交换器分发到NODE-TYPE消息队列(下图中的topic),并被相应服务的结点TopicConsumer获取到,然后根据消息内容调用相应服务完成调用。
==================================
上面是OpenStack文档里的主要内容,详细内容见这里。消息队列还有两种用法未在上面文档里说明。
实际上,Nova每个服务在启动时,还有创建第三个消费者:FanoutConsumer,不过这个Consumer只有一个应用:scheduler更新服务功能,通过rpc.fanout_cast调用(参见$NOVA_ROOT/nova/scheduler/api. update_service_capabilities)。
另一种用法是rpc.notify,基于消息队列做成的一个事件通知机制,当有事件发生时,比如有计算结点挂起和继续时,会通过notifier.notify发送类似compute.instance.suspend或者compute.instance.resume的事件。详见$NOVA_ROOT/nova/notifier/api.notify
及$NOVA_ROOT/nova/notifier/rabbit_notifier.notify。
- 大小: 26.1 KB
- 大小: 43.9 KB
- 大小: 40 KB
- 大小: 29.9 KB
分享到:
相关推荐
Spring AMQP API(Spring AMQP 开发文档).CHM 官网 Spring AMQP API。Spring AMQP 开发文档。
amqp0-8.pdf来源:https://www.rabbitmq.com/resources/specs/amqp0-8.pdf specs/amqp0-9-1.pdf来源:https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf A080219O.pdf来源:...
rabbit的AMQP协议介绍
amqp1.0协议翻译
amqp-client-5.10.0.jar
amqp-client 5.4.3
AMQP10标准 This document defines a networking protocol, the Advanced Message Queuing Protocol (AMQP), which enables conforming client applications to communicate with conforming messaging middleware ...
赠送jar包:amqp-client-5.5.0.jar; 赠送原API文档:amqp-client-5.5.0-javadoc.jar; 赠送源代码:amqp-client-5.5.0-sources.jar; 赠送Maven依赖信息文件:amqp-client-5.5.0.pom; 包含翻译后的API文档:amqp-...
适用于win7 64位 php5.6 rabbitmq.1.dll 放在PHP根目录 php_amqp.dll 放在ext目录 php.ini 添加一行 extension=php_amqp.dll
amqp-1.9.3
赠送jar包:amqp-client-5.5.0.jar; 赠送原API文档:amqp-client-5.5.0-javadoc.jar; 赠送源代码:amqp-client-5.5.0-sources.jar; 赠送Maven依赖信息文件:amqp-client-5.5.0.pom; 包含翻译后的API文档:amqp-...
amqp.so是rabbitmq php的扩展,这个amqp.so可以应用在mac电脑中,可以放在mamp 环境中
赠送jar包:amqp-client-5.1.2.jar; 赠送原API文档:amqp-client-5.1.2-javadoc.jar; 赠送源代码:amqp-client-5.1.2-sources.jar; 赠送Maven依赖信息文件:amqp-client-5.1.2.pom; 包含翻译后的API文档:amqp-...
赠送jar包:amqp-client-5.1.2.jar; 赠送原API文档:amqp-client-5.1.2-javadoc.jar; 赠送源代码:amqp-client-5.1.2-sources.jar; 赠送Maven依赖信息文件:amqp-client-5.1.2.pom; 包含翻译后的API文档:amqp-...
压缩包包含两部分,spring-amqp为java版的Spring AMQP的实现,spring-amqp-sample为补充版(也可作为快速入门的)
Spring AMQP 是基于 Spring 框架的 AMQP 消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的 POJO。同时有 Java 和 .NET 的版本。
amqp高级消息队列协议v1.0
Spring AMQP 是基于 Spring 框架的 AMQP 消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的 POJO。同时有 Java 和 .NET 的版本。示例代码:public static void main(final String... args...
spring-amqp 相关jar , 最近在学spring amqp是时候找jar找了好长时间,现在找全了,在这分享给大家。
Laravel开发-laravel-amqp 用于laravel和lumen发布和使用消息的AMQP包装器