消息队列MQ常见问题

Posted ttaall

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列MQ常见问题相关的知识,希望对你有一定的参考价值。

消息队列

 

为什么用?

解耦,削峰,异步

 

 

基本模型

生产者  ->  MQ   ->  消费者

Kafka 十万级/s  适用于大数据领域实时计算,日志采集,

 ActiveMQ /s ,  RabbitMQ /s ,  RocketMQ 十万/s  

 

 

造成问题及解决

1.系统可用性降低 (MQ发生故障,全崩了)

2.MQ重复发送消息 重复消费问题 MQ丢消息问题  MQ发送消息顺序错乱

3.不一致性,MQ给客户端显示执行成功,结果在服务器一端执行失败了,导致不一致

 

MQ高可用问题:

RabbitMQ 普通集群模式,一个机器,多个节点 消费者随机找到一个MQ节点消费,该进程会去找其他MQ节点的数据同步过来,返还给消费者。 集群内部存在大量数据传输。一旦其中一个节点挂了,数据就没了。

 

RabbitMQ 镜像集群模式,每个节点的数据都会同步到其他全部节点,保证了每个节点都有全部数据,数据量过大同步困难

 

Kafka高可用框架:

同一数据存在不同机器上,每一份数据leader 都同步副本数据在一台机器上作为follower作为备份

 

消息重复消费问题:

Kafka重复消费问题:生产者生产的数据进入到kafka后都会为每一条数据标识一个offset值,消费者消费到该数据后,把offset值提交给zookeeper用来记录offset,再传回kafka证明消息已经消费完毕。

如果消费者消费完准备提交offset,还未提交就挂了,重启后不再提交到zookeeper,导致kafka以为该消息还没消费,继续发送给消费者导致重复消费。

 

解决办法:消费者程序做幂等性来保证

 

消息丢失问题:

RabbitMQ

  1. 生产者穿rabbitMQ途中因为网络等问题丢了。

解决办法:rabbitMQ接收到消息后回调生产者,接收成功

  1. RabbitMQ挂了,导致未消费的消息丢了

解决办法:开启RabbitMQ持久化,将消息持久化到磁盘

  1. 消费者挂了,消费完了还没处理数据就挂了

解决办法:打开消费者的autoAck机制,消费成功会自动通知MQ

 

Kafka

  1. Kafka挂了,数据没等leader备份到follower就挂了。

解决办法:

配置kafka四个参数

参数1topicrelacation必须大于1(必须有多个follower)

参数2min_insync.replicas必须大于1(必须至少有一个follower与自己保持联系)

参数3asKs=all 要求必须生产者的数据发送到leader,并且同步到全部follower才算一次发送成功

参数4retries=max 如果未同步到全部follower一直重试

  1. 消费者挂了,消费完了消费了数据但是还没处理数据就挂了

解决办法:关闭kafka自动提交offset,改成手动提交offset,在代码中消费到数据并完完全全彻底处理完数据后才提交offset

 

消费大量积压问题

原因:一般是消费者挂掉导致大量消息积压在MQ

解决:多开几个partition,多开几个消费者同时消费积压。

 

消费顺序出错问题

原因;把应该保证顺序的多条消息分散发给多个消费者,再从多个消费者整合到一起导致消息顺序错乱。

解决:把需要保证顺序的多条消息写入同一个消费者。

Kafka中写入到一个partition中的数据一定是有顺序的。

 

 

以上是关于消息队列MQ常见问题的主要内容,如果未能解决你的问题,请参考以下文章

深入消息队列MQ,看这篇就够了!

消息队列(mq)是啥?

消息队列(mq)是啥?

消息队列篇—常用消息队列MQ产品介绍及对比

将 MQ 消息从一个队列复制到另一个队列

MQ消息队列常见面试题