设置消息模型,在发消息的时候设置 /** * 发送消息 */ public void sendMessage() { String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); String context = "hello!亚索 " + date; logger.info("发送的内容 : " + context); //简单对列的情况下routingKey即为队列名称 this.rabbitTemplate.convertAndSend(simpleQueue, context); }
接收时候的监听:
@RabbitListener(queues = “simpleQueue”) 监听名为simpleQueue的队列 @RabbitHandler 代表此方法为接受到消息后的处理方法**
基本消息模型:生产者–>队列–>一个消费者 2.work消息模型:生产者–>队列–>多个消费者共同消费 3.订阅模型-Fanout:广播,将消息交给所有绑定到交换机的队列,每个消费者都可以收到同一条消息 4.订阅模型-Direct:定向,把消息交给符合指定 rotingKey 的队列(路由模式) 5.订阅模型-Topic:通配符,把消息交给符合routing pattern(主题模式) 的队列
优点:解耦,削峰,异步
耦合的系统间带来的问题:
1、发送的数据,如果对方宕机了,数据会丢失 2、如果增加了其他的的对象,需要额外配置接口 3、如果对方不需要了,我们需要关闭对应的接口
综上就是维护比较麻烦
项目中的使用:
预约挂号可以使用,防止数据丢失,不用每个医院都自己去维护(需要根据不同的医院,到不同医院的服务去消费)(找对应的工作模式)
预约和支付分开,刷新预约的情况,成功的话,再支付
数据推送,使用rabbitmq,防止数据的丢失,方便接口的维护
异步,
虚拟主机,绑定一个服务或者一个模块
创建虚拟主机
生产者daemo
消费者一直监听
常用的工作模型:
1、直连模型
p:消息生成者
c:消费者
q:消息队列
2、任务模型
当生产端产生的数据,消费端无法及时消费,可以增加多个消费者消费队列的消息。 如果一个消费者消费了消息,就不会被重复消费。
3、fanout广播模型
消息的发送流程:
可以有多个消费者;
每个消费者都有自己的队列;
每个队列都有自己的交换机;
生产者发送的消息只能发送到交换机;
交换机决定将数据发送到指定的队列;
交换机把消息发送给绑定的所有队列;
队列的消费者能拿到消息,实现一条消息被多个消费者消费;
路由模式 路由模式的订阅模型
队列于交换机的绑定,不能是任意绑定,而是指定一个routingkey(路由key)
消息的发送方在向exchange发送消息时,也必须指定柔婷key
exchange根据消息的routingkey将数据传到对应的队列
topic订阅模式 topic模式类支持通配符的使用,分配数据到对应的队列
工作队列
实际代码
消费者
通过设置手动确认机制(消费完一条数据后,把这条数据从队列中删除),可以实现消息的不丢失和负载均衡
fanout广播模型
消费者
rout路由模型:
生产者代码
消费者代码
topic模型,在route模式下,多个同配符的使用
多个单词,用点分开
消费者代码
生产者代码
springboot整合rabbitMQ
生产者
队列的相关属性在消费者端设置
工作队列代码编写(work queue)
(基本不用)rabibitmq普通集群:(主要解决了master宕机时,可以对quene消息进行备份),如果消费者消费的时slaver,需要slaver先调master,然后slaver再将值传给消费者
镜像集群 lvs是一个虚拟ip
haproxy:是负载均衡器,负载连接不同的镜像