MQ简介及AMQP协议
什么是MQ?
Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。
MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。
老牌:ActiveMQ、RabbitMQ。
新热:Kafka。
本项目选择RabbitMQ作为消息中间件。
RabbitMQ
- 性能优秀,稳定性保障,支持分布式
- RabbitMQ是使用Erlang语言来编写,
- 并且RabbitMQ是基于AMQP协议的
- 开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据
- 与SpringAMQP完美整合、API丰富
消息中间件的应用场景:
1、异步处理
解决:等待没有必要的等待,把不是必须的业务逻辑异步处理 。
目前,三大做法:串行,并行,消息队列。
场景说明:注册+发送邮件+发送短信(假如各需50ms)
串行:50ms+50ms+50ms
并行:50ms+50ms
消息队列:50ms+5ms(写入消息队列的时间)
串行方式使用时间150ms,并行使用时间100ms。虽然并性已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回。
2、应用解耦
场景说明:双十一购物
3、流量削峰
场景说明:秒杀活动中,一般会因流量过大导致应用挂掉,所以一般会在应用前端加入消息队列。
作用:
1.可以控制活动人数,超过此一定阀值的订单直接丢弃(我为什么秒杀一次都没有成功过呢^^)
2.可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)
SpringBoot整合RabbitMQ:
1、导入maven依赖
2、在application.properties文件当中引入RabbitMQ基本的配置信息
# 消息中间件 RabbitMQ
# 访问port是5672,不是15672,15672是api和管理界面的port
spring.rabbitmq.addresses=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
spring.rabbitmq.publisher-confirms=true
3、编写RabbitMqConfig类,消息中间件RabbitMQ配置
4、编写RabbitMqEnum类,定义RabbitMQ需要的常量,类里面设置很多个EXCHANGE,QUEUE,ROUTINGKEY,是为了接下来的不同使用场景。
5、RabbitMq生产者配置
Exchange 交换机配置
Queue 消息队列配置
以及交换机和队列的绑定, 交换机和消息队列可以多对多绑定。
6、消息发送工具类
继承ConfirmCallback
7、编写消息的消费者
方式一:注解。
@RabbitListener(queues = RabbitConfig.QUEUE_A)
@RabbitHandler
注:监听定义好的queue
* springboot注解的方式监听队列,无法手动指定回调,
* 所以采用了实现ChannelAwareMessageListener接口,重写onMessage来进行手动回调。
方式二:bean注入,手动监听回调。(推荐)
本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.sosokankan.com/article/2059072.html