rabbitmq消息转发模式1

翻译:吕嘉伟

生产者(producer):发送消息的应用;

消息队列(queue):保存队列的缓冲区;

消费者(consumer):接收消息的应用。

广播模式(fanout)

Rabbitmq的核心思想是生产者不会直接向队列发送消息,事实上,生产者不需要关心消息最终发送到了哪个队列中。

相反地,生产者只会将消息发送给exchange,exchange从生产者接受消息,然后转发给队列。Exchange知道如何处理收到的消息,要么将它插入到某个特殊的队列中,或是添加到多个队列中,或是丢弃。这一切取决于的exchange的类型。

Exchange的类型主要有direct、topic、headers和fanout。可通过如下方式构造一个广播的exchange:

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

无名的exchange

在上面的代码中我们声明了一个“log”exchange,在应用中还存在默认的exchange,示例如下:

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

该exchange为一个空字符,这表明消息会发往hello队列。

现在将生产者发送的消息传递给logexchange:

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

对于广播类型的消息,可能只会关心当前的消息,而不关心历史消息。因此可以创建一个临时的队列,并且在消费者与队列断连时将队列清除,示例如下:

# 声明一个任意名称的临时队列
result = channel.queue_declare(exclusive=True)

现在已经创建一个广播类型exchange及一个临时的队列,此时由消费者将监听的队列与exchange进行绑定,示例如下:

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

生产者  emit_log.py

#!/usr/bin/env python
import pika
import sys

connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='localhost'))
channel = connection.channel()

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

message = ' '.join(sys.argv[1:]) or "info: Hello World!"
channel.basic_publish(exchange='logs',
                      routing_key='',
                      body=message)
print(" [x] Sent %r" % message)
connection.close()

如代码中所示,在建立连接之后,我们声明了exchange。这一步是必要的,因为禁止将消息发给一个不存在的exchange。如果没有队列绑定到exchange上,消息会被丢弃。

消费者    receive_logs.py

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='localhost'))
channel = connection.channel()

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

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

channel.queue_bind(exchange='logs',
                   queue=queue_name)

print(' [*] Waiting for logs. 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()





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值