RabbitMQ支持的消息模式:
引入依赖:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
</dependency>
工具类包装:
第一种:基本模型(直连)
P:生产者,发送消息的程序
C:消费者,消息的接受者,等待消息的到来,消费消息
queue(红色部分):消息队列。类似于邮箱,可以缓存消息,生产者投递消息,消费者获取消息。
开发生产者:
开发消费者:
结果(生产者):
打印(消费者):
第二种:工作队列模型(work quene)
work quene:任务模型。当消息处理比较耗时时,可能生产消息的速度会远远大于消费的速度,造成消息堆积。可以使用多个消费者绑定到一个队列,共同消费。
P:生产者,发送消息的程序
C1:消费者,消息的接受者,等待消息的到来,消费消息
C2:消费者,消息的接受者,等待消息的到来,消费消息
生产者:
消费者1:
消费者2:
结果(生产者):
打印(消费者1)
默认情况下,rabbitMQ会按顺序将每个消息发送给消费者,平均而言每个消费者都会收到相同数量的消息,这种分发消息的方式为循环。
消息自动确认机制:
当开启消息自动确认机制后,消费者会从队列中拿到所有消息。但如果消费者因为某些问题在处理消息过程中突然宕机,则可能会造成消息的丢失。希望处理消息过程中,某个消费者宕机了,可以将未完成的消息交给其他消费者处理,避免消息丢失
为了避免消息丢失,RabbitMQ支持消息确认。消费者发送回确认,以告知RabbitMQ已经接收,处理了特定的消息,并且RabbitMQ可以自由删除它。
如果消费者因为某些原因宕机(通道关闭,连接关闭,TCP连接丢失),而无需发送ack,RabbitMQ将 了解消息未完全处理,并对其重新排队。如果同时有其他消费者在线,它将很快重新分发给其他消费者。
能者多劳:处理消息能力好的消费者处理更多任务,处理能力差的分发较少任务
实现:
1.关闭消息自动确认
2.设置同一时刻服务器只发送一条消息给同一消费者
3.开启消息的手动确认
第三种:发布/订阅模型之fanout(发布/订阅模式)
fanout:广播模式;
消息发送流程:
可以有多个消费者
每个消费者有自己的队列
每个队列都要绑定到交换机上
生产者发送消息只能发送到交换机上
交换机来决定给哪个队列,而生产者无法决定
交换机把消息发送给绑定过的所有队列
队列里的消费者都能拿到消息(实现一条消息被多个消费者消费)
生产者:
消费者:
RabbitMQ消息模型的核心思想(core idea): 生产者会把消息发送给RabbitMQ的交换中心(Exchange),Exchange的一侧是生产者,另一侧则是一个或多个队列,由Exchange决定一条消息的生命周期–发送给某些队列,或者直接丢弃掉。
第四种:发布/订阅模型之routing(路由模式)
routing:发布/订阅模型-直连。
要求:
队列与交换机绑定,不能任意绑定,而需要指定一个路由key
生产者向交换机发送消息时,必须指定消息的路由key
P:生产者向交换机发送时会指定一个路由key
X:接收生产者消息,把消息传递给与路由key匹配的队列
C1:消费者,其所在的队列指定了需要路由key 为error的消息
C2:消费者,其所在的队列指定了需要路由key 为info的消息
生产者:
消费者:
第五种:发布/订阅模型之topics(主题模式)
topics(主题模式):topics类型交换机可以让队列绑定在路由key的时候使用通配符。
通配符:
*:只匹配一个词
#:匹配零个、一个或多个词
生产者:
消费者: