RabbitMQ(五) -- topics

RabbitMQ(五) -- topics

`rabbitmq`中的`topic exchange`将路由键和某模式进行匹配,从而类似于正则匹配的方式去接收喜欢的信息。

topic exchange

如果想使用`topic`模式,那么可以随意设置`routing_key`。相反,需要按照一定的要求设定该值。
`routing_key`在topic模式中应该选择一组拥有特定属性的单词作为该值。

  • \* (star) can substitute for exactly one word.
  • # (hash) can substitute for zero or more words.

例如,如果生产者的`routing_key`设置为`test1.test2.test3`,那么消费着中绑定消息队列的`routing_key`必须可以匹配生产者的`routing_key`。

#生产者
routing_key = ‘test1.test2.test3‘
channel.basic_publish(exchange=‘topic_test‘, routing_key=routing_key, body=message)

#消费者
routing_key = ‘test1.*‘ #可以
routing_key = ‘*.test2.*‘ #可以
routing_key = ‘test3‘ #不可以
channel.queue_bind(exchange=‘topic_logs‘, queue=queue_name, routing_key=binding_key)

例子

生产者如下,会依次设置`routing_key`为A和B,那么需要设置两个消费者的`routing_key`来分别读取消息。

#!/usr/bin/env python
# coding=utf-8
import pika
import sys
import time

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

channel.exchange_declare(exchange=‘topic_test‘,
type=‘topic‘)

message = "test "
for i in range(20):
    for item in [‘A‘, ‘B‘]:
        routing_key = item
        channel.basic_publish(exchange=‘topic_test‘,routing_key=routing_key, body=message+item)
        print " [x] Sent %r:%r" % (routing_key, message)
        time.sleep(2)
connection.close()    

消费者如下,启动命令分别为:

python receive.py A
python receive.py B

消费者如下:

#!/usr/bin/env python
# coding=utf-8

import pika
import sys

def callback(ch, method, properties, body):
print " [x] %r:%r" % (method.routing_key, body,)

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

channel.exchange_declare(exchange=‘topic_test‘,
type=‘topic‘)

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

binding_key = sys.argv[1]
print "Usage: %s [binding_key]..." % (sys.argv[1])

channel.queue_bind(exchange=‘topic_test‘, queue=queue_name, routing_key=binding_key)
print ‘ [*] Waiting for logs. To exit press CTRL+C‘
channel.basic_consume(callback, queue=queue_name, no_ack=True)

channel.start_consuming()
时间: 2024-08-07 12:31:21

RabbitMQ(五) -- topics的相关文章

RabbitMQ之Topics(多规则路由)

Exchange中基于direct类型无法基于多种规则进行路由. 例如分析syslog日志,不仅需要基于severity(info/warning/critical/error)进行路由,还需要基于auth.cron或者kernal模式进行路由. Topic exchange可以满足这种需求. Topic exchange 基于topic类型交换器的routing key不是唯一的,而是一系列词,基于点区分. 例如:"stock.usd.nyse", "nyse.vmw&qu

3.6.6 RabbitMQ教程五 – Topics

What This Tutorial Focuses On In the previous tutorial we improved our logging system. Instead of using a fanout exchange only capable of dummy broadcasting, we used a direct one, and gained a possibility of selectively receiving the logs. 在之前的教程中我们改

RabbitMQ五种工作模式学习总结

一.简介最近,在看一些消息中间件的内容,之前都没有好好学习一下消息中间件.本文将对RabbitMQ中五种常用的工作模式做一个简单的介绍和总结.RabbitMQ常用的工作模式有:简单队列模式.工作队列模式.发布订阅模式.路由模式.主题模式.本文参照RabbitMQ官网示例总结,详细可以到官网查看:https://www.rabbitmq.com/getstarted.html. 二.简单队列模式(Simple Queue) [a]模型图:只包含一个生产者以及一个消费者,生产者Producer将消息

【译】RabbitMQ:Topics

在前面的教程中,我们对日志系统进行了功能强化.我们使用direct类型的交换器并且为之提供了可以选择接收日志的能力,替换了只能傻乎乎的广播消息的fanout类型的交换器.尽管使用direct类型的交换器强化了系统,但是它依然有一些限制,不能基于条件的进行路由. 在日志系统中,我们或许希望不仅能根据严重等级,还能基于日志的发送源来订阅日志日志.你可能已经从Unix的syslog工具中知道了这个概念,该工具路由日志的时候既基于严重等级(info/warn/crit...)又基于设备(auth/cro

RabbitMQ erlang "topics"

原文链接:http://www.rabbitmq.com/tutorials/tutorial-five-python.html 在前面的例子中我们改进了我们的日志系统.使用 fanout 类型的exchage 只能广播消息.我们使用 direct 来代替,获得了选择性接收消息的可能. 虽然使用direct类型的exchange改善了我们的系统,但它仍然有缺陷,它不能基于多种条件 进行routing. 在我们的日志系统中,我们可能想要订阅日志不仅基于严重性程度,而且基于发布日志的源码.你可能知道

RabbitMQ五:生产者--队列--多消费者

一.生成者-队列-多消费者(前言) 上篇文章,我们做了一个简单的Demo,一个生产者对应一个消费者,本篇文章就介绍 生产者-队列-多个消费者,下面简单示意图 P 生产者    C 消费者  中间队列 需求背景:工厂某部门需要生产n个零件,部门下面有2个小组,每个小组需要生产n/2个 公平派遣 每个小组的情况下,当所有奇怪的信息都很重,甚至信息很轻的时候,一个工作人员将不断忙碌,另一个工作人员几乎不会做任何工作.那么,RabbitMQ不知道什么,还会平均分配消息. 这是因为当消息进入队列时,Rab

RabbitMQ (五) : 订阅者模式之分发模式 ( fanout )

前面讲到了简单队列和工作队列. 这两种队列有个非常明显的缺点 : 生产者发送的消息,只能进入到一个队列. 消息只能进入到一个队列就意味着消息只能被一个消费者消费. 尽管工作队列模式中,一个队列中的消息可以被多个消费者消费,但是,具体到每一条消息,却只能被一个消费者消费. 如果想要一个消息被多个消费者消费,那么生产者就必须把这条消息发送到多个队列中去. RabbitMQ 在这个点的设计是 : 在生产者和队列两者之间加入了一个叫做"交换机"的东西. 生产者发送消息时,不直接发送到队列,而是

rabbitmq五种消息模型整理

目录 0. 配置项目 1. 基本消息模型 1.1 生产者发送消息 1.2 消费者获取消息(自动ACK) 1.3 消息确认机制(ACK) 1.4 消费者获取消息(手动ACK) 1.5 自动ACK存在的问题 1.6 演示手动ACK 2. work消息模型 2.1 生产者 2.2 消费者1 2.3 消费者2 2.4 能者多劳 3. 订阅模型分类 4. 订阅模型-Fanout 4.1 生产者 4.2 消费者1 4.3 消费者2 4.4 测试 5. 订阅模型-Direct 5.1 生产者 5.2 消费者1

go操作RabbitMQ

RabbitMQ服务器安装1.安装erlang wget https://www.rabbitmq.com/releases/erlang/erlang-18.2-1.el6.x86_64.rpm 2.安装RabbitMQ wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el6.noarch.rpm 3. 常用命令 systemctl start rabbitmq-se