RabbitMQ学习笔记

创建用户和Virtual Hosts

  • 打开管理页面,使用guest/guest登录
  • 添加admin用户,tags:定义为administrator
    用户角色(tags)有以下5种类型:
  1. 超级管理员 :可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
  2. 监控者:可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
  3. 策略制定者 : 可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息。
  4. 普通管理者 : 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
  5. 其他 :无法登陆管理控制台,通常就是普通的生产者和消费者。
  • 创建Virtual Hosts
  • 设置权限
    将刚才创建的用户和Virtual Hosts关联起来

RabbitMQ的5种模式

分为:简单队列模式、Work模式、订阅模式(fanout广播)、路由模式(direct)、主题模式(通配符模式*、#)

  1. 简单队列
    在这里插入图片描述
    P:消息的生产者
    C:消息的消费者
    红色:队列

  2. Work模式
    在这里插入图片描述
    一个生产者、2个消费者。
    一个消息只能被一个消费者获取。

两个概念:
1、轮询分发 :在默认情况下,RabbitMQ将逐个发送消息到在序列中的下一个消费者(而不考虑每个任务的时长等等,且是提前一次性分配,并非一个一个分配)。平均每个消费者获得相同数量的消息。这种方式分发消息机制称为Round-Robin(轮询)。
2、公平分发 :当消息进入队列,RabbitMQ就会分派消息。它不看消费者为应答的数目,只是盲目的将消息发给轮询指定的消费者。

Work模式的“能者多劳” 根据消费者的能力分发消息
// 同一时刻服务器只会发一条消息给消费者
channel.basicQos(1);
// 同一时刻服务器只会发一条消息给消费者
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
// 监听队列,false表示手动返回完成状态,true表示自动确认
channel.basicConsume(QUEUE_NAME, false, consumer);

消息的确认模式
模式1:自动确认
只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。
模式2:手动确认
消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。

  1. 订阅模式
    在这里插入图片描述
    解读:
    1、1个生产者,多个消费者
    2、每一个消费者都有自己的一个队列
    3、生产者没有将消息直接发送到队列,而是发送到了交换机
    4、每个队列都要绑定到交换机
    5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的
    注意:一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费
    在这里插入图片描述
  2. 路由模式
    在这里插入图片描述
    在这里插入图片描述
  3. 主题模式(通配符模式)
    Topic Exchange :将路由键(routing key)和 某模式进行匹配。此时队列需要绑定到一个模式上。
    符号 # 匹配一个或多个词、符号 * 匹配不多不少一个词。
    例如:audit.# 能匹配到 audit.irs.corporate;audit.* 只会匹配到 audit.irs
    在这里插入图片描述
    在这里插入图片描述
    同一个消息被多个消费者获取。一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费到消息。

延迟消息队列

延迟消息的实现原理和知识点:
使用RabbitMQ来实现延迟任务必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求。

  1. 消息的TTL(Time To Live)
    消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。如果队列设置了,消息也设置了,那么会取时间设置短的那个。所以一个消息如果被路由到不同的队列中,这个消息死亡的时间有可能不一样(不同的队列设置)。这里单讲单个消息的TTL,因为它才是实现延迟任务的关键。
    可以通过设置消息的expiration字段或者x-message-ttl属性来设置时间,两者是一样的效果。只是expiration字段是字符串参数,所以要写个int类型的字符串:
    在这里插入图片描述
    当上面的消息扔到队列中后,过了3分钟,如果没有被消费,它就死了。不会被消费者消费到。这个消息后面的,没有“死掉”的消息对顶上来,被消费者消费。死信在队列中并不会被删除和释放,它会被统计到队列的消息数中去。单靠死信还不能实现延迟任务,还要靠Dead Letter Exchange。

  2. Dead Letter Exchanges
    Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有两样。只是在某一个设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。

  3. 实现延迟队列
    延迟任务通过消息的TTL和Dead Letter Exchange来实现。我们需要建立2个队列,一个用于发送消息,一个用于消息过期后的转发目标队列。
    在这里插入图片描述
    生产者输出消息到Queue1,并且这个消息是设置有有效时间的,比如3分钟。消息会在Queue1(死信队列)中等待3分钟,如果没有消费者收掉的话,它就会通过Dead Letter Exchange(死信交换器)转发到Queue2,Queue2有消费者,收到,处理延迟任务。完成延迟任务的实现。

  4. 总结

  • 延迟消息队列实现原理:
  • TTL(Time to live)消息通过交换器到达死信队列,当死信队列没有消费者消费该条消息,并且到达消息失效时间,会转发消息到死信路由, 死信路由再将消息发送到绑定的消息队列上去供消费者消费

参考资料

https://blog.csdn.net/hellozpc/article/details/81436980

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值