消息队列

作用

异步,削峰,解耦

  • 解耦

基于其发布/订阅消息模式

  • 异步

将和本次请求无关的任务,丢在消息队列中,让消费这自行消费,提高接口响应速度.

  • 削峰

在流量高峰期通过堆积消息缓解服务器瞬间压力,在低峰期再从消息队列中慢慢消费以实现削峰.

缺点

  • 系统可用性降低 MQ挂了就GG
  • 导致系统要考虑的问题变多,进而导致复杂系统的复杂性变高,例如重复消息,消息顺序变化
  • 一致性问题

落地产品

  • activemq 不太活跃了
  • rabbitmq 中小型
  • rockertmq 中大型
  • kafka 大数据领域,专业,业界标准

如何保证高可用

  1. rabbitMQ
  • 单机模式
  • 普通集群模式

不同节点部署在不同机器上,在节点之间可以进行通信,以至于消费者可以连接任意一个节点,然后可以获取到任意一个节点上的数据,
缺点:可能会产生大量的节点之间的通信,节点挂时数据丢失

  • 镜像集群模式

每个节点上都会有完整的queue数据,所以叫做镜像模式,可以从任意一个节点消费消息,所有任何一个节点挂掉,其他节点都保存的有完整的数据,从而是高可用的. 可以去其他正常的节点上获取数据,它不是分布式的.会导致非常消耗存储空间.

  1. kafka

分布式部署模式实现分布式,主从模式实现高可用,在leader宕机后会选择新的flower成为新的leader.

如何保证消息消费的幂等性

每条消息会有一个offset属性类似于消息的序号,消费者消费后会提交消费完成的offset.标识.消费者是定时定量的提交一次offset,如果在消费后未提交offset,时系统发生了重启,那么会出现重复消费消息的情况.

  • 幂等性: 多次重复操作,不影响结果.
  • 通过数据唯一键

如何保证可靠性传输

MQ

  • 生产者
  1. 在发送消息的方法中加上事务,但是是同步的方法,会发生吞吐量降低
  2. confirm机制: 异步机制,吞吐量略高.推荐使用
  1. channel 设置成confirm模式
  2. 发送了一个消息
  3. 发送完成后不用管了
  4. 如果rabbitmq接收到了消息,就会回调你生产者本地的一个接口,通知你消息已经收到了.
  5. rabbitmq如果在接收消息时发生了错误.也会回调接口通知接收失败,可以重试发送
  • rabbitmq本身

将消息持久化到硬盘 步骤:1. 将queue设置未持久化 2. 将消息的deliveryModel设置未2,使用其持久化数据的功能.

  • 消费者丢消息

在打开autoAck时,会提前确认消息消费了(消息未消费完成), 建议关闭autoaAck . 自己在消息消费完成后手动确认确认消息消费成功.

KAFKA

  • 消费者: 关闭自动提交offset.自己在消息消费完成后手动提交offset

如何保证顺序

  • 让需要保证顺序的数据发送同一个queue中,并且这个queue只有一个消费者.

消息积压怎么办?

  1. 修复消费者
  2. 新建一个topic 包含十倍的partion
  3. 让消费者消费到的数据转移到新的topic里面去.
  4. 然后用更多的消费者去消费新的topic里面的消息,快速消费数据.
  • 不设置过期时间,如果丢数据,从源头补偿数据

设计消息框架

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值