欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

消息队列(MQ)-RabbitMQ

程序员文章站 2022-05-18 10:04:44
...

消息队列(MQ)

消息队列是典型的:生产者、消费者模型。

生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。

RabbitMQ

基于AMQP协议,erlang语言开发,稳定性好

RabbitMQ是基于AMQP的一款消息管理系统

五种消息模型

消息队列(MQ)-RabbitMQ

	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
		<version>3.3.2</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-amqp</artifactId>
	</dependency>

我们抽取一个建立RabbitMQ连接的工具类,方便其他程序获取连接:

public class ConnectionUtil {
    /**
     * 建立与RabbitMQ的连接
     * @return
     * @throws Exception
     */
    public static Connection getConnection() throws Exception {
        //定义连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置服务地址
        factory.setHost("192.168.56.101");
        //端口
        factory.setPort(5672);
        //设置账号信息,用户名、密码、vhost
        factory.setVirtualHost("/lj");
        factory.setUsername("lj");
        factory.setPassword("lj");
        // 通过工程获取连接
        Connection connection = factory.newConnection();
        return connection;
    }
}

基本消息模型

消息队列(MQ)-RabbitMQ

RabbitMQ是一个消息代理:它接受和转发消息。 你可以把它想象成一个邮局:当你把邮件放在邮箱里时,你可以确定邮差先生最终会把邮件发送给你的收件人。 在这个比喻中,RabbitMQ是邮政信箱,邮局和邮递员。

RabbitMQ与邮局的主要区别是它不处理纸张,而是接受,存储和转发数据消息的二进制数据块。

生产者将消息发送到队列,消费者从队列中获取消息,队列是存储消息的缓冲区。

work消息模型

消息队列(MQ)-RabbitMQ

面试题:避免消息堆积?

1)采用workqueue,多个消费者监听同一队列。

2)接收到消息以后,而是通过线程池,异步消费。

订阅模型分类

消息队列(MQ)-RabbitMQ

X (Exchanges):交换机一方面:接收生产者发送的消息。另一方面:知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。

每一个消费者都有自己的一个队列

生产者没有将消息直接发送到队列,而是发送到了交换机

每个队列都要绑定到交换机

生产者发送的消息,经过交换机到达队列,实现一个消息被多个消费者获取的目的

Exchange类型有以下几种:

Fanout:广播,将消息交给所有绑定到交换机的队列

Direct:定向,把消息交给符合指定routing key 的队列

Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列

订阅模型-fanout

消息队列(MQ)-RabbitMQ

订阅模型-Direct消息队列(MQ)-RabbitMQct

在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。

订阅模型-Topic

Topic类型的ExchangeDirect相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!

#:匹配一个或多个词

*:匹配不多不少恰好1个词

audit.#:能够匹配audit.irs.corporate 或者 audit.irs

audit.*:只能匹配audit.irs