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表示同一条消息会被分配给与之前相同的消费者
相关推荐
西***634732 分钟前
从信号处理到智能协同:高清混合矩阵全链路技术拆解,分布式系统十大趋势抢先看
网络·分布式·矩阵
阿维的博客日记1 小时前
从夯到拉的Redis和MySQL双写一致性解决方案排名
redis·分布式·mysql
好玩的Matlab(NCEPU)1 小时前
Redis vs RabbitMQ 对比总结
数据库·redis·rabbitmq
好玩的Matlab(NCEPU)2 小时前
消息队列RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何使用
kafka·rabbitmq·activemq
笨蛋少年派5 小时前
zookeeper简介
分布式·zookeeper·云原生
鸽鸽程序猿5 小时前
【RabbitMQ】简介
分布式·rabbitmq
在未来等你5 小时前
Kafka面试精讲 Day 29:版本升级与平滑迁移
大数据·分布式·面试·kafka·消息队列
在未来等你6 小时前
Kafka面试精讲 Day 30:Kafka面试真题解析与答题技巧
大数据·分布式·面试·kafka·消息队列
在未来等你8 小时前
Elasticsearch面试精讲 Day 30:Elasticsearch面试真题解析与答题技巧
大数据·分布式·elasticsearch·搜索引擎·面试