MQ的作用
- 流量削峰:不管发布时间的流量有多大,订阅者都可以按照自己的速度区处理事件.
- 应用解耦
- 异步处理
AMQP
- Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
- Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出
多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等 - Connection:publisher/consumer 和 broker 之间的 TCP 连接
- Channel:Channel 是在 connection 内部建立的逻辑连接,如果应用程
序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的Connection 极大减少了操作系统建立 TCP connection 的开销 - Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。
- Queue:消息最终被送到这里等待 consumer 取走
- Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据
工作模式
简单工作模式
一个队列对应一个消费者
work模式
轮询分发,一个队列对应多个消费者,但是一条消息只能被一个消费者获取
发布订阅模式
简单工作模式和工作模式使用默认交换机""
rabbitmq有四种交换机,direct、fanout、topic、headers,发布订阅模式使用faout,faout交换机将消息路由给所有绑定的队列,绑定的路由key默认为""
路由模式
路由模式交换机类型为direct,每个与之绑定的队列都有一个路由key,交换机将与队列路由key相同的消息分发给队列
主题模式
路由模式需要路由key完全相同才将消息分发给队列,而主题模式则是采用模糊匹配
符号“#”表示匹配一个或多个词,符号“*”表示匹配一个词。
不公平分发
存在一个未确认的消息缓冲区,因此希望开发人员能限制此缓冲区的大小,以避免缓冲区里面无限制的未确认消息问题。这个时候就可以通过使用 basic.qos 方法设置“预取计数”值来完成的.
该值定义通道上允许的未确认消息的最大数量。一旦数量达到配置的数量,
RabbitMQ 将停止在通道上传递更多消息,除非至少有一个未处理的消息被确认
依赖
<!--rabbitmq 依赖客户端-->
<!--指定 jdk 编译版本-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!--rabbitmq 依赖客户端-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.8.0</version>
</dependency>
<!--操作文件流的一个依赖-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>