消息队列的应用场景
- 应用解耦
- 流量削峰
-
应用解耦
用户下单后,需要通知仓储服务减库存,会员服务加积分。在不引入MQ的时候,需要订单服务直接调用库存和会员服务。
如果未来有更多的服务要接入,就需要再去下单那块写代码
引入MQ后,订单服务仅需要向MQ发送一条消息即可,具体下游服务增加或减少都不需要订单服务操心流量削峰
秒杀场景下,大量请求压过来,可以先暂时将这些请求信息放入MQ,应用服务器依据自己的能力慢慢的进行消费
异步处理
有些业务逻辑可能很耗时,此时可以将业务逻辑需要的入参放入MQ,之后通过接收MQ的消息去异步执行这块业务逻辑。实际开发中:电子发票开票
RocketMQ如何保证消息不丢失的?
生产者保证消息不丢
同步发送方式:客户端接收成功状态可以保证消息发送成功,若未接收到,则有生产者有默认的3次重投机制
- 异步发送方式:生产者会对发送失败的消息进行重试
-
存储端不丢消息
Broker接收到消息后会将消息进行刷盘操作,具体刷盘方式有:
同步刷盘:当消息刷到磁盘后才返回ACK
- 异步刷盘:当消息写入PageCache后就立即返回ACK,刷盘操作由操作系统自行判断执行时机
集群模式下
RocketMQ的一个Topic中会有多个MessageQueue
- 同一个MessageQueue下消费消息是有序的,也称为局部有序,不同MessageQueue下消费不一定有序
- 实现全局有序的方式是设置Topic的MessageQueue为1个即可
- 可以根据局部有序的规则,通过业务key,将同一个业务的相关消息指定发送到同一个MessageQueue中。如将订单号作为key,订单号只要相同必定发往同一个MessageQueue。