RabbitMQ笔记


RabbitMQ笔记


MQ的本质

什么是MQ

  • MQ的本质就是(一发一存一消费)
  • 就是一个转发器

MQ将生产者的消息存入一个叫「队列」的容器,然后取出来,转发给消费者。包含俩个关键元素:消息、队列

消息:要转发的数据,可以是简单的字符串,也可以是约定好的格式

队列:一个先进先出的数据结构,消息从队尾入,队头出

MQ的模型

两个模型的区别就是消息是单播还是多播(一个消息是否可以被多次消费)。

  • 队列模型
    • 多个生产者可以向一个队列中存入信息
    • 多个消费者是竞争关系
      • 一个消息只能消费一次
  • 订阅模型
    • 发布者发布消息
    • 订阅者消费消息
      • 每个订阅者都可以收到全量的消息

应用场景

MQ模型实际解决的是生产者和消费者的通信问题。之前是消费者直接调用生产者。
引入MQ之后,关键的区别在于:

1、之前是一次RPC,现在是两次RPC调用。

2、多出来一个中间节点「队列」存储消息,由同步变成异步

之前一个完整的业务流程包括多个流程,比如「人员入职的审批」,包含「记录入职信息」、「入司文件归档」、「发送审批结果给用户」、「同步核心系统」。

  • 优点
    • 系统解耦
      • 引入MQ之后,现在「审批」可以只关注最主要的「记录入职信息」,其他事情全部交给MQ来通知即可。
    • 异步通信
      • 引入MQ之后,「入司文件归档」、「发送审批结果给用户」、「同步核心系统」都变成来异步执行,减少了「人员入职的审批」整体耗时。
    • 流量削峰
      • 引入MQ之后,MQ可以转储消息,可以吧MQ当作漏斗,进行限流。
  • 缺点
    • 系统可用性降低
    • 系统复杂度升高
    • 数据一致性问题

常见问题

  • 重复消费
    • 保证幂等性
      • 数据库主键
      • insert之前先select,如果存在就update
      • 使用redis,set覆盖,天然幂等
  • 消息丢失
    • 生产端丢失
      • 开启事务(同步,提交事务之后会阻塞)
      • confirm机制(异步,MQ接收后回调通知)
    • MQ丢失
      • 开启持久化
        • 队列持久化
        • 消息持久化
    • 消费者丢失
      • ack
  • 积压、过期失效、堆积
    • 临时部署多个消费者消费
    • 手动补
    • 丢弃,手动补
  • 如何保证顺序性
    • 一个「队列」,多个「消费者」导致的乱序
      • 拆分队列,一个「队列」一个「消费者」

RabbitMQ实战

AMQP协议(Advanced Message Queuing Protocol)

消息通信

生产者创建消息
消费者接收消息
一个TCP链接,多个信道(channel)
交换器
队列
绑定

运行RabbitMQ

编码和模式

集群

从故障中恢复

故障转移和复制


  目录