RabbitMQ 七种消息传递形式

  • 1. RabbitMQ 架构简介

  • 2. 准备工作

  • 3. 消息收发

    • 3.1 Hello World

    • 3.2 Work queues

    • 3.3 Publish/Subscrite

    • 3.4 Routing

    • 3.5 Topics

    • 3.6 RPC

    • 3.7 Publisher Confirms

  • 4. 小结

今天这篇文章比较简单,来和小伙伴们分享一下 RabbitMQ 的七种消息传递形式。一起来看看。

大部分情况下,我们可能都是在 Spring Boot 或者 Spring Cloud 环境下使用 RabbitMQ,因此本文我也主要从这两个方面来和大家分享 RabbitMQ 的用法。

1. RabbitMQ 架构简介

一图胜千言,如下:

RabbitMQ 七种消息传递形式_第1张图片

1587705504342

这张图中涉及到如下一些概念:

  1. 生产者(Publisher):发布消息到 RabbitMQ 中的交换机(Exchange)上。

  2. 交换机(Exchange):和生产者建立连接并接收生产者的消息。

  3. 消费者(Consumer):监听 RabbitMQ 中的 Queue 中的消息。

  4. 队列(Queue):Exchange 将消息分发到指定的 Queue,Queue 和消费者进行交互。

  5. 路由(Routes):交换机转发消息到队列的规则。

2. 准备工作

大家知道,RabbitMQ 是 AMQP 阵营里的产品,Spring Boot 为 AMQP 提供了自动化配置依赖 spring-boot-starter-amqp,因此首先创建 Spring Boot 项目并添加该依赖,如下:

RabbitMQ 七种消息传递形式_第2张图片

项目创建成功后,在 application.properties 中配置 RabbitMQ 的基本连接信息,如下:

spring.rabbitmq.host=localhost
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.port=5672

接下来进行 RabbitMQ 配置,在 RabbitMQ 中,所有的消息生产者提交的消息都会交由 Exchange 进行再分配,Exchange 会根据不同的策略将消息分发到不同的 Queue 中。

RabbitMQ 官网介绍了如下几种消息分发的形式:

RabbitMQ 七种消息传递形式_第3张图片

这里给出了七种,其中第七种是消息确认,消息确认这块松哥之前发过相关的文章,传送门:

  • 四种策略确保 RabbitMQ 消息发送可靠性!你用哪种?

  • RabbitMQ 高可用之如何确保消息成功消费

所以这里我主要和大家介绍前六种消息收发方式。

3. 消息收发

3.1 Hello World

咦?这个咋没有交换机?这个其实是默认的交换机,我们需要提供一个生产者一个队列以及一个消费者。消息传播图如下:

来看看代码实现:

先来看看队列的定义:

@Configuration
public class HelloWorldConfig {

    public static final String HELLO_WORLD_QUEUE_NAME = "hello_world_queue";

    @Bean
    Queue queue1() {
        return new Queue(HELLO_WORLD_QUEUE_NAME);
    }
}

再来看看消息消费者的定义:

@Component
public class HelloWorldConsumer {
    @RabbitListener(queues = HelloWorldConfig.HELLO_WORLD_QUEUE_NAME)
    public void receive(String msg) {
        System.out.println("msg = " + msg);
    }
}

消息发送:

@SpringBootTest
class RabbitmqdemoApplicationTests {

    @Autowired
    RabbitTemplate rabbitTemplate;


    @Test
    void contextLoads() {
        rabbitTemplate.convertAndSend(HelloWorldConfig.HELLO_WORLD_QUEUE_NAME, "hello");
    }

}

这个时候使用的其实是默认的直连交换机(DirectExchange),DirectExchange 的路由策略是将消息队列绑定到一个 DirectExchange 上,当一条消息到达 DirectExchange 时会被转发到与该条消息 routing key 相同的 Queue 上,例如消息队列名为 “hello-queue”,则 routingkey 为 “hello-queue” 的消息会被该消息队列接收。

3.2 Work queues

<

你可能感兴趣的:(java,面试,架构,java-rabbitmq,rabbitmq,java,面试,分布式)