SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便3.1、Basic Queue 简单队列模型
SpringAMQP的官方地址
AMQP
Spring AMQP
SpringAMQP提供了三个功能
- 自动声明队列、交换机及其绑定关系
- 基于注解的监听模式,异步接收消息
- 封装了RabbitTemplate工具,用于发送消息
在父工程引入依赖3.1.1、消息发送
复制代码
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-amqp</artifactId>
- </dependency>
Work Queues,也杯称为(Task Queues),任务模型3.2.1、消息发送
当消息处理比较耗时的时候,可能生产消息的速度会远远大于消费的速度。
- 简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息
长此以往,消息就会堆积越来越多,无法及时处理。
此时就可以使用work模型,多个消费者共同处理消息,速度就能大大提高
能者多劳
3.3.1、Fanout 模型
- 发布/订阅的模型如图所示
- 可以看到,在发布/订阅模型中,多了一个exchange角色,而且过程略有变化
- Publisher:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给exchange(交换机)
- Exchange:交换机。一方面,接收生产者发送的消息;另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或者是将消息丢弃
- 到底如何操作,取决与Exchange的类型;Exchange有以下3中类型
- Fanout:广播,将消息交给所有绑定到交换机的队列
- Direct:定向,把消息交给符合指定routing key的队列
- Topic:通配符,把消息交给符合routing pattern(路由模式)的队列
- Consumer:消费者,与以前一样,订阅队列,没有变化
- Queue:消息队列也与以前一样,接收消息、缓存消息
- PS:
- Exchange(交换机)只负责转发消息,不具备存储消息的能力
- 因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失
①、声明队列和交换机
- Fanout,中文意思是扇出,一般称为广播
- 在广播模式下,消息发送流程如下所示
- 1)可以有很多个队列
- 2)每个队列都要绑定到Exchange(交换机)
- 3)生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定
- 4)交换机把消息发送给绑定过的所有队列
- 5)订阅队列的消费者都能拿到消息
①、基于注解声明队列和交换机
- 在Fanout模式中,一条消息,会被所有订阅的队列消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时候就要用到Direct类型的Exchange
- 在Direct模型中
- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由Key)
- Pulisher在向Excahnge发送消息的时候,也必须指定消息的RoutingKey
- Exchange不再把消息交给每一个绑定的队列,而是根据消息的RoutingKey在进行判断,只有队列的RoutingKey与消息的RoutingKey完全一致,才会接收到消息
- Topic模型的Exchange与Direct模型相比,都是可以根据RoutingKey把消息路由到不同的队列
- 只不过Topic模型的Exchange可以让队列在绑定RoutingKey的时候使用通配符
- RoutingKey一般是由一个或多个单词组成,多个单词之间以.号分割,例如item.insert
- 通配符规则
- #:匹配一个或多个词
- *:匹配不多不少,恰好一个词
- 举例
- item.#:表示能够匹配item.spu.insert或者item.spu
- item.*:只能匹配item.spu
- 再比如下图所示
- Queue1:绑定的是china.# ,因此凡是以 china.开头的routing key 都会被匹配到。包括china.news和china.weather
- Queue2:绑定的是#.news ,因此凡是以 .news结尾的 routing key 都会被匹配。包括china.news和japan.news
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |