openstack 王者归来学习笔记
rpc.call方法执行的流程:(下次看代码的时候可以根据这流程来看,注意:由于rpc服务器和客户端具有很松的耦合性,因此以上步骤并不是绝对的。)
1.rpc服务器定义和启动rpc服务
2.rpc服务器建立与rabbitmq服务器的连接
3.rpc服务器创建和激活主题消费者
4.rpc客户端向主交换机发送rpc请求
5.rpc服务器接收和处理rpc请求
6.rpc客户端创建和激活直接消费者,并等待rpc响应。
目前有许多工具包实现了与rabbitmq的交互,openstack中使用的是kombu,Kombu is a messaging library for Python.(Kombu是一个针对Python的消息传递库。)
RPC call代码学习 server.py
import service srv = service.Service() #创建RPC服务
srv.start() 1 #启动RPC服务 while True:
srv.drain_events() #监听RPC请求,这个方法的功能是用来接收和处理PRC请求,调用BrokerConnection对象的drain_events方法,用的是
impl_kombu.py文件中的 self.connection = kombu.connection.BrokerConnection(**rabbit_params),但是help(kombu.connection)却找不到BrokerConnection
service.py
import rpc
import manager
import dispatcher TOPIC = 'sendout_request' class Service(object):
def __init__(self):
self.topic = TOPIC
self.manager = manager.Manager() def start(self): 2
self.conn = rpc.create_connection() 3
rpc_dispatcher = dispatcher.RpcDispatcher(self.manager)
self.conn.create_consumer(self.topic, rpc_dispatcher)
self.conn.consume() def drain_events(self):
self.conn.drain_events()
rpc.py
import impl_kombu def create_connection():
return impl_kombu.Connection() 4
impl_kombu.py 这个文件实现了import kombu 接口,Kombu is a messaging library for Python.(Kombu是一个针对Python的消息传递库。)
class Connection(object):
def __init__(self):
self.consumers = []
self.connection = None
self.reconnect() 5
def reconnect(self): 6
sleep_time = conf.get('interval_start', 1) conf这里是字典,get的方法的作用是如果有interval_start这个值就获取出来,如果没有就用默认值1
stepping = conf.get('interval_stepping', 2)
interval_max = conf.get('interval_max', 30)
sleep_time -= stepping while True:
try:
self._connect() 7
return
except Exception, e:
if 'timeout' not in str(e):
raise sleep_time += stepping
sleep_time = min(sleep_time, interval_max)
print("AMQP Server is unreachable,"
"trying to connect %d seconds later\n" % sleep_time)
time.sleep(sleep_time)
def _connect(self): 8
hostname = rabbit_params.get('hostname')
port = rabbit_params.get('port') if self.connection: #第一次调用这里是none所以会执行if外的语句
print("Reconnecting to AMQP Server on "
"%(hostname)s:%(port)d\n" % locals())
self.connection.release()
self.connection = None self.connection = kombu.connection.BrokerConnection(**rabbit_params) 9 **的意思是传的参是一个字典,https://www.cnblogs.com/omg-hxy/p/9081177.html 这是kombu的接口,不过用help(kombu.connection)没有找到
self.consumer_num = itertools.count(1) #itertools.count(1) 这里会count()会创建一个无限的迭代器
self.connection.connect() #这里self.connection是BrokerConnection的对象,Establish connection to server immediately.
self.channel = self.connection.channel() #这里self.connection是channel()是BrokerConnection的对象,Create and return a new channel.
for consumer in self.consumers: #第一次self.consumers没有值, 所以一次返回到 7 ,5,4,3接着会执行3以后的代码,然后返回到1下面的while true
consumer.reconnect(self.channel)
server.py while True:
srv.drain_events() 到这里最终调用了哪里,为什么就停止在这里了? Wait for a single event from the server.
openstack 王者归来学习笔记的更多相关文章
- JavaWeb王者归来学习笔记
JavaWeb王者归来学习笔记... Ajax王者归来: Ajax:Asynchronous JavaScript And XML -------Ajax 是一些旧有技术的结合.但却以一种新的姿态.披 ...
- Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)
本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...
- Openstack swift 学习笔记
Swift 不是文件系统或者实时的数据存储系统,而是对象存储,用于长期存储永久类型的静态数据.这些数据可以检索.调整和必要时进行更新.Swift最适合虚拟机镜像.图片.邮件和存档备份这类数据的存储. ...
- 【转载】OpenStack Swift学习笔记
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:崔炳华 原文地址:http://blog.csdn.net/i_ch ...
- openstack学习笔记一 虚拟机启动过程代码跟踪
openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...
- 关于OpenStack的学习路线及相关资源汇总
首先我们想学习openstack,那么openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更 ...
- Go语言学习笔记四: 运算符
Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...
- eventlet学习笔记
eventlet学习笔记 标签(空格分隔): python eventlet eventlet是一个用来处理和网络相关的python库函数,且可以通过协程(coroutines)实现并发.在event ...
- Puppet学习笔记(CentOS6.3+Puppet3.01)
Puppet学习笔记(CentOS6.3+Puppet3.01) 技术 Add comments Oct262012 下了决心,好好学习puppet,周末专门去参加一个puppet的培训,难得朋友那 ...
随机推荐
- Android 开发 values目录里定义数组、颜色、文本、尺寸xml配置文件并且获取数据 附录Android符号转码表
以下xml都在res/values/文件夹下创建 创建String类型array: /app/src/main/res/values/array.xml <?xml version=" ...
- Anatomy of a Database System学习笔记 - 概论、并发控制
<Anatomy of a Database System>这篇发表于87年.一共48页的论文据说是DBA入门必看,但是找了全网没有找到中文翻译.这篇文章对关系型数据库确实有提纲挈领的作用 ...
- PHP原生写的生成图片缩略图类
PHP原生写的生成图片缩略图类,本文以京东商品图片为例,分别生成三种不同尺寸的图片.调用方法很简单只要传参数高度和宽度,及新图片的名称. 引入缩略图类 include_once 'ImageResiz ...
- mongodb集群部署
一.安装Mongodb(Tarballs) 1.检查依赖文件包: yum install libcurl openssl 2.解压文件到/usr/local/ tar -zxvf mongodb-li ...
- VS C# debug文件夹中各文件的作用
*.exe 生成的可运行exe文件 *.exe.config 它的内容是依据app.config文件生成的,app.config是开发时的配置文档,*.exe.config是程序布署时的配置文件 *. ...
- 页面跳转、URL直接访问限制
问题 URL控制是为了避免以下错误 当前页需要读取上一页缓存,但是当前页直接通过URL访问无法获得相应的缓存 当前页需要通过入口,清楚历史中保留的缓存,但是当前页直接通过URL访问没有清除 本质上是为 ...
- nginx 做数据仓库时,location 404 Not Found,发现找不到要用的数据报:Not Found
背景: 获得远程机器某个目录下的数据文件 方案:使用Nginx配置 1./home/ftp/www/ 下面有images 文件夹,为了访问images下面文件,配置Nginx如下: location ...
- python入门(十):模块、包
模块:py文件包:目录,目录里面包含__init__.py,内容可以是空里面可以包含多个模块文件,还可以包含子包 1.模块和包,可以很方便的提供给其他程序以复用 1) 利于组织复杂工程 我们写代码的时 ...
- Eclipse设置类,方法注释模版
首先打开Eclipse配置选项:Window->Preference->Java->Code Style->Code Template 配置Comments下的每个选项的模版, ...
- 【练习】Python第一,二次
练习一 1,执行Python脚本的两种方式 a,Python解释器 b,Python 1.py 2,简述位和字节的关系 一个字节等于8位 3,简述ascii,unicode,utf-8,gbk的关系 ...