RabbitMQ小记

一、基础概念

1.Exchange

1.1 创建方法的参数,exchangeDeclare()

  • exchange:交换器的名称
  • type:交换器的类型
  • durable:是否持久化,true代表持久化。(持久化会将交换器存入磁盘)
  • autoDelete:是否自动删除,true表示自动删除。(当该交换器上绑定的最后一个队列/交换器解除绑定后,该交换器自动删除)
  • internal:是否是内置的,true表示内置交换器。(生产者无法直接发消息给内置交换器,只能通过其他交换器路由到该交换器)
  • argument:其他一些结构化的参数

1.2 交换器类型

1.2.1 fanout
  • 把所有消息路由到与该交换器绑定的队列
1.2.2 direct
  • 路由时需要BindingKey和RoutingKey完全匹配
1.2.3 topic
  • 路由到BindingKey和RoutingKey相匹配的队列
    • RoutingKey和BindingKey为以"."分隔的字符串
    • BindingKey中可以存在"*"(匹配一个单词),"#"(匹配多个单词,也可以是0个)
1.2.4 header
  • 不依赖路由键的匹配规则来路由消息,而是根据发送的消息内容中的header属性进行匹配

2.Queue

2.1 创建方法的参数,queueDeclare()

  • queue:队列的名称
  • durable:是否持久化
  • exclusive:是否排他,true表示排他。(队列仅对首次声明他的连接可见,并在该连接断开后自动删除)
    • 排他队列是基于连接(Connection)可见的,同一个连接的不同信道(Channel)可以同时访问该队列
  • autoDelete:是否自动删除,true表示自动删除。(至少有一个消费者连接到这个队列,之后所有与这个连接的消费者都断开时,才会自动删除)
  • arguments:其他一些参数

二、消息

1.生产消息

1.1 basicPublish()
  • exchange:交换器名称
  • routingKey:路由键
  • props:消息的基本属性集
    • contentType:设置消息的内容类型
      • application/json --> json格式的数据
      • application/xml --> XML格式
      • text/plain --> 纯文本格式
      • ...
    • contentEncoding:设置消息的内容编码
    • header:对应交换器为header类型时使用
    • deliveryMode:设置消息的投递模式,可选值为 1(非持久化)或 2(持久化)
    • priority:设置消息的优先级,优先级由低到高为0 到 9
    • replyTo:设置消息的回复队列。指定一个队列,用于接收消息的回复或响应,消费者可以将回复发送到指定的队列中,使生产者能够获取到回复消息。
    • expiration:设置消息的过期时间
    • messageId:设置消息的唯一标识符
    • timestamp:设置消息的时间戳
    • type:描述消息的类型。消费者可以根据type属性的不同,分类处理不同type的消息
  • byte\[\] body:消息体
  • mandatory
  • immediate

2.消费消息

2.1 消费模式
2.1.1 推模式:basicConsumer()
  • queue:队列的名称
  • autoAck:设置是否自动确认
  • consumerTag:消费者标签。用来区分多个消费者
  • noLocal:为true表示不能将同一个Connection中生产者发送的消息传送给这个Connection中的消费者
  • exclusive:是否排他,消费者独占该队列,其他消费者无法同时访问该队列
  • arguments:其他参数
  • callback:设置回调函数
2.1.2 拉模式:basicGet()
2.2 消费端的确认与拒绝
2.2.1 确认
  • 若消费者在订阅时设置autoAck为true,则发送出去的消息会自动被置为确认,然后删除该消息。
  • 若消费者在订阅时设置autoAck为false,则发出的消息后,会等待消费者显式的回复确认信号后再删除该消息。
  • 若在显式的回复确认信号前进程挂掉或者其他原因一直未发出,RabbitMQ会一直等待持有消息,等待消费者显式调用Basic.Ack为止
  • 若autoAck为false,一直没收到确认信号,并且消费者已经断开连接,则会安排该消息重新进入队列,等待投递给下一个消费者,当然也有可能还是原来的那个消费者
2.2.2 拒绝
  • 拒绝单条消息:basicReject()
    • deliveryTag:消息的编号
    • requeue:为true表示将该消息重新存入队列,以便发送给下一个消费者。为false表示把消息从队列中移除
  • 批量拒绝消息:basicNack()
    • deliveryTag
    • multiple:false表示拒绝编号为delivery的这一条消息,为true表示拒绝deliveryTag编号之前所有未被当前消费者确认的消息
    • requeue
  • 重新请求未确认的消息:basicRecover()
    • requeue:消息未被确认的消息重新加入到队列后,为true表示同一条消息会被分配给与之前不同的消费者,为false表示同一条消息会被分配给与之前相同的消费者
相关推荐
爱浦路 IPLOOK3 小时前
矿山无人化作业5G专网方案:企业专网核心网络选型分析
网络·分布式·科技·5g·信息与通信
实战派K8S&DB4 小时前
如何在内网配置 TiDB 数据库 Agent
数据库·人工智能·分布式·tidb
实战派K8S&DB4 小时前
《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》
运维·数据库·分布式·云原生·tidb·fastapi
小白羊丨5 小时前
Kafka任务重试、退避与失败恢复怎么做?
分布式·kafka
jyOverQ11 小时前
RabbitMQ 延迟消息怎么实现?TTL 与死信队列
分布式·后端·rabbitmq·ruby
zcmodeltech12 小时前
工程车模型多车型动作控制系统设计与实现方案——基于STM32与Modbus RTU的挖掘机、装载机、自卸车、起重机、电力工程车全场景控制方案,服务范围覆盖全国
分布式·stm32·单片机·嵌入式硬件·交互
StevenSurpass15 小时前
智能工厂场景:FastPrintAgent 分布式打印中间件落地应用方案
分布式·mqtt·http·中间件·打印·fastreport
江畔柳前堤1 天前
具身智能全景深度指南(2026年9月版):从“会聊天的AI“到“能干活的机器“
大数据·javascript·图像处理·人工智能·分布式·智慧城市·原型模式
夕除1 天前
redis--010
笔记·分布式·学习
寻求出路的程序媛1 天前
分布式 & 高性能 & 高可用 体系、学习重点、面试点
分布式·后端·面试·性能优化