RabbitMQ基础知识

RabbitMQ

关键在于消息的发布与消费、消息的路由。

在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key,可以视作Queue的name,
消费者将消息发送给Exchange时,一般会指定一个routing key
当binding key 与 routing key 相匹配时,消息就会被路由到对应的Queue中。

Exchange Types
fanout fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。
direct direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。
topic 与direct类似,但是是模糊匹配,*”用于匹配一个单词,“#”用于匹配多个单词
binding key 类似 *.*.rabbit,routing key 为quick.orange.rabbit的消息会被路由到该Queue
headers headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。

对于RabbitMQ来说,生产和消费不再针对内存里的一个Queue对象,而是某台服务器上的RabbitMQ Server实现的消息队列。

参考:http://www.diggerplus.org/archives/3110

开启RabbitMQ后台管理:
1.在rabbitMQ安装目录下的sbin目录,打开终端执行:rabbitmq-plugins.bat enable rabbitmq_management开启网页管理界面,然后重启rabbitMQ
2.浏览器中输入http://localhost:15672/
3.输入用户名和密码(默认为guest)

生产者

import pika

#########  生产者 #########
# 链接rabbit服务器(localhost是本机,如果是其他服务器请修改为ip地址)
connection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))
# 创建频道
channel = connection.channel()
# 创建一个队列名叫test
channel.queue_declare(queue=‘test‘)

# channel.basic_publish向队列中发送信息
# exchange -- 它使我们能够确切地指定消息应该到哪个队列去。
# routing_key 指定向哪个队列中发送消息
# body是要插入的内容, 字符串格式

while True:  # 循环向队列中发送信息,quit退出程序
    inp = input(">>>").strip()
    if inp == ‘quit‘:
        break
    channel.basic_publish(exchange=‘‘,
                          routing_key=‘test‘,
                          body=inp)
    print("生产者向队列发送信息%s" % inp)

# 缓冲区已经flush而且消息已经确认发送到了RabbitMQ中,关闭链接
connection.close()

# 输出结果
# >> > python
# 生产者向队列发送信息python
# >> > quit

消费者

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

######### 消费者 #########
# 链接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))
# 创建频道
channel = connection.channel()
# 如果生产者没有运行创建队列,那么消费者也许就找不到队列了。为了避免这个问题,所有消费者也创建这个队列,如果队列已经存在,则这条无效
channel.queue_declare(queue=‘test‘)

# 接收消息需要使用callback这个函数来接收,他会被pika库来调用,接受到的数据都是字节类型的
def callback(ch, method, properties, body):
    """
        ch : 代表 channel
        method :队列名
        properties : 连接rabbitmq时设置的属性
        body : 从队列中取到的内容,获取到的数据时字节类型
    """

    print(" [x] Received %r" % body)
# channel.basic_consume 表示从队列中取数据,如果拿到数据 那么将执行callback函数,callback是回调函数
# no_ack=True 表示消费完这个消息以后不主动把完成状态通知rabbitmq
channel.basic_consume(callback,
                      queue=‘test‘,
                      no_ack=True)
print(‘ [*] 等待信息. To exit press CTRL+C‘)
# 永远循环等待数据处理和callback处理的数据,start_consuming方法会阻塞循环执行
channel.start_consuming()

# 输出结果,一直等待处理队列中的消息,不知终止,除非人为ctrl+c
#  [*]等待消息,To exit press CTRL+C
#  [x] Received b‘python‘

消费者acknowledgement消息不丢失的方法

# no_ack = False , 如果消费者遇到情况(its channel is closed, connection is closed, or TCP connection is lost)挂掉了,那么,RabbitMQ会重新将该任务添加到队列中。在消费者端做设定条件。
# 生产者,代码同上,未改变
# 消费者代码

import pika
import time

# 链接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters(host=‘localhost‘))
# 创建频道
channel = connection.channel()
# 如果生产者没有运行创建队列,那么消费者创建队列,如果队列已存在,创建队列操作会被忽略
channel.queue_declare(queue=‘test‘)

