RabbitMQ高并发下的应用场景

RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解,RabbitMQ是什么、RabbitMQ核心概念、常用交换器类型、RabbitMQ服务器安装等基础,这里就不重复讲解了。这里主要介绍一下MQ的应用场景和SpringBoot整合RabbitMQ的快速开发

MQ典型应用场景
RabbitMQ特点
消费端幂等性保障
生产端可靠性投递

MQ典型应用场景

1.解耦。生产者不会关心消费者做了什么,降低服务或者系统之间的耦合
2.流量削峰。下游服务根据自己的处理能力,每隔一定时间,或者每次拉取若干条消息,实施流控,达到保护自身的效果
3.异步处理。一个系统接收一个请求,需要在本地写库,还需要在另外几个相关的系统写库都需要一定的时长。利用mq,本地处理完,发送消息到用mq后,直接响应。

RabbitMQ特点

RabbitMQ特点:
开源、性能优秀,稳定性保障
提供可靠性消息投递模式、确认模式
与Spring AMQP完美整合,API丰富
集群模式丰富,表达式配置,HA模式,镜像队列模型
保证数据不丢失的前提做到高可靠性、可用性

消费端幂等性保障

执行某个操作,无论执行多少次,结果都是一致的,就说具有幂等性。

如何避免重复消费
在海量订单产生的业务高峰期,如何避免消息的重复消费?

消费端实现幂等性,然后永远不会消费多次,即使收到多条一样的消息

目前主流解决方案
指纹码(就是时间戳 + 业务的一些规则, 来保证id + 指纹码在同一时刻是唯一的,不会出现重复)

唯一ID + 指纹码机制,利用数据库主键去重;
select count(1) from t_order where id = 唯一ID + 指纹码;
好处:实现简单;
坏处:高并发下有数据库写入的瓶颈;
解决方案:跟进ID进行分库分表进行算法路由;

利用Redis的原子性实现

通过setnx等命令 SET 订单号 时间戳 过期时间

SET 1893505609317740 1466849127 EX 300 NX

生产端可靠性投递

RabbitMQ高并发下的应用场景_第1张图片

例如 UpstramService为订单服务,DownstreamServcie为库存服务
step1 订单服务接收到一条订单请求,处理相应业务后,发送消息到mq服务器,进行库存校验。
step2 过一段时间 ,会发送一条延时消息进行消息确认
step3 订单服务监听到step1的消息后就行库存校验,然后发送库存确认消息step4
step5 callback服务监听到库存服务的确认信息后,本地落库,记录状态。
step6 监听到订单服务的延时请求,进行本地消息的确认,
然后callback服务通过rpc远程调用,通知订单服务,订单服务本地落库,

springboot整合RabbitMQ的Starter,包含服务端和消费端,已上传github
https://github.com/zhangjingchu/rabbitmq-quick-starter

你可能感兴趣的:(RabbitMQ)