MessageQueue 消息队列

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通讯方式,消息在消费后依然不支持死信队列、延迟队列等。它的优势在于专为超高吞吐量的实时日志采集,实时数据同步,实时数据计算等场景设计。

RabbitMQKafkaRocketMQ
社区活跃度较高一般
持久化支持支持支持
并发吞吐高(万级)极高(10万级)极高(10万级)
时效性us级ms级ms级
数据可靠极高
应用场景高可靠交易系统日志系统、大数据应用互联网高并发、高可用应用

4.如何保证数据不丢失

消息队列采用ACK机制当Consumer确认消息已被消费处理,会发一个ACK给消息队列,此时消息队列就可以删除这个消息了。

如果Consumer宕机/关闭,没有发送ACK,消息队列会认为这个消息没有被处理,会将这个消息发送给其他的Consumer重新消费处理。

5.如何保证消息不被重复消费(如何保证消费幂等)

消费正在消费消息时消费完毕后,会发送一个确认消息给消息队列,消息队列就会知道该消息被消费了,消息队列就可以删除这条消息。
如果Consumer宕机/关闭,没有发送ACK,消息队列会认为这个消息没有被处理,会将这个消息发送给其他的Consumer重新消费处理。

针对以上问题的解决思路:保证消息的唯一性,就算是多次传输不要让消息的多次消费带来影响,保证消息的等幂性。

方式一:消费一条消息就往数据库里插一条数据,并设置唯一索引,如果一个消息重复两次,当插入第二条时会由于数据库唯一索引插入失败,从而保证数据的正确性。

方式二:消费一条消息后,在Redis左set操作,set操作本身具有幂等性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值