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
相关推荐
xbgRS1 小时前
RabbitMQ使用
rabbitmq
橙子圆1232 天前
RabbitMQ知识1
分布式·rabbitmq
無a伟4 天前
RabbitMq高级特性:TTL,死信队列,延迟队列
java·分布式·rabbitmq
小楼昨夜又东风1264 天前
kafka、rocketmq、rabbitmq,有什么区别
kafka·rabbitmq·rocketmq
無a伟4 天前
RabbitMq高级特性:消息确认,持久化,重试机制
java·分布式·rabbitmq
Dreams_l7 天前
如何保证RabbitMQ消息可靠传输
java·rabbitmq·java-rabbitmq
专注仿真9 天前
RabbitMQ消息队列实战项目
数据结构·rabbitmq
Dreams_l9 天前
RabbitMQ在SpringBoot中的应用
spring boot·rabbitmq·java-rabbitmq
無a伟10 天前
RabbitMQ :与AMQP的关系、核心组件、交换机类型
分布式·rabbitmq