一文了解RabbitMQ(技术栈基础+延迟队列应用)
同步调用
业务顺次执行
异步调用
异步调用方式基于消息通知方式,一般包含三个角色:
消息发送者:发送消息的人,就是原来的调用方
消息代理:管理、暂存、转发消息,例如微信服务器
消息接收者:接收和处理消息的人,原来服务的提供方
MQ技术选型
概述
publisher:消息的发送者
consumer:消息的消费者
queue:队列、储存消息
exchange:交换机、负责路由消息
快速入门
交换机负责路由和转发消息,没有存储消息的能力
使用交换机之前要先绑定队列才能实现消息的发送
队列中可以储存消息
数据隔离
用户(user)和虚拟主机(virtual host)
连接java客户端
快速入门
SpringAMQP
基于AMQP协议(用于在应用程序之间传递业务消息的开放标准,与语言和平台无关)定义的一套API规范,提供了模板来发送和接收消息。spring-amqp是基础抽象,spring-rabbit是底层默认实现
workqueue模型
多个消费者绑定一个发送者,共同消费队列中的消息
fanout交换机
Fanout Exchange可以将接收到的消息广播到每一个与其绑定的queue,称为广播模式
Direct交换机
定向交换机,会将接收到的消息根据规则发送到指定的queue
Topic交换机(推荐)
routingkey可以是多个单词的列表,并且以.分割
queue与exchange绑定时可以使用通配符
声明队列与交换机
基于bean绑定
基于注解绑定
直接在Listener上绑定
消息转换器
采用json序列化代替jdk序列化,自定义消息转换器
消息可靠性
发送者可靠性
生产者重连
生产者确认
数据持久化
交换机持久化——durable
队列持久化——durable
消息持久化——delivery_mode = 2
非持久化方式——使用内存保存消息
持久化——使用磁盘存储消息
Lazy Queue
消费者可靠性
消费者确认
失败重试机制
注意:使用时配置文件中要有相应的参数
即在configuration中定义MessegeRecover的bean,接收异常信息
业务幂等性——防止重复消息
唯一消息id实现幂等性
为实现消息的幂等性,需要为消息设置一个唯一的id,以区分是否为重复消息
可以在消息转换器中添加id
业务本身实现幂等性
小结
延迟消息
死信交换机实现延迟消息
延迟消息插件实现延迟消息(推荐)
首先需要开启rabbitmq的延迟消息插件