1.历史:

2004年,摩根大通和iMatrix开始着手Advanced Message Queuing Protocol (AMQP)开放标准的开发。2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布 
AMQP是规范,rabbitmq是具体的一种实现技术

2.AMQP模型

 
通信模型: 1.建立一个连接Connection. 
2.这个连接将产生一个信道,该信道可以被生产者与消费者同时使用,是实际传输数据的一个流。这里大概是半双工的。 
3.Producer发送消息 
4.根据Routing_key,进行路由转发 
5.监听在某一queue上的consumer,一旦有可用消息,queue就将消息发送给consumer 
6.Consumer需要发送一条ack给队列表示消息已经收到 
具体代码. 
注意,Publisher,Consumer以及amqp服务器的代码可以分别运行于三台物理主机上! 
代码可以如下:

消息接收方的代码:
(ip:192.168.8.2)
#/usr/bin/python
from kombu import Queue,Exchange
from kombu.messaging import Consumer
from kombu.connection import Connectiondef process_data(body,msg):print bodymsg.ack()try:connection=Connection('amqp://root:123456@192.168.8.108:5672//')
except Exception:raisechannel=connection.channel()_exchange = Exchange('media','direct',channel)
video_queue = Queue('video',exchange=_exchange,routing_key='video',channel=channel)
consumer=Consumer(channel,queues=[video_queue],callbacks=[process_data])
consumer.consume()while True:connection.drain_events(timeout=15)consumer.cancel()

以及:

发送方的代码:
(ip:192.168.8.3)
from kombu.entity import Exchange
from kombu.messaging import Producer
from kombu.connection import Connection
from time import sleepconnection= Connection('amqp://root:123456@192.168.8.108:5672//')
channel=connection.channel()_exchange=Exchange('media','direct',channel)
producer=Producer(channel,exchange=_exchange,routing_key='video')
for i in range(10):producer.publish({'name':'fuckyou.avi','size':13131})print 'published!'sleep(1)

可以看出,都是现在本地把相关的信息配置好了之后,再向服务器发送请求。对于发送端来说,producer.publish()方法实际上是将本地申请的exchange以及要发送的信息发送到服务端,服务端的amqp server接收到请求后,会在服务器端创建一个名字为'media'的exchange. 
可以利用以下命令来查看:

rabbitmqctl list_exchanges

对于来说, 然后这个时候应该会看到,名字为'media',类型为direct的exchange已经在rabbitmq-server上创建了 
同理,当使用consumer.consume()之后,也将consumer中注册的回调函数传入到本地的connection对应的channel中了 然后等本地的connection.drain_events()之后,会将以consumer_id号注册的callback取出并调用

3.关于queue的疑问

1.fanout是无需路由键的

2.direct exchange

可能会出现组播的情况??

4.多重绑定的问题

今天遇到了个多重绑定的问题

两个不同的实例接收消息,相同的队列、相同的交换机、相同的routingkey,

但是数据是交替接收的,不能两个实例同时接收同一条消息

想要解决其实很容易,只需要没两个实例所绑定的队列不同即可,最简单的就是以不同的名字申明所绑定的队列

OpenStack AMQP与kombu相关推荐

  1. Openstack 中的消息总线 AMQP

    目录 目录 消息总线 消息总线的原理 AMQP 消息总线 Openstack 采用了面向服务的开发模式(有别于面向对象和面向过程),需要我们去考虑各个服务之间和各项目之间是如何传递消息的. Restf ...

  2. openstack 王者归来学习笔记

    rpc.call方法执行的流程:(下次看代码的时候可以根据这流程来看,注意:由于rpc服务器和客户端具有很松的耦合性,因此以上步骤并不是绝对的.) 1.rpc服务器定义和启动rpc服务 2.rpc服务 ...

  3. 关于在openstack执行nova get-vnc-console命令,无法得到vnc url并提示服务器超时的问题描述...

    情景描述: 在一台openstack的控制节点上执行nova get-vnc-console UUID novnc命令,无法输出带有token的NoVNC url地址,添加debug选项再次运行该命令 ...

  4. OpenStack——开放栈(源自NASA的开源云管理软件)

    概述 是什么? 开放栈(OpenStack)是一个免费的开放标准的云计算平台,用于构建基础设施即服务(IaaS)业务. 谁在用? 开放栈同时被公有云和私有云大量部署使用,几乎是目前最流行的云平台构建软 ...

  5. #Sora#openstack基础库stevedore试用总结

    2019独角兽企业重金招聘Python工程师标准>>> 什么是stevedore? stevedore是建立在setuptools的entry point的功能上的,用于python ...

  6. OpenStack Summit Vancouver 会议纪要

    我主要在温哥华峰会关注了Design Summit Operator Track的内容,纪录了整个会议各类相关主题的讨论, 有一些是我参与的,有一些的翻译的会议纪要(难免有理解错误和疏漏,请多包涵). ...

  7. 源码安装OpenStack Ussuri ---Keystone篇

    源码安装OpenStack Ussuri -Keystone篇 前面我们进行了准备的操作,现在开始源码安装Keystone ,Keystone源码已经上传到我的gitee上面了,下面我们直接用这上面的 ...

  8. 末学者笔记--openstack共享组件:rabbitmq(3)

    openstack共享组件:消息队列rabbitmq 一.MQ 全称为 Message Queue, 消息队列( MQ )                       是一种应用程序对应用程序的通信方 ...

  9. OpenStack如何实现高可用集群介绍

    OpenStack是目前基于开源的,一个非常流行的云管理平台项目.这个项目由几个主要的组件组合起来完成一些具体的工作.因此它的集群比较复杂,也有多种选择方式.OpenStack 作为一个类似于 Ama ...

最新文章

  1. readelf 读取动态链接表命令
  2. 一次业务网关用ASP.NET Core 2.1重构的小结
  3. php submit 不要刷新,php实现保存submit内容之后禁止刷新
  4. 本期最新 9 篇论文,每一篇都想推荐给你 | PaperDaily #14
  5. Java网络编程的简单应用 例程
  6. Maven报错找不到jre
  7. (转) vector的reserve和resize
  8. 解析弱电安防监控管理系统的安装技术重点
  9. 泰然的粒子编辑器~~拿过来玩玩啊
  10. 栅栏密码加密/解密【传统型】在线工具
  11. 项目管理中,如何有效地把控项目风险?
  12. HTML+CSS入门学习
  13. linux怎么定时备份文件,linux自动定时备份文件
  14. 10麦客和300挖藕人
  15. 苹果付费app共享公众号_【苹果iOS付费游戏应用帐号分享】新增一款25元iOS游戏应用共享帐号...
  16. 【codevs4355】王的对决(简单数论) 莫比乌斯反演
  17. 加入购物车里面的商品被商家调整价格以后如何处理金额问题
  18. CMake中file的使用
  19. vue项目引入阿里巴巴矢量图标库 ——字体图标
  20. 服务器启动项目抛错 没有到主机的路由

热门文章

  1. 在 Web 应用中增加用户跟踪功能
  2. python之强大的日志模块
  3. 《PHP开发入行真功夫》
  4. Redis介绍使用及进阶
  5. jquery gridly (拖拽插件)
  6. PowerCLI脚本,利用哈希表对参数进行转换
  7. Java自带的常用工具
  8. 大容量类 Redis 存储的场景补充-pika
  9. | ^ ~ 按位运算符
  10. CentOS7 扩容 / 目录