设为首页 收藏本站
查看: 2398|回复: 6

[经验分享] OpenStack中的消息队列2--以Quantum为例

[复制链接]

尚未签到

发表于 2013-3-29 08:54:49 | 显示全部楼层 |阅读模式
基础

# A queue is not bound by any limits, it can store as many messages as you like ‒ it's essentially an infinite buffer.
# If we send a message to non-existing location, RabbitMQ will just trash(丢弃) the message.
# Creating a queue using queue_declare(python) is idempotent ‒ we can run the command as many times as we like, and only one will be created.
# By default, RabbitMQ will send each message to the next consumer, in sequence on one queue, called round-robin
# It's a common mistake to miss the basic_ack(消息确认). It's an easy error, but the consequences are serious. Messages will be redelivered when your client quits (which may look like random redelivery), but RabbitMQ will eat more and more memory as it won't be able to release any unacked messages.
# RabbitMQ doesn't allow you to redefine an existing queue with different parameters
# we can set ‘durable’ to queue and set ‘delivery_mode’ to messages.
# on consumer side, channel.basic_qos(prefetch_count=1) don't dispatch a new message to a worker until it has processed and acknowledged the previous one(Pay attention: If all the workers are busy, your queue can fill up)
# exchange type: direct, topic, headers and fanout
a direct exchange is simple - a message goes to the queues whose binding key exactly matches the routing key of the message. Also, we can bind multiple queues with the same binding key, just like the fanout type exchange.
Topic exchange is powerful and can behave like other exchanges. When a queue is bound with "#" binding key - it will receive all the messages, regardless of the routing key - like in fanout exchange. When special characters "*" and "#" aren't used in bindings, the topic exchange will behave just like a direct one.
# 在client端, 一个无参的queueDeclare()创建一个非持久化的,自动删除的,具有唯一名字的临时队列
# once we disconnect the consumer, the queue which has an exclusive flag should be deleted.
# 只有持久化的queue才能绑定到持久化的exchange上
# The AMQP protocol predefines a set of 14 properties that go with a message. Most of the properties are rarely used, with the exception of the following:
delivery_mode: Marks a message as persistent (with a value of 2) or transient (any other value).
content_type: Used to describe the mime-type of the encoding. For example for the often used JSON encoding it is a good practice to set this property to: application/json.
reply_to: Commonly used to name a callback queue.
correlation_id: Useful to correlate RPC responses with requests

命令

rabbitmqctl list_queues
rabbitmqctl list_exchanges
rabbitmqctl list_bindings
rabbitmqctl list_queues name messages_ready messages_unacknowledged  列出队列中待处理和未确认的消息个数
rabbitmq-server –detached  启动RabbitMQ server
rabbitmqctl stop
rabbitmqctl status
rabbitmqctl cluster_status

RabbitMQ在OpenStack中的使用

之前曾今写过一篇Blog介绍这个话题,此次以G版中的quantum(OVS)为例再简单介绍一下。

quantum-agent

ovs-agent启动时初始化消息队列的代码在setup_rpc函数中:
1364472993_6269.jpg
由上面的代码中consumers变量定义了三个字符串:
q-agent-notifier-port-update
q-agent-notifier-network-delete
q-agent-notifier-tunnel-update
进而,由Kombu实现,创建了三个FanoutConsumer对象(这三个对象的生命周期随进程的结束而结束),分别监听三个绑定在不同fanout类型exchange上的queue。也就是说,系统中有至少有三个fanout类型的exchange,名称分别为:
q-agent-notifier-port-update_fanout
q-agent-notifier-network-delete_fanout
q-agent-notifier-tunnel-update_fanout
每个exchange上绑定有一个queue,名称分别为(其中的UUID是系统生成的唯一的标识号):
q-agent-notifier-port-update_fanout_UUID
q-agent-notifier-network-delete_fanout_UUID
q-agent-notifier-tunnel-update_fanout_UUID
其实这里的名称只是作为一个标识,因为发往fanout类型的exchange的消息是不需要定义routing-key的。

