一.为什么要使用消息队列?
消息队列的作用主要有以下三个
1.解耦(下游调用服务)
使用消息之前,处理完毕订单服务后需要去扣减库存,发送消息等操作,引入之后,可以把订单服务结束后放到消息队列中,下游服务订阅消息即可,完成订单服务与其他服务的解耦合。
2.异步操作(同步处理库存积分某些后续操作)
订单支付后需要哦扣减库存,发送通知消息,链路如果过长,响应变慢,会阻塞其他任务的进行,异步操作可以降低响应的时间。
3.削峰
秒杀系统等,redis,mysql压力太大,可以会挂掉,可以把消息放到消息队列中,按照设定的处理速度处理流量,就可以抗住大的流量了。
二.面试常见:顺序消息如何实现?
某些情况下,消息的顺序必须是有序的,比如生单->付款->出票。
全局有序性:某个topic下的所有消息都要保证是有序的
部分顺序:保证每一组消息顺序消费,比如订单消息,保证同一个订单ID能够按照顺序消费。
部分顺序消息
部分顺序消息相对⽐比较好实现,⽣生产端需要做到把同 ID 的消息发送到同⼀一个 Message Queue ;在消费过程中,
要做到从同⼀一个Message Queue读取的消息顺序处理理——消费端不不能并发处理理顺序消息,这样才能达到部分有
序。
全局顺序消息
RocketMQ 默认情况下不保证顺序,⽐比如创建⼀一个 Topic ,默认八个写队列列,八个读队列列,这时候一条消息可能被
写入任意⼀一个队列里;在数据的读取过程中,可能有多个 Consumer ,每个 Consumer 也可能启动多个线程并⾏
处理,所以消息被哪个 Consumer 消费,被消费的顺序和写⼈人的顺序是否⼀一致是不确定的。
要保证全局顺序消息, 需要先把 Topic 的读写队列列数设置为 ⼀一,然后Producer Consumer 的并发设置,也要是
⼀一。简单来说,为了了保证整个 Topic全局消息有序,只能消除所有的并发处理,各部分都设置成单线程处理 ,这时
候就完全牺牲RocketMQ的高并发、高吞吐的特性了。