rabbitmq的使用记录-架构图、生产端、消费端、rabbitmqctl命令、重启MQ服务

生产+消费结构

  1. 生产者连上Broker,开Channel。
  2. 生产者发消息(带Routing Key)给Exchange。
  3. Exchange按规则把消息路由到Queue。
  4. Queue把消息推给订阅的Consumer(前提是Consumer有处理能力,未达prefetch上限)。
  5. Consumer拿到消息,开始处理(比如解析JSON、写数据库、调用其他服务)。
  6. 处理成功后,Consumer发送ACK。
  7. Broker收到ACK,从队列中删除该消息。
  8. 如果处理失败:Consumer可以发送NACK(否定确认)或让消息超时,消息会重新入队或进入死信队列。

生产端

  1. 生产端代码:
python 复制代码
#生产者MQ端,
#第一步:导包
import pika
#第二步:连接和声明管道
connection=pika.BlockingConnection(
    pika.ConnectionParameters('localhost')
    )
channel=connection.channel() #声明管道,在管道中发送消息
#第三步:声明queue队列
channel.queue_declare(queue='hello', durable=True)
#第四步:通过管道发布消息,routing_key队列名称
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='hello world中国'
                      # properties=pika.BasicProperties(delivery_mode=2)  # 可选:让消息也持久化)
                      )
print("[x] sent 'hello world")
#第六步:连接关闭
connection.close()

测试结果:

消费端

  1. 消费端代码:
python 复制代码
#消费者端MQ
#第一步:导包
import time
import pika

#定义回调函数处理消息
def callback(ch,method,properties,body):
    # print("->",ch,method,properties)
    # print(" [x] received %r "%body)
    time.sleep(3)
    print("[x] Received {}".format(body.decode()))

#第二步:连接,声明管道,需要在管道中发送消息
connection=pika.BlockingConnection(
    pika.ConnectionParameters('localhost')
    )
channel=connection.channel()

#第三步: 声明队列(必须与生产者一致,例如 durable=True) durable 参数默认是 False(非持久化)
channel.queue_declare(queue='hello', durable=True)

#第四步:核心步骤订阅队列,注册回调函数
#这个方法是RabbitMQ 消费者端的核心,用于告诉 RabbitMQ:"我要开始从这个队列接收消息了,每收到一条,就调用我指定的函数来处理"
channel.basic_consume(
    on_message_callback=callback,  #如果收到消息就调用callback函数处理消息
    queue='hello', ## 要消费的队列名
    # True自动确认(消息一旦被发送给消费者,RabbitMQ 就立即将其标记为"已删除"),如果消费者处理过程中崩溃,这条消息就永久丢失了,不安全
    # False手动确认(消费者收到消息后,需要在自己的回调函数里,显式地调用 channel.basic_ack() 来告诉 RabbitMQ 这条消息已经处理完毕),安全保证消息不丢失
    auto_ack=False,
    exclusive=False,
    consumer_tag=None,
    arguments=None
    )
print("[*] waiting for message. exit press CTRL+C")

#第五步:启动消费循环,开始监听
channel.start_consuming()

#第六步:连接关闭
connection.close()

测试结果:

执行命令rabbitmqctl.bat list_queues--查看队列及其消息数量

  1. sbin目录下输入cmd,进入命令行窗口,输入rabbitmqctl.bat list_queues结果报错;
  2. 原因:rabbitmqctl 命令与 RabbitMQ 服务节点之间的通信出了状况,导致命令无法执行;
  3. Windows 系统中服务端和用户端的cookies不一致导致;
    • 服务端 Cookie(RabbitMQ 服务以 Local System 账户运行时使用):
      • C:\Windows\System32\config\systemprofile.erlang.cookie
    • 用户端 Cookie(你当前命令行用户使用):
      • C:\Users<你的用户名>.erlang.cookie
  4. 修改客户端的cookies,改为和服务端一样
  5. 重启rabbit服务:net stop RabbitMQ && net start RabbitMQ
  6. 再次在sbin目录输入》》 rabbitctl.bat list_queues
相关推荐
j7~2 天前
【C++标准项目】C++基于protobuf的发布订阅式消息队列(篇一):项目概述+环境搭建
分布式·消息队列·rabbitmq·gtest·protobuf·muduo·sqlites
仍然.3 天前
RabbitMQ---可靠性传输
网络·分布式·rabbitmq
灯澜忆梦3 天前
【RabbitMQ #13】 | 延迟消息
分布式·rabbitmq·ruby
灯澜忆梦4 天前
【RabbitMQ #11】 | 消费者可靠性
分布式·rabbitmq·ruby
仍然.4 天前
RabbitMQ---事务和消息分发
分布式·rabbitmq
灯澜忆梦4 天前
【RabbitMQ #9】 | 生产者可靠性
分布式·rabbitmq
灯澜忆梦5 天前
【RabbitMQ #10】 | MQ可靠性
分布式·rabbitmq
醉颜凉5 天前
Kafka 与 RabbitMQ/RocketMQ 选型对比:场景匹配、性能基准与迁移成本
kafka·消息队列·rabbitmq·rocketmq·中间件选型
灯澜忆梦5 天前
【RabbitMQ #5】 | 三大交换机 Fanout ,Direct ,Topic
分布式·rabbitmq·ruby
灯澜忆梦6 天前
【RabbitMQ #3】 | Go 客户端 + SpringAMQP
分布式·golang·rabbitmq