RabbitMQ总结

消息队列应用场景:

  1. 应用解耦
    例:数据归档,单据分很多个阶段处理,每个阶段都会进行归档,标记处理等调用其他服务,统一使用消息队列处理
  2. 流量削峰
    例:消息队列中消息数量超过最大数量则拒绝请求或跳转到错误页面
  3. 异步处理
    例:对大量第三方单据进行校验,采用消息队列,分批处理的方式,返回一个软状态处理中,每处理完一批则更新状态
  4. 消息通讯
    例:不同厂商进行消息同步

RabbitMQ组成

  • 角色: 生产者,服务端,消费者
  • 交换机: 生产者生产的消息经过交换机分发给不同的队列
  • 队列: 存储消息,消费者可指定不同的队列,拉取消息
  • Routingkey: 交换机进行消息分发时指定规则

交换机类型:

  • direct:类似单播,使用routingkey指定目的队列
  • topic: 类似组播,将消息传递给下面同一主题的队列
  • fanout:类似广播模式,将消息分发给每个下游队列
  • header:忽略掉routingkey,使用hash数据结构来进行匹配和转发

常见问题

如何防止消息丢失?

生产者 问题:生产端——Server端,消息丢失 解决:Confirm确认,消息未确认会重新发送

服务端 问题:服务端挂掉导致消息丢失 解决:服务端消息备份,持久化到数据库

消费端 问题:服务端——消费端,消息丢失 解决:ACK应答,开启手动应答,应答后消息再从消息队列移除

如何保证消息幂等?

  1. 状态递进,状态向前变化,说明已经执行过了,不允许执行
  2. 数据库唯一键,保证不会重复插入
  3. redis的setnx已存在不允许插入
  4. 具体还是要看业务场景,万变不离其宗,只要你想到办法可以识别消息消费过那就可以解决问题

如何实现死信队列?

设置ttl + 死信交换机 + 死信队列
详见另一篇博文: https://blog.csdn.net/qq_44845473/article/details/126968773


版权声明:本文为qq_44845473原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。