RabbitMQ笔记

AMQP协议

  • 协议模型图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dm5rQyNr-1584180645338)(en-resource://database/657:1)]

  • 核心概念
    在这里插入图片描述

  • 整体架构
    在这里插入图片描述

工作模式

  1. 简单模式

    1. 直接指定交换机为空串
    2. 类似没有交换机的存在,直接路由key就是队列的名称;实际上消息发送给默认的交换机,再由默认交换机发送给对应队列名称的队列
      在这里插入图片描述
  2. work工作模式(资源的竞争)

    1. 直接指定交换机为空串,路由key还是队列的名称
      在这里插入图片描述
      消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2,同时监听同一个队列,消息被消费?C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患,高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用)应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)
  3. publish/subscribe发布订阅(共享资源)

    1. 交换机类型为Fanout
    2. 此模式需要交换机,只要和该交换机绑定了的队列都可以收到消息,也就是没有路由key(发布订阅模式)
      在这里插入图片描述
      X代表交换机rabbitMQ内部组件,erlang 消息产生者是代码完成,代码的执行效率不高,消息产生者将消息放入交换机,交换机发布订阅把消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费相关场景:邮件群发,群聊天,广播(广告)
  4. routing路由模式

    1. 交换机类型direct,此时需要绑定具体的路由key

在这里插入图片描述
消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;根据业务功能定义路由字符串从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中业务场景:error 通知;EXCEPTION;错误通知的功能;传统意义的错误通知;客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;

  1. topic 主题模式(路由模式的一种)
    1. 交换机类型为topic
      在这里插入图片描述
      星号井号代表通配符星号代表多个单词,井号代表一个单词路由功能添加模糊匹配消息产生者产生消息,把消息交给交换机交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

消息丢失

  1. 如果消息消费者接收到消息(autoAck),但是此时消费者宕机了,这样消息队列没有了消息消息也没有被成功消费

    1. 解决: 可以将AutoAck设置为false,也就是消息需要手动确认,在消息队列里面这条消息也会被标记为未确认, 只有当消费者确认或者消费者的链接与消息队列断开,这条消息就会被取消标记
  2. 消息重复消费问题

    1. 可以在业务中解决,列如发送订单ID此时订单在数据库中的消费状态是未消费,消费之后就直接修改状态,当收到重复消息直接判断状态即可
  3. 消息发送丢失

    1. confirm确认,控制当前数据是否到交换机

      1. 该功能是RabbitMQ提供了的,如果需要使用需要在链接工厂中设置;调用方法setPublisherConfirm; 然后在RabbitTemplate中setConfirmCallBack; 在回调方法中可以对发送失败消息进行持久化再次扫描;没有到交换机可能交换机宕机这时候处理回调的是默认的客户端回调
    2. return回调, 指的是当前数据是否到队列中

      1. 同样需要在链接工厂开启setPublisherConfirm
      2. 在rabbitTemplate中setMandatory
      3. 在rabbitTemplate中setReturnCallBack
    3. 可以申明备用交换机,在创建交换机Bean的时候就指定参数即可

      1. map.put(“alternate-exchange”, “exchangeTest”)

RabbitMQ整合Spring

  1. RabbitAdmin 可以动态的添加和删除队列交换机以及绑定
  2. SpringAMQP可以直接以@Bean的方式申明队列交换机,但这种方式不能动态添加队列交换机
  3. RabbitTemplate可以方便的发送消息等操作
  4. SimpleMessageListenerContainer,可以动态的去监听,解决了在业务中需要动态监听的问题

RabbitMQ高可用

1. 主备模式

在这里插入图片描述

2.远程模式在这里插入图片描述
3.镜像模式

在这里插入图片描述

4. 多活模式

在这里插入图片描述

对比其他消息中间件

  1. ActiveMQ他的性能比较低,不适合高并发场景
  2. Kafka,性能非常高,但是不对消息进行可靠性处理,使用与日志收集等不担心数据丢失的业务尝尽
  3. RocketMQ,高性能能支持上亿的消息堆积,但是部分功能收费
  4. RabbitMQ,性能比ActiveMQ性能好并且消息可靠
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值