上述的exchange和queue名称也可以在controller节点上通过使用rabbitmqctl list_bindings命令查看。

在ovs plugin中,以update_port为例:
1364472999_9923.jpg
进入port_update:
1364473005_9685.jpg
这里,plugin组装消息,创建一个临时的FanoutPublisher(发送完消息,该对象被关闭),将消息发送到一个exchange,exchange的名称为”<topic>_fanout”,也就是” q-agent-notifier-port-update_fanout”。也就是说,fanout_cast()函数中的topic参数其实是定义了fanout类型exchange的名称。于是上述的agent就能收到消息并处理了。整个结构如下图:
1364473011_7256.jpg

quantum-plugin

同样的,在plugin启动时,会创建TopicConsumer,监听名称为q-plugin的队列,该队列以binding-key=’q-plugin’绑定在名称为’openstack’、类型为topic的exchange上。
self.conn.create_consumer(self.topic, self.dispatcher, fanout=False)
上述代码中的topic其实是定义了队列的名称和binding-key。这一点与agent不同。

dhcp-agent/l3-agent

dhcp-agent和l3-agent需要与quantum-plugin交互以获取网络的信息,并且需要向plugin定时上报状态。以report_state为例:
1364473017_4102.jpg
这里的topic是’q-plugin’。可以看到report_state方法是同步调用。同步调用相对来说比较复杂:
1. 在G版,所有的同步调用都使用同一个direct类型的exchange,名称为’reply_UUID’,上面绑定有一个queue,名称也为’reply_UUID’,当系统进行第一次call调用时,创建exchange和queue,创建动作在ReplyProxy对象中。
2. 消息中加入’ _reply_q’字段(= reply_UUID),这样TopicConsumer就可以根据消息的属性,知道该把消息返回到那个exchange。
3. 为此次同步调用创建一个MulticallProxyWaiter对象,注册到ReplyProxy对象中,该对象有一个消息队列,并在该队列上阻塞,直到该队列中收到消息。
4. ReplyProxy对象维护一个字典,key为msg_id,value为MulticallProxyWaiter对象,当queue中收到消息,根据消息的’ _msg_id’字段找到注册到字典的MulticallProxyWaiter对象,将消息放入该对象的消息队列中。这样MulticallProxyWaiter对象就可以拿到消息同步返回了。

当plugin收到消息,调用响应的方法处理后,看到消息中有’ _reply_q’字段,于是就会创建一个临时的DirectPublisher向’ _reply_q’表示的exchange发送响应。

当然,dhcp-agent与l3-agent一样,都需要接受调度,所以在进程启动时也会创建一个FanoutConsumer(监听名为’ dhcp_agent_fanout_UUID’,绑定在名为’ dhcp_agent_fanout’、类型为fanout的exchange上的queue)和两个TopicConsumer(一个监听名为’ dhcp_agent’,以binding-key=’dhcp_agent’绑定在名为’openstack’、类型为topic的exchange上的queue,另一个监听名为’dhcp_agent_HOSTMANE’,以binding-key=’dhcp_agent_HOSTMANE’绑定在同一个exchange上的queue)



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-4567-1-1.html 上篇帖子: Openstack 创建Centos 镜像文件 下篇帖子: openstack的常用命令

尚未签到

发表于 2013-3-29 08:59:00 | 显示全部楼层
我抢、我抢、我抢沙发~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-16 00:34:12 | 显示全部楼层
床上运动也可以减肥的,你们都不知道吗?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-16 11:36:08 | 显示全部楼层
美女未抱身先走,常使色狼泪满襟。。。。。。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-17 05:13:17 | 显示全部楼层
所有刻骨铭心的爱都灵魂游离于床上的瞬间!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-17 16:50:18 | 显示全部楼层
啥时硬件也可以COPY就好了!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-5-18 08:20:35 | 显示全部楼层
帮帮顶顶!!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表