RocketMQ

一、 MQ三大特性(解耦、异步、削峰的作用)
解耦:降低各大模块之间的耦合度
异步:减少接口响应时长,实现非核心流程异步化,提高系统性能。
把比较耗时而且不需要及即时返回结果的数据,作为消息放入消息队列中
削峰:比如在电商节时,一般会因为流量过大,导致流量暴增,应用会挂掉
把请求放在一个消息队列里,慢慢的去处理,减少接口压力
二、RokertMQ如何保证消息的顺序性
全局顺序不可能,只能做到局部有序
两个核心:生产者有序存储,消费者有序消费
生产者有序存储
问题的核心就是,分配到不同的queue,那就让每一个订单的消息固定分配到queue,可以采用固定的订单号hash然后对queue长度取模,这样每个订单就固定顺序发送了。
消费者有序消费
然后,还必须保证下游单线程消费数据,因为如果多线程消费,会出现和之前一样类似的问题,不能保证多线程按你预想的顺序去执行消费
三、如何保证消息不丢失
三个阶段【 Producer( 生产者 ),broker(存储消息,等待消费),Consumer(消费者)
生产者 :同步阻塞的方式发送消息,加上失败重试机制,可能broker存储失败,可以通过查询确认;异步发送需要重写回调方法,检查发送结果;ack机制,可能存储CommitLog,存储ConsumerQueue失败,此时对消费者不可见。
broker :同步刷盘、集群模式下采用同步复制、会等待slave复制完成才会返回确认。
消费者 :在消费者段,需要确保在消息拉去并消费成功之后再给Broker返回ACK,如果这个过程中broker一直没收到ACK,那么就可以重试
重试默认是16次,可以自己设定。重试后依然失败,然后把消息放入死信队列,需要人工排查问题并解决
四、RocketMQ如何实现延迟消息
首先将延时消息换了一个topic名称进行持久化,这样消费者就无法获取消息,然后有定时任务 服务ScheduleMessageService 通过定时任务的方式不断的读取topic为SCHEDULE_TOPIC_XXXX和queueId为延时等级的消息进行消息还原处理,这样消息被还原之后消费者就可以拉取消息了。
五、RocketMQ消息堆积了怎么解决
本质就是消息太多了,MQ消费不过来
问:会对系统造成哪些影响
业务响应速率变慢
对消息中间件本身压力较大,因为磁盘空间有限
问:怎么解决
MQ增加机器
或者MQ开启多线程消费,但是要保证消息不丢失
可以给线上机器磁盘扩容
可以把消息先放到数据库,或者先放到redis,降低mq的磁盘压力
六、RocketMQ怎么避免重复消费
结论:重复消费避免不了。只能从消息的幂等消费着手
问:为什么避免不了
因为要保证消息不丢失,所有会有重传机制
因为网络波动原因导致超时,broker端提示消息发送失败,也会触发生产者的重复发送
问:需要给消费者做幂等 那应该怎么做
1、生产者给消费者传递一个唯一的unique key 
2、消费者根据这个key创建一个redis或分布式锁,每次消费的时候查看有没有锁,有锁则退出
七、RocketMQ的事务消息是如何实现的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值