oslo.messaging库为OpenStack各个项目使用RPC和事件通知(Event Notification)提供了一套统一的接口。

oslo.messaging库是支持amqp、kafka等通信协议的,由于openstack使用amqp协议,且默认使用kombu的库来进行amqp协议通信,因此我们主要围绕着kombu实现的amqp的driver来剖析。

oslo.messaging提供的RPCClient类用于RPC调用,主要提供了两个接口call及cast,分别表示同步rpc调用及异步rpc调用,在openstack里也是使用这两个接口进行RPC调用的。接下来我们就从这个类入手。首先,看下该类类图:

RPCClient继承于_BaseCallContext类,call、cast的实现主要是在_BaseCallContext类,在这两个函数里主要是调用Transport._send来进行调用。其中_CallContext继承_BaseCallContext类主要是实现类方法_prepare,后续RPCClient的prepare直接调用该类方法,该方法可以用于设置调用RPC前的一些参数。从上面的类图看,真正实现功能的是Transport类,接下来我们看下Transport类的类图:

从Transport的_send()源码可以看到它是调用self._driver.send函数来实现的,而这里核心点就在于这个_driver,这里还要注意的是有一个全局的get_transport函数用于创建具体的Transport对象,相当于一个Factory函数,在里面我们将看到它使用了stevedore库里的driver.DriverManager方法来实现后端driver的创建。

stevedore库是oslo项目中为OpenStack其他项目提供动态加载功能的公共组件库。stevedore利用python的特性,使得动态加载代码变得更加容易,其也允许你在运行时通过发现和加载扩展插件来配置和扩展你的应用程序。这里get_transport就是通过在传入的url来搜索合适的后端driver,在setup.cfg文件我们可以看到不同的driver:

oslo.messaging.drivers =

rabbit = oslo_messaging._drivers.impl_rabbit:RabbitDriver

amqp = oslo_messaging._drivers.impl_amqp1:ProtonDriver

# This driver is supporting for only notification usage

kafka = oslo_messaging._drivers.impl_kafka:KafkaDriver

# To avoid confusion

kombu = oslo_messaging._drivers.impl_rabbit:RabbitDriver

# This is just for internal testing

fake = oslo_messaging._drivers.impl_fake:FakeDriver

由上面配置可以看出使用kmobu对应的driver是oslo_messaging._drivers.impl_rabbit:RabbitDriver,因此,我们接着看RabbitDriver的类图。

从上面的类图可以看到所有的后端driver都是继承于BaseDriver这个接口类,而RabiitDriver继承AMQPDriverBase类,AMQPDriverBase实现了RPC通信的业务逻辑,通过在ConnectionPool中获取具体的connection,再调用具体connection相对应的发送函数(direct_send、topic_send等)。而RabbitDriver继承AMQPDriverBase类后,主要功能是在类初始化时把ConnectionPool跟对应的Connection对象初始化好。在代码中也可以看出Connection是最终调用combu库的类。

oslo.messaging库相关推荐

  1. RabbitMQ and Oslo.messaging

    基本概念 Openstack的官网上也有这个的使用介绍:http://docs.openstack.org/developer/oslo.messaging/ 建议先把这个教程看一遍:https:// ...

  2. 探索 OpenStack 之(15):oslo.messaging 和 Cinder 中 MessageQueue 消息的发送和接收

    前言:上一篇文章 只是 RabbitMQ 的科普,本文将仔细分析 Cinder 中 RabbitMQ 的各组件的使用.消息的发送和接收等.由于各流程步骤很多,本文只会使用若干流程图来加以阐述,尽量做到 ...

  3. 消息队列 64式 : 2、oslo.messaging消息处理源码分析

    目标: 弄清楚oslo messaging中executor为threading的处理过程 1 总入口 ceilometer/collector.py class CollectorService(c ...

  4. firebase 推送_使用Firebase Cloud Messaging发送推送通知

    firebase 推送 Ever wondered how does your smartphone receive and handle notifications whether be in fo ...

  5. OpenStack搭建过程(随笔搭建)

    项目二 理论知识 1.项目需求分析 1.基本概念 需求分析是指理解用户需求,就用户的功能需求与客户达成一致,并需要估计项目风险和评估项目代价,最终形成开发计划的一个复杂过程.在这个过程中,用户是处在主 ...

  6. OpenStack搭建M版本 (VM安装)

    理论基础 1.云计算的起源 早在2006年3月,亚马逊公司首先提出弹性计算云服务. 2006年8月9日,谷歌公司首席执行官埃里克·施密特(Eric Schmidt)在搜索引擎大会上首次提出" ...

  7. GoLang各种库(转)

    原文出处:https://www.jianshu.com/p/6a147fc00721 golang用于创建和发送电子邮件的库 douceur - HTML 邮件中的内联 CSS email - 一个 ...

  8. OpenStack公共组件oslo之十二——oslo.policy

    众所周知,OpenStack使用基于角色的权限访问控制(RBAC),在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个组织中,角色是为了 ...

  9. OpenStack Newton发布,EasyStack核心代码贡献中国第一!

    本周,OpenStack正式发布了第14个版本Newton,使OpenStack成为虚拟化.裸机.容器的统一云平台,并在可扩展性.可靠性和用户体验方面均有显著提升. 同时,Newton全球社区代码贡献 ...

最新文章

  1. reshape功能介绍_函数 reshape 的用法
  2. python360百科_python抓取360百科踩过的坑!
  3. 详解Paint的各种set方法
  4. LeetCode 814. 二叉树剪枝(递归)
  5. MySQL 删除存储过程
  6. 缓冲区溢出攻击-C语言中的危险函数
  7. elastic-job控制台部署与使用
  8. arcgis api for js入门开发系列十二地图打印(GP服务)
  9. 聚合支付SAAS系统OEM贴牌定制开发聚合支付系统开发、聚合支付平台开发等。
  10. 入门级概述光学相干层析(OCT)原理
  11. 行内元素之间产生的间隙
  12. 台式计算机怎么开声音,台式电脑没有声音【设置办法】
  13. 青箬笠,绿蓑衣,斜风细雨不须归
  14. C++知识小屋(3):用虚基类构造仙法·风遁·螺旋手里剑
  15. SecureCrt 连接服务器失败 key exchange failed 解决方案
  16. Fremont弗里蒙特_US机房测速
  17. 如何在 Mac 上安装 Maven
  18. 线程中断标志位 interrupt()、interrupted()、isInterrupted() 的认识
  19. 如何享受人生,享受工作-读书笔记-得你所想、享你所得
  20. Kafka Producer对连接的管理

热门文章

  1. 美剧推荐:abc新剧Traveler
  2. 迪思杰oracle 11g rac,Oracle 11g RAC UDEV管理RAC共享存储
  3. 2021年第十二届蓝桥杯省赛B组(C/C++)个人题解
  4. Date 的GMT、UTC、ISO、CST、timestamp 等格式 及Moment、Dayjs
  5. 宏定义和函数有何区别
  6. MyBatis源码简单分析
  7. matlab设置xyz,matlab基本XYZ立体绘图命令
  8. DP问题之01背包如此简单
  9. 操作成功失败html,固话呼叫转移设置不成功怎么办?
  10. HTML语言教程(完整版)