RabbitMQ入门知识总结

MQ:消息队列,消息队列是应用程序和应用程序之间的通信方法
(1)MQ的使用意义
<1>应用解耦:加入中间组件后,在对服务的修改时,不会去对调用服务的模块也进行修改。
<2>异步提速:实质业务的处理时间增长,但对于不需要返回的内容,则仅需在完成需要返回的内容且验证了业务处理正常时,就可对前台做出响应,在视觉效果上实现提速。
<3>削峰填谷:当瞬时访问亮过大时,MQ将大量消息存储,后台根据实际能处理的最大数据量拉去处理,实现将大量数据分时处理的能力。
(2)MQ的应用场景
<1>生产者不需要从消费者那获取反馈(实现异步的基础)。
<2>容许短暂的不一致性。
<3>解耦、提速、削峰有应用收益且收益大于加入管理MQ的成本。

RabbitMQ基础架构图:
在这里插入图片描述
Connection:生产者/消费者与Broker之间的TCP连接。
Channel:Connection中的连接单元,关系等同于线程池与线程。
Broker:接受与分发消息的应用。
Virtual Host:虚拟机,等同于数据库,实现逻辑分区功能。
Exchange:信息处理的特殊定制规则。
Queue:消息队列,用于消息的存储。
Message:生产者的一次发送数据。

五种常见的工作模式:
(1)简单模式
在这里插入图片描述
使用默认的交换机,实现消息的顺序获取。

(2)工作队列模式
在这里插入图片描述
使用默认的交换机,C1与C2依次获取队列中信息,当消息总量不大于消息队列最大存储量时,C1与C2获取信息组合可为一个完整消息队列中的所有信息。

(3)发布订阅者模式,交换机类型为fount
在这里插入图片描述
C1与C2都拥有完成的消息。

(4)路由模式,交换机类型为direct
在这里插入图片描述
根据Routing限定队列可获取的消息权限。

(5)通配模式,交换机类型为topic
在这里插入图片描述
相较于4增加了通配符功能。

消息可靠性投递:
(1)Producer Ack(生产端到Broker):
<1>confirm确认模式
设置ConnectionFactory的publisher-confirms=“true” 开启 确认模式。
使用rabbitTemplate.setConfirmCallback设置回调函数。当消息发送到exchange后回
调confirm方法。在方法中判断ack,如果为true,则发送成功,如果为false,则发
送失败,需要处理。
<2>return退回模式
设置ConnectionFactory的publisher-returns=“true” 开启 退回模式。
使用rabbitTemplate.setReturnCallback设置退回函数,当消息从exchange路由到
queue失败后,如果设置了rabbitTemplate.setMandatory(true)参数,则会将消息退
回给producer。并执行回调函数returnedMessage。
<3>事务处理
在RabbitMQ中也提供了事务机制,但是性能较差。
使用channel下列方法,完成事务控制:
txSelect(), 用于将当前channel设置成transaction模式
txCommit(),用于提交事务
txRollback(),用于回滚事务

(2)Consumer Ack(消费者到Broker):
有三种确认方式:
<1>自动确认:acknowledge=“none”(默认)
其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的
消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。如
果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck(),手动签收,如果出现异常,则
调用channel.basicNack()方法,让其自动重新发送消息。
<2>手动确认:acknowledge=“manual”
在rabbit:listener-container标签中设置acknowledge属性,设置ack方式 none:自动确认,manual:手动确认,让监听器类实现ChannelAwareMessageListenner接口,如果在消费端没有出现异常,则调用channel.basicAck(deliveryTag,false);方法确认签收消息, 如果出现异常,则在catch中调用 basicNack或 basicReject,拒绝消息,让MQ重新发送消息。
<3>根据异常情况确认:acknowledge=“auto”

(3)消息可靠性总结:
(1)持久化
<1>exchange要持久化
<2>queue要持久化
<3>message要持久化
(2)生产方确认Confirm
(3)消费方确认Ack
(4)Broker高可用

消费端限流(消费端每秒拉取的消息量):
在rabbit:listener-container中配置 prefetch属性设置消费端一次拉取多少消息
消费端的确认模式一定为手动确认。acknowledge=“manual”

TTL (存活/过期时间):
设置队列过期时间使用参数:x-message-ttl,单位:ms(毫秒),会对整个队列消息统一过期。
设置消息过期时间使用参数:expiration。单位:ms(毫秒),当该消息在队列头部时(消费时),会单独判断这一消息是否过期。如果两者都进行了设置,以时间短的为准。

死信队列:
(1)Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。

(2)队列绑定死信交换机:
给正常队列key属性设置参数: x-dead-letter-exchange 和 x-dead-letter-routing-key。
在这里插入图片描述

(3)消息成为死信的三种情况:
<1>队列消息长度到达限制。
<2>消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false。
<3>原队列存在消息过期设置,消息到达超时时间未被消费。

延迟队列:
(1)实现方式:
<1>定时器
可以在数据存储数据库时,添加一个时间数据,定时将数据取出对比时间,满足条件进行操作。
<2>TTL+DLX
由TTL设置过期时间,当时间达到要求,DLX可以获取消息输出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值