1.优点:
1.解耦
2.异步
3.削峰
2.MQ如何解决消息丢失问题
1.生产者丢失。
1.1RocketMq在往消息队列中发送消息的时候,会开启一个事务,如果消息发送失败了,回滚事务,进入重试。但是事务机制,在发送消息的过程中是阻塞的,严重影响了吞吐量跟性能。
1.2将channel设置成confirm。每个消息有个唯一id,Mq在收到了消息之后,回调生产者的接口,告诉生产者已经收到消息了。如果生产者没有收到某个消息的回调,或者回调了消息发送失败的接口,则重新发送。
2.mq丢失。
1.mq可能收到了消息之后放入到内存中,这个时候突然挂掉了,则重启之后造成了消息丢失。所以应该将消息持久化。Mq收到了消息之后,将消息写入到数据库中,然后回调生产者的接口,告诉生产者收到了消息了。与生产者的confirm机制配合使用。
3.消费者丢失。
1.消费者可能在消费的过程中挂了,这个时候autoAck也会告诉mq这条消息已经消费过了,造成了消息的丢失。所以需要关闭autoAck,在消费完消息之后,手动告诉mq消费完成。
3.MQ如何保证消息重复消费问题(如何保证幂等性)
1.利用消息的全局唯一id。消费过程中,如果发现数据库里已经有某一条数据了,则更新,而不是新增。
2.如果消费者数据存在redis中,则redis.set 天然幂等性。
3.消费这拿到消息之后,查询redis。如果这个消息消费过了,则不处理。如果没有消费过,则处理消息并把消息id存入到redis中。
4.Kafka出现消息重复消费的场景:Kafka中每一个消息都会有一个offset,代表唯一一个消息以及消息过来的顺序。消费这在收到消息之后,先处理消息,处理完了之后给mq回传offset告诉mq,这几条消息我已经消费过了。但是消费者可能在处理完消息之后,还没有回传offset线程就挂了。所以重启之后可能会重新消费那几条消息。
5.各类mq对比。
image.png