处理问题
服务异步调用
两个服务调用时,我们可以通过传统的HTTP方式,让服务A直接去调用服务B的接口,但是这种方式是同步的方式,虽然可以采用SpringBoot提供的@Async注解实现异步调用,但是这种方式无法确保请求一定回访问到服务B的接口
如何保证服务A的请求信息一定能送达到服务B完成一些业务操作呢
削峰
海量请求:在我们在做一些秒杀业务时,可能会在某个时间点突然出现大量的并发请求,这可能已经远远超过服务器的并发瓶颈,这时我们需要做一些削峰的操作,也就是将大量的请求缓冲到一个队列中,然后慢慢的消费掉。
如何提供一个可以存储千万级别请求的队列呢?
服务解耦
在微服务架构下,可能一个业务会出现同时调用多个其他服务的场景,而且这些服务之间一般会用到Feign的方式进行轻量级的通讯,如果存在一个业务,用户创建订单成功后,还需要去给用户添加积分、通知商家、通知物流系统、扣减商品库存,而在执行这个操作时,如果任意一个服务出现了问题,都会导致整体的下单业务失败,并且会导致给用户反馈的时间延长。这时就造成了服务之间存在一个较高的耦合性的问题。
如何可以降低服务之间的耦合性呢?
处理问题
RabbitMQ就可以解决上述的全部问题
异步调用
服务之间如何想实现可靠的异步调用 可以通过RabbitMQ的方式实现 服务A只需要保证可以把消息发送到RabbitMQ的队列中 服务B就一定会消费到队列中的消息只不过会存在一定的延时。
削峰
忽然的海量请求可以存储在RabbitMQ的队列中 然后由消费者慢慢消费 RabbitMQ的队列本身就可以存储上千万条消息
服务解耦
调用其他服务时 如果允许延迟效果的出现 可以将消息发送到RabbitMQ中 再由消费者慢慢消费
介绍
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)
RabbitMQ服务器是用Erlang语言编写的 而集群和故障转移是构建在开放电信平台框架上的
所有主要的编程语言均有与代理接口通讯的客户端库。
AMQP协议:
首先RabbitMQ基于AMQP协议开发,所以很多基于AMQP协议的功能RabbitMQ都是支持的,比如SpringCloud中的消息总线bus
其次RabbitMQ是基于Erlang编写,这是也是RabbitMQ天生的优势,Erlang被称为面向并发编程的语言,并发能力极强,在众多的MQ中,RabbitMQ的延迟特别低,在微秒级别,所以一般的业务处理RabbitMQ比Kafka和RocketMQ更有优势。
最后RabbitMQ提供自带了图形化界面,操作方便,还自带了多种集群模式,可以保证RabbitMQ的高可用,并且SpringBoot默认就整合RabbitMQ,使用简单方便。