# 回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    time.sleep(10)
    print(‘ok‘)
    ch.basic_ack(delivery_tag=method.delivery_tag)  # 当上面消息处理完成后,通知rabbitmq,消息处理完成,不要在发送了

channel.basic_consume(callback,
                      queue=‘test‘,
                      no_ack=False)  # 表示消费完这个消息后,主动通知rabbitmq完成状态,如果不通知,rabbitmq会把这条消息重新放回队列中,避免丢失

print(‘ [*] Waiting for messages. To exit press CTRL+C‘)
channel.start_consuming()

原文地址:https://www.cnblogs.com/jec1999/p/9410841.html

时间: 2024-11-09 00:29:17

RabbitMQ基础知识的相关文章

转:RabbitMQ基础知识

RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco .Redhat.iMatix 等联合制

RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候. 消息队列主要解决了应用耦合.异步处理.流量削锋等问题. 当前使用较多的消息队列有RabbitMQ.RocketMQ.ActiveMQ.Kafka.ZeroMQ.MetaMq等,而部分数据库如Re

RabbitMQ基础知识详解

RabbitMQ基础知识详解 2017年08月28日 20:42:57 dreamchasering 阅读数:41890 标签: RabbitMQ 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息. RabbitMQ是MQ的一种.下面详细介绍一下RabbitMQ的基本概念. 1.队列.生产者.消费者 队列是RabbitMQ的内部对象,用于存

RabbitMQ 基础知识

1. 背景 RabbitMQ 是一个由 erlang 开发的AMQP 开源实现,erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便. 基础概念 讲解基础概念的前面,我们先来整体构造一个结构图,这样会方便们更好地去理解RabbitMQ的基本原理. 通过上面这张应用相结合的结构图既能够清晰的看清楚整体的send Message到Receive Message的一个大致的流程.当然上面有很多名词都相比还没有介绍到,不要着急接下来我们就开始对其进行详细的讲解. 2. Queue Que

消息队列RabbitMQ基础知识详解

一: 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序或者模块对模块的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息. 常见的消息队列有RabbitMQ和kafka.下面详细介绍一下RabbitMQ的适用场景和基本概念. 二: 适用场景 2.1 并发处理 (1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端. 这有一个问题是,邮件,短

rabbitMQ基础知识--交换机

1.交换机类型:4种:Direct exchange.Fanout exchange.Topic exchange.Headers exchange Direct exchange:直连交换机(默认的交换机),转发消息到routigKey指定的队列,是一种完全匹配的关系.这种模式下,routingKey与队列之间可以是一对一,一对多,多对多,多对一等形式. 只要发送消息的routingKey与交换机的 一致,就会把消息放到对应的队列. rabbitTemplate.convertAndSend(

rabbitMQ基础知识--消息确认机制

一:确认种类 RabbitMQ的消息确认有两种. 一种是消息发送确认.这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是确认是否到达队列. 第二种是消费接收确认.这种是确认消费者是否成功消费了队列中的消息. 具体建议参考:https://www.cnblogs.com/nizuimeiabc1/p/9397326.html 这里我们重点研究下接收确认的情况. 为了保证消息从队列可靠的到达消费者,RabbitMQ提供了

rabbitMQ基础知识--消息确认机制之生产者端的确认机制

一:消息确认种类 RabbitMQ的消息确认有两种. 一种是消息发送确认.这种是用来确认生产者将消息发送给交换器,交换器传递给队列的过程中,消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是确认是否到达队列. 第二种是消费接收确认.这种是确认消费者是否成功消费了队列中的消息. 具体建议参考:https://www.cnblogs.com/nizuimeiabc1/p/9397326.html 这里我们重点研究下生产者确认的情况. 生产者确认模式实现原理: 生产者将信道设置成conf

rabbitmq 基础知识(面试题)

原文链接:https://blog.csdn.net/qq_42629110/article/details/84965084 1.什么是rabbitmq采用AMQP高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 2.为什么要使用rabbitmq1.在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;2.拥有持久化的机制,进程消息,队列中的信息也可以保存下来.3.实现消费者和生产者之间的解耦.4.对于高并发场景下,利用消息队列可以使得同