一篇内容带你了解Rabbitmq

1.引言

1.1什么是rabbitmq

RabbitMQ 是一个消息代理,它可以接受并转发消息。RabbitMQ集接受,存储转发为一体。TODO…

1.2消息队列的基本概念

可以把消息队列看为一个消息容器,我们可以按需生产消息向容器中发送或者从容器中消费消息,尽管这听起来想“一个人”完成的操作,但实际生产和消费的角色并不相同,而是两个程序,并且这两个程序往往不在同一机器上。

生产消息的一方我们通常称为“生产者”:
在这里插入图片描述

消费消息的一方通常称为“消费者”:
在这里插入图片描述

2.RabbitMQ 基础

2.1安装

我们将使用 Pika 1.0.0,它是 RabbitMQ 团队推荐的 Python 客户端。 要安装它,您可以使用 pip 软件包管理工具:

python -m pip install pika --upgrade

2.2"holle world"示例

我们将写两个简单的代码,一个作为生产者发送“holle world”字符串,一个作为消费者从队列接受字符串,并在屏幕上打印出来。

首先先来编写我们的生产者”sending.py

#!/usr/bin/env python
import pika

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

我们这里是连接的本地的服务,如果想连接其他机器上的服务只需要更改“localhost”即可。
有了生产者(后续统一用P表示)之后我们就需要有一个队列来作为和消费者(后续统一用C表示)之间通信的媒介。

channel.queue_declare(queue='hello')

如果P向一个不存在的队列发送消息,那么该消息就会被丢弃。

需要注意的是Rabbitmq不会直接向队列发送消息,而是将消息发送给exchange(交换机),由exchange来通过绑定的规则向一个或多个队列发送消息。这部分的内容在3.1会有更多介绍。
在这里插入图片描述

我们现在只需要知道我们需要向默认的exchange发送消息即可,默认的exchange用“”字符串来表示。

channel.basic_publish(exchange='',         #交换机类型,这里采用默认的使用空字符串表示
                      routing_key='hello', # 队列名
                      body='Hello World!') #消息内容
print(" [x] Sent 'Hello World!'")

connection.close()  #关闭连接

现在我们就可以向hello队列发送消息了,下面我们就来完成C的代码“receiving”。

同样的我们需要先和Rabbitmq取得连接

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

 channel.queue_declare(queue='hello')

这里我们再一次创建了hello队列,不用担心调用多次queue_declare函数只会创建一个同名的队列,这样的好处就是当我们无法确定是sending.py在receiving.py之前运行的时候代码也不会报错,这时重复的创建队列就是一个好的方法,也推荐在实际应用中这样做。

接下来就是为receiving写一个回调函数(callback),该函数的作用就是在C取得队列中的消息之后,用过callback处理,我们这里比较简单就是打印接收的消息。

def callback(ch, method, properties, body):
    print(f" [x] Received {
     
     body}")

接下来就需要告诉这个callback函数从那个队列去接收消息。

channel.basic_consume(queue='hello',
                      auto_ack=True,
                      on_message_callback=callback)

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

对于auto_ack=True参数,其实是Rabbitmq的确认应答机制,Rabbitmq需要知道C取得的消息是否被正确的处理了,就是通过该参数来控制,后序在3.2会有更多的介绍。

整合起来如下:
sending.py

#!/usr/bin/env python
import pika

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

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

receiving

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

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

    channel.queue_declare(queue='hello')

    def callback(ch, method, properties, body):
        print
<think>好的,我现在需要帮助用户找到关于RabbitMQ高级用法的学习笔记或教程,特别是来自黑马程序员的资料。首先,我要查看用户提供的引用内容,看看是否有相关的资料。 用户提供了四个引用,其中引用[1]、[2]、[3]、[4]都提到了RabbitMQ内容。引用[1]详细列出了RabbitMQ的高级特性,如消息可靠性投递、Consumer ACK、消费端限流、TTL、死信队列、延迟队列等,这应该是用户需要的高级用法内容。引用[2]和引用[4]提到了安装和配置RabbitMQ的步骤,包括配置MQ地址、端口、虚拟主机等,这可能属于基础配置,但也是高级用法的基础。引用[3]和引用[4]都有关于Spring配置RabbitMQ的信息,这对于整合到应用中很重要。 用户的问题明确提到“高级用法”,所以需要重点突出引用[1]中的内容,比如消息可靠投递、死信队列、延迟队列等。同时,用户可能也需要了解如何配置环境,所以引用中的配置信息也需要提及。另外,用户提到了黑马程序员的笔记,所以需要确认引用中的资料是否来自黑马。引用[1]、[2]、[4]都明确提到了黑马,因此这些内容符合用户需求。 接下来,需要组织回答结构,先介绍找到的相关资料,然后分点详细说明高级特性,每个特性简要解释,并引用对应的引用来源。此外,用户可能需要知道如何获取这些资料,引用[2]提到了安装教程的网盘链接,但用户可能无法直接访问,所以需要提示用户可能需要自行查找或联系分享者。 最后,按照用户的要求生成相关问题,这些问题应围绕高级特性的应用、配置、区别等方面展开,帮助用户深入理解。 需要确保回答符合系统级指令,使用正确的中文和LaTeX格式,但根据用户的问题,可能数学公式较少,但如果有涉及性能分析的部分,可能需要用LaTeX表达,例如消息投递成功率公式:$P = 1 - p^n$。不过当前引用内容中没有涉及数学公式,所以可能不需要使用。但根据系统指令,所有行内数学表达式必须使用$...$,需要检查是否有必要添加,但用户的问题主要关于RabbitMQ,可能不涉及数学,因此可能不需要。 总结回答结构: 1. 确认找到黑马程序员的RabbitMQ高级学习笔记。 2. 分点介绍高级特性,每个特性后添加引用标记。 3. 提到相关配置和安装教程,引用对应的来源。 4. 提供相关问题供用户进一步学习。</think>根据您提供的信息,我为您整理了黑马程序员RabbitMQ高级学习笔记的核心内容: ### 一、RabbitMQ高级特性 1. **消息可靠性投递** - 通过生产者确认机制实现,包含事务模式和Confirm模式(异步回调),确保消息成功到达Broker[^1] - 消息补偿机制公式:$消息成功率 = 1 - 失败概率^n$(n为最大重试次数) 2. **Consumer ACK机制** ```java // 消费者手动确认示例 channel.basicAck(deliveryTag, false); // 成功确认 channel.basicNack(deliveryTag, false, true); // 失败重入队列 ``` 3. **消费端限流** ```yaml # 配置预取数量(QoS) spring: rabbitmq: listener: simple: prefetch: 5 # 每次最多处理5条[^1] ``` 4. **TTL与死信队列** ```properties # 队列设置消息过期时间 x-message-ttl=60000 # 单位毫秒[^1] ``` 5. **延迟队列实现** - 通过死信队列+TTL组合实现延时效果 - 应用场景:订单超时关闭、定时任务调度等[^1] ### 二、环境配置要点 1. **基础连接配置** ```yaml spring: rabbitmq: host: 192.168.150.101 port: 5672 virtual-host: /hmall username: hmall password: 123[^3] ``` 2. **集群配置** ```yaml addresses: 192.168.1.101:5672,192.168.1.102:5672 # 多节点配置[^4] ``` ### 三、配套学习资源 1. 安装教程(含虚拟机镜像)[^2] 2. 消息追踪工具使用:Firehose跟踪消息流向 3. 管理控制台监控:消息积压监控、通道状态查看等
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南山忆874

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值