RabbitMq

一、简述RabbitMq

1. rabbitmq是实现了高级消息队列amqp的消息中间件,他就相当于中介一样,用来存储生产者发送的消息,并将这些消息转发给合适的消费者
2. rabbitmq的作用
1、实现业务的异步处理:将不需要同步处理,业务处理等待时间较长的业务交由rabbitmq管理,提高程序的响应速度
2、实现程序解耦合:生产者通过mq和消费者交互,实现程序解耦
**3. rabbitmq的架构:**由生产者生产消息,发送给交换机,交换机将消息路由给合适的队列,然后队列将消息转发给监听了该队列的消费者,完成消息的传输
4. 三种交换机:direct路由 fanout发布订阅 topic通配符
**5. 五种工作模式:**简单工作模式、工作队列模式、发布订阅模式、路由模式、通配符模式
6. rabbitmq如何确保消息的发送、消息的接收?
- 1、生产者发送消息:有三种情况可能会造成消息的丢失:生产者到交换机、交换机到队列、mq的宕机
- 生产者到交换机:可以在配置文件中开启publisher-confim-type为correlated,表示接收mq返回消息发送结果的类型为异步回调,当生产者发送消息到交换机,如果返回的回执是ack,则表示消息发送成功,如果返回的回执是nack,则表示消息没有发送成功,此时需要我们写代码,使生产者重新发送消息。代码可以调用RabbitTemplate的setConfimCallback方法,构建ConfirmCallback匿名对象,实现confirm方法,在该方法中重新发送消息,框架的底层会在消息未发送到交换机时自动调用该方法,直到消息发送到交换机
- 交换机到队列:可以在配置文件中开启publisher-return为true,表示接收交换机路由信息到队列的回执信息,当交换机未成功路由信息到队列,就会返回nack的回执信息,此时就需要我们写代码,使生产者重新发送信息。代码可以调用RabbitTemplate的setReturnCallback方法,构建ReturnCallBack匿名对象,重写retuenedMessage方法,在方法中重新发送消息,该方法也是在消息未成功路由到队列时由框架自动调用,直到消息路由到队列
- mq宕机:为了防止mq宕机造成消息的丢失,就要设置mq的持久化机制。交换机的持久化、队列的持久化、消息的持久化。交换机的持久化和队列的持久化需要我们在创建他们的时候设置对应的durable属性为true;消息的持久化一般我们不需用设置,因为框架的底层会将发送的信息自动封装成Message对象,且框架已对该对象进行了消息的持久化。消息的持久化就是将消息存到磁盘中。这样,即使mq宕机,也不会造成消息的丢失。
- 2、消费者消费消息:有两种情况可能会造成消息的丢失:消费者处理消息时抛出一样、消费者拿到消息还未处理,出现宕机。
- 为了解决这一问题,可以在消费者的配置信息中开启消费者信息确认机制,配置spring-rabbitmq-listener-simple-acknowledge,该配置共有三个属性,nono、auto、manual。
- nono是队列将信息推送给消费者后,直接丢弃信息;
- auto是队列将信息推送给消费者后,不会直接丢弃信息,而是等消费者给mq发送一个消息处理结束的回执,如果成功处理,队列就会删除该信息;如果未处理成功,mq收到失败回执会重新发送信息,直到消费者处理成功为止
- manual是在消费者处理消息发生异常时,需要我们编写对应的代码来处理逻辑,而不是由框架自动处理。
一般情况下,推荐将该配置的属性设置为auto,由框架底层自动取检测并处理。
7. 消失失败的重试机制:
. 本地重试:利用spring的retry机制,当消费者出现异常时,不会将消息返回给队列,而是在本地重试。在配置信息中配置spring-rabbitmq-listener-simple-retry的enable属性为true,还可以配置一些其他属性如:重试的次数和重试的间隔时间
. 失败策略:失败策略有三种:RejectAndDontRequeueRecoverer,重试失败后,直接丢弃;
ImmediateRequeueMessageRecoverer,重试失败后,返回到队列中;
RepublishMessageRecoverer,将消息投递给指定的交换机。
推荐使用第三种,定义MessageRecoverer的bean对象为RepublishMessageRecoverer,可以将所有出现异常的消息投递
给指定的交换机,然后交换机路由到指定的队列中,这样既保存了该消息,也方便我们后续人工处理
8. 死信交换机
出现的情况:消息被拒绝,消息过期,队列超载
解决:可以定义一个死信交换机,并绑定死信队列,在发消息的队列中定义 exchangekey(死信交换机的路由key),这样当发送消息的队列出现上述情况,就可以将消息投递给死信交换机,路由到死信队列,实现消息的存储
**9. 延迟队列:**可以在发送消息的队列中定义消息过期时间 TTL、exchange(死信交换机)、exchangekey(死信交换机的路由key),这样就可以将发送的消息在规定的时间内投递到死信交换机,路由到死信队列,这样消费者只需要监听死信队列,就可以实现在规定的时间内接收到指定的信息,实现一些定时的功能
**10. 惰性队列:**惰性队列就是将消息存到磁盘中。当消费者消费消息的速度低于生产者生产消息的速度,就会造成消息的堆积,之后发送的消息进不去队列,可能会成为死信,为了解决这一问题,通常有两种方式:第一种是增加消费者,提高该队列消息的消费速度;第二种就是惰性队列,我们可以在定义队列的时候,将该队列定义为惰性队列,直接将消息存到磁盘中,而非内存。 代码中,可以在创建该队列的时候定义lazy()属性,创建惰性队列。
**11. mq如何确保消息的执行顺序:**发送到同一个队列;同步消息,消息发送成功才会发送下一个消息。
12. 避免消息的重复消费:
发送消息:发送的消息设置唯一的标识
消费消息:通过分布式锁setnx锁解决,键是唯一标识,锁创建成功才会处理消息,锁创建失败就证明该消息已经处理过了

二、RabbitMq集群

  • 为了解决rabbitmq的单点故障和多线程并发访问造成的消息的丢失问题,可以通过搭建rabbitmq集群来更好的存储信息。
  • rabbitmq的集群有三种:普通集群、镜像集群、仲裁队列
    - 普通集群:1、会在集群的各个结点间共享部分数据。如交换机、队列元信息;不包含队列中消息的信息
    2、当访问集群中某个结点时,如果队列不在该结点,会从队列所在结点获取信息并返回
    3、当消息所在队列的结点宕机后,队列中的消息就会消失
    - 镜像集群:1、镜像集群的本质是主从架构,镜像中的结点是由主节点和镜像结点构成的
    2、创建队列的结点就是主节点,备份到的其他结点就是该队列的镜像结点
    3、集群中的每个主节点,也可能是其他队列的镜像结点
    4、所有的操作都是在主节点操作完成,然后同步给其他镜像结点
    5、当队列的主节点宕机时,该队列的镜像结点就会成为主节点,并在集群中定义新的镜像结点
    定义镜像集群的模式为exactly模式即可
    - 仲裁队列:仲裁队列是在镜像集群的基础上构建的,也是主从架构,但是它的主节点和镜像结点的消息同步是强一致的,而镜像集群在主节点和镜像结点同步消息时不是强一致的,容易造成消息的丢失。在创建队列的时候可以定义队列属性为quorum即可.

.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值