博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RabbitMQ(三) -- Publish/Subscribe
阅读量:6429 次
发布时间:2019-06-23

本文共 1877 字,大约阅读时间需要 6 分钟。

`rabbitmq`支持一对多的模式,一般称为发布/订阅。也就是说,生产者产生一条消息后,`rabbitmq`会把该消息分发给所有的消费者。

Exchanges

之前的教程中,仅仅使用了基本的消息模型:

  • 生产者产生消息
  • 把消息添加到消息队列
  • 消费者接收消息

而在`rabbitmq完整的消息模型`中,并不是这样的。事实上,生产者并不知道消息是否发送到队列,而是把消息直接发送给`Exchanges`。

`Exchanges`的功能理解起来非常简单,它只负责接收生产者发送的数据并把这些数据添加到消息队列。但是,在存在多个消息队列的情况下,`Exchanges`必须知道每条消息要添加到哪一个消息队列。

`rabbitmq`提供了几种`Exchanges`,包括:`direct`, `topic`, `headers` and `fanout`。

这里,仅仅介绍fanout的使用。

channel.exchange_declare(exchange='news', type='fanout')

那么,发布消息:

channel.basic_publish(exchange='news', routing_key='', body=message)

Temporary queues

由于在生产者和消费者中需要指定相同的消息队列才能实现消息通信,那么如果不特殊指定某个消息队列会如何呢?

那么需要使用默认参数让系统给生成一个特定的消息队列。

result = channel.queue_declare()

Bindings

为了发送指定发送的消息队列,必须创建exchange和消息队列之间的关系:

channel.queue_bind(exchange='news', queue=result.method.queue)

例子

作为生产者的publish:

#!/usr/bin/env python# coding=utf-8import pikaimport sysconnection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))channel = connection.channel()channel.exchange_declare(exchange='news',type='fanout')for i in range(100):    message = str(i) + 'Hello World!'    channel.basic_publish(exchange='news', routing_key='', body=message)    print " [x] Sent %r" % (message,)    import time    time.sleep(2)connection.close()

作为消费者的subscribe:

#!/usr/bin/env python# coding=utf-8import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))channel = connection.channel()channel.exchange_declare(exchange='news', type='fanout')result = channel.queue_declare(exclusive=True)queue_name = result.method.queuechannel.queue_bind(exchange='news',queue=queue_name)print ' [*] Waiting for news. To exit press CTRL+C'def callback(ch, method, properties, body):    print " [x] %r" % (body,)channel.basic_consume(callback, queue=queue_name, no_ack=True)channel.start_consuming()

 本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/4342927.html,如需转载请自行联系原作者

你可能感兴趣的文章
matlab画直线,指定斜率与x坐标范围
查看>>
介词表示时间
查看>>
makefile知识点归纳的
查看>>
GOF提出的23种设计模式是哪些 设计模式有创建形、行为形、结构形三种类别 常用的Javascript中常用设计模式的其中17种 详解设计模式六大原则...
查看>>
[Redux] Reducer Composition with combineReducers()
查看>>
Spring-IOC
查看>>
Python学习笔记6-异常捕获取
查看>>
设置Sql Agent运行Job时的执行账户
查看>>
Unity3D - 详解Quaternion类(一)
查看>>
lintcode :搜索旋转排序数组
查看>>
InnoDB Record, Gap, and Next-Key Locks
查看>>
云端中间层负载均衡工具 Eureka
查看>>
如何启动ResourceManager和NodeManager
查看>>
如何使用angularjs实现抓取页面内容
查看>>
玩转SSH(五):Struts + Spring + MyBatis(注解版)
查看>>
Android Studio系列-签名打包
查看>>
[MongoDB] Remove, update, create document
查看>>
iOS网络编程-ASIHTTPRequest框架同步请求-备用
查看>>
cobbler 修改 distro_signatures.json
查看>>
conv2、filter2、imfilter的区别
查看>>