[OpenStack Icehouse] 消息处理架构Oslo/Messaging

文章装载自:http://blog.csdn.net/juvxiao/article/details/23532617

在Icehouse中, rpc消息队列相关处理从OpenStack.common.rpc慢慢的都转移到oslo.messaging上, 现在仅有几个项目没有转移, 将来也会转, 这个架构更合理, 代码结构清晰, 且弱耦合.

本文章主要针对rpc, notify基本没涉及, 有时间总结总结.

基本概念

Server: 为各个Client提供RPC接口,它是消息的最终处理者;

Client: RPC接口的调用端, 我们常见的cast和call方法就是在这端调用;

Exchange: 理解为一个消息交换机, 把消息分类,告诉何种路由到何种queue;

Topic: 是一个RPC消息的唯一标识; servers监听这个topic的消息; client负责发出这个topic的消息;

Namespace: servers可以在一个topic上,提供多种方法集合, 这些方法集合通过namespace来分开管理;

Method: 这个慨念很简单, 就是函数, 即远程方法调用中的方法;

API version: 也就是server上提供的RPC api接口集合的版本号,openstack中1.0起步, servers可以一次提供多种api version,client每次请求时只需描述它所需要的最低version就ok;

Transport: 可以理解为传输载体,这个很好理解, 就是我们使用的消息队列中间件RabbitMQ, Qpid, ZeroMQ等等, 是负责整个消息处理的系统, 它负责消息传输直到提供给clients返回, 使用此系统者, 不用了解细节,  Openstack中实现的主要有这三种, AMQP标准下的rabbitMQ和Qpid, 和非AMQP的ZeroMQ, ZeroMQ更底层, 速度更快, 据说快10倍。

Target这是个很重要的概念, 它描述了信息的处理方式, 该发哪里去(server属性)和消息处理端(server)监听什么信息(topic 属性)。以下是Target的属性

exchange (defaults to CONF.control_exchange)

topic

server (optional) 它会使server的标示, 如host or host@backend 等等

fanout (defaults to False)这种模式类似于广播, 符合条件的server都要监听并做处理

namespace (optional)

API version (optional)

Use Cases [OpenStack中使用场景]

1.存在多个接口版本的server, 随机选择一个处理远程调用的方法

比如我们有多个接口版本的servers在监听某个exchange上某个topic的方法调用, 一旦方法调用, 就会随机选择一个版本的server来监听。

nova-api 调用'nova' exchange上 topic为'scheduler' 的'run_instance'方法, 然后,会有一个‘nova-scheduler’服务捕获请求

2.存在多个接口版本的server, 特定server处理远程调用的方法

比如我们有多种接口版本的servers在监听某个exchange上某个topic的方法调用, 不同于之前的是, 它要求选择一个特定版本的server来监听。

nova-scheduler 选择 'foobar' host去运行一个instance,那么就调用'nova' exchange上 topic为'scheduler' 的'run_instance'方法, 它同时指定要在“foobar”这个server上run

3.存在多个接口版本的server, 每个server都要处理远程调用的方法, 即所谓的fanout

比如我们有多种接口版本的servers在监听某个exchange上某个topic的方法调用, 不同于之前的是, 它要求每个server都要监听并运行这个方法。

nova-compute 周期性的在faout模式调用 'update_service_capabilities' 方法, topic为 'scheduler',exchange为'nova' , 这样每个nova-scheduler 服务都要捕获并处理它

对象关系图

Server端:消息队列的监听会在service启动的时候开启, 比如cinder-volume启动时,会启动MessageHandlingServer( 下面具体介绍),来监听消息并把消息dispatch到距离的Manager方法中做消息处理.

Client端: 负责消息发出,方法调用的code是在具体API中,如本例的VolumeAPI, 一般存放在rpcapi.py中.

为了进行详细解释,先画出整体的对象依赖图:

消息处理端 [Server端]

MessageHandlingServer

这个就是server端,是消息的最终处理者。

Server端的实现有个两个重要的内部概念:dispatchers 和executors, dispatcher专注在消息的加载并调度到合适的方法。 executor是专注在怎样从transport中获得消息并把它分配给dispatcher的策略,是重开一个线程还是在现有线程上继续处理。实现dispatchers可以为rpc或者notification, executors可以为block或者eventlet

transport:消息中间件,rabbitMQ or Qpid or ZeroMQ

dispatcher:rpc或者notification

executor:block或者eventlet,默认block, 它描述的是I/O策略,是重开一个线程(EventletExecutor类实现)还是在现有线程上继续处理(BlockingExecutor实现)。

MessageHandlingServer的start()方法开始后 , 就会一直获取消息队列中信息,并把消息分配给dispatcher, 直到stop()方法被调用。

RPCDispatcher

RPC消息调度器

MessageHandlingServer就依赖它完成从消息到具体处理消息的方法的调度。

它主要干了 两件事

1) 它利用Transport类(Transport又利用AMQPDriverBase的listen()) 获得监听器, 并报告给Executor

[python]view plaincopy

deflisten(self, target):

conn =self._get_connection(pooled=False)

listener = AMQPListener(self, conn)

conn.declare_topic_consumer(target.topic, listener)

conn.declare_topic_consumer('%s.%s'% (target.topic, target.server),

listener)

conn.declare_fanout_consumer(target.topic, listener)

returnlistener

以上代码可以看到listener里做了什么, declare了三个consumer, topic, topic.host, fanout, 正好呼应上面介绍的三种user case。关于consumer, 将会在另一遍博文(介绍amqp的publisher/consumer机制)中来介绍

2) 把监听器poll出来的消息通过这个dispatcher传到XXXManager中的具体处理方法上

关于connectionpool不详细介绍了,它是与具体Transport的连接池。

消息发出端[Client端]

主要都写在rpcapi.py 中, 本文以Cinder项目为例,讲述delete_volume消息发出的过程。

[python]view plaincopy

classVolumeAPI(object):

BASE_RPC_API_VERSION ='1.0'

def__init__(self, topic=None):

super(VolumeAPI,self).__init__()

target = messaging.Target(topic=CONF.volume_topic,

version=self.BASE_RPC_API_VERSION)

self.client = rpc.get_client(target,'1.15')

....

defdelete_volume(self, ctxt, volume, unmanage_only=False):

cctxt =self.client.prepare(server=volume['host'], version='1.15')

cctxt.cast(ctxt,'delete_volume',

volume_id=volume['id'],

unmanage_only=unmanage_only)

RPCClient

负责通过消息队列发消息到消息队列中,两种方法调用的方式:cast  & call。关于这两种方法也将会在另一遍博文(介绍amqp的publisher/consumer机制)中来介绍

会利用Transport的send方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • cinder RPC 分析 [TOC] 我们都知道在Cinder内部,各组件之间通讯是通过RPC api,比如c...
    笨手笨脚越阅读 1,783评论 0 3
  • 第一章 OpenStack基础 OpenStack管理的资源及提供的服务OpenStack做为一个操作系统,...
    sgt_tiger阅读 12,866评论 4 72
  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,344评论 2 34
  • 2017年4月11日 星期二 阴转多云 下午5:28分 作者:玉立集 未来之门 大人们经常说 你们小孩家家的 ...
    玉立集阅读 193评论 2 0