1.什么是消息队列(谈谈对消息队列的理解)
MQ消息队列是一个按照先进先出(FIFO)队列设计的容器,用于对系统中产生的消息进行存储和消费。
使用消息队列主要是为了通过 异步处理 提高系统性能 ,削峰 和 降低系统耦合度 等目的。
目前使用较多的消息队列有 ActiveMQ ,RabbitMQ,RocketMQ,KafkaMQ
2.消息队列的使用场景
异步处理:例如 短信通知,终端状体推送,App推荐,用户注册等
流量控制:在秒杀场景下,有一个商品秒杀活动,商品数量为100,当消息队列达到100时不再生产秒杀成功消息,直接给用户返回秒杀失败,只有1到100的用户秒杀成功,获得商品。
服务解耦:A系统负责将数据发送到消息队列,消费端根据需要从消息队列中获取数据,不需要就取消 消息队列 的消费。
发布订阅:用户需要先去注册订阅消息,才能收到消息队列中的消息,进行消费。
高并发缓冲:将数据临时放入消息队列,降低高峰数据对后端的短暂冲锋。
3.常见的消息队列有哪些
RabbitMQ:是一个使用erlang开发的消息队列,开源且社区活跃,目前已被SpringSource收购,有稳定的支持。支持高并发,高吞吐,性能很高,支持死信队列。
RocketMQ:是一个基于Java开发的消息队列,阿里巴巴官方发布的消息队列产品,基于Topic进行通讯,支持延迟消息、事务消息等,功能比较丰富。
KafkaMQ:相比RabbitMQ,Kafka只有单一的Topic通讯方式,消息在消费后依然不支持死信队列、延迟队列等。它的优势在于专为超高吞吐量的实时日志采集,实时数据同步,实时数据计算等场景设计。
RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|
社区活跃度 | 高 | 较高 | 一般 |
持久化 | 支持 | 支持 | 支持 |
并发吞吐 | 高(万级) | 极高(10万级) | 极高(10万级) |
时效性 | us级 | ms级 | ms级 |
数据可靠 | 极高 | 高 | 高 |
应用场景 | 高可靠交易系统 | 日志系统、大数据应用 | 互联网高并发、高可用应用 |
4.如何保证数据不丢失
消息队列采用ACK机制当Consumer确认消息已被消费处理,会发一个ACK给消息队列,此时消息队列就可以删除这个消息了。
如果Consumer宕机/关闭,没有发送ACK,消息队列会认为这个消息没有被处理,会将这个消息发送给其他的Consumer重新消费处理。
5.如何保证消息不被重复消费(如何保证消费幂等)
消费正在消费消息时消费完毕后,会发送一个确认消息给消息队列,消息队列就会知道该消息被消费了,消息队列就可以删除这条消息。
如果Consumer宕机/关闭,没有发送ACK,消息队列会认为这个消息没有被处理,会将这个消息发送给其他的Consumer重新消费处理。
针对以上问题的解决思路:保证消息的唯一性,就算是多次传输不要让消息的多次消费带来影响,保证消息的等幂性。
方式一:消费一条消息就往数据库里插一条数据,并设置唯一索引,如果一个消息重复两次,当插入第二条时会由于数据库唯一索引插入失败,从而保证数据的正确性。
方式二:消费一条消息后,在Redis左set操作,set操作本身具有幂等性。