中间件_RabbitMQ五种消息模型

这篇具有很好参考价值的文章主要介绍了中间件_RabbitMQ五种消息模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


RabbitMQ官方文档
RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

1.简单消息队列模型

简单消息队列官方文档

1、创建简单消息队列

中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

2、导入依赖

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

3、编写生产者测试类SpringAmqpTest,并利用 RabbitTemplate 实现消息发送

@SpringBootTest
public class SpringAMQPTest {
	//SpringAMQP提供的三个功能之一:封装了 RabbitTemplate 工具,用于发送消息 (生产者)
    @Autowired
    private RabbitTemplate template;

    @Test
    void test(){
    	//利用RabbitTemplate提供的方法向指定队列发送消息
        template.convertAndSend("simple.queue","Hello SpringAQMP!");
    }
}

4、编写消费者,监听队列消息

@Component
public class MessageListener {
	  /**
     * SpringAMQP提供的三个功能之二:基于注解的监听器模式,异步接收消息 (消费者)
     * @RabbitListener是SpringAMQP提供的监听消息队列的注解
     * @param message
     */
    @RabbitListener(queues = "simple.queue")
    public void basicQueueListener(String message) {
        System.out.println("消费者接收到消息:" + message);
    }
}

中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

5、编写生产者和消费者的application.yml文件

spring:
  rabbitmq:
    host: 192.168.6.131
    port: 5672
    # 虚拟主机
    virtual-host: /
    username: rabbitmq
    password: 123456

中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

6、测试

运行生产者代码后,simple.queue 队列中产生了一条待消费的消息。
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
运行消费者代码后,队列中的消息被消费
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

2.Work工作队列模型

work工作队列官方文档

1、 创建 work.queue 队列

中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

2、创建生产者测试类

    @Test
    void testWorkQueue(){
        String queueName = "work.queue";
        String message = "Hello SpringAQMP-";
        for (int i = 0; i < 20; i++) {
            template.convertAndSend(queueName,message+i);
        }
    }

3、创建消费者测试类

    @RabbitListener(queues = "work.queue")
    public void workQueueListener01(String message) throws InterruptedException {
        System.out.println("消费者01接收到消息:" + message + " - " + LocalTime.now());
        Thread.sleep(20);
    }
    @SneakyThrows
    @RabbitListener(queues = "work.queue")
    public void workQueueListener02(String message){
        System.out.println("消费者02接收到消息:" + message + " - " + LocalTime.now());

4、修改消费者的application.yml

正常情况下每个消费者要消费的消息数量是一样的。消息是平均分配给每个消费者,并没有考虑到消费者的处理能力。这样显然不合理,因此修改消费者的配置文件使得每个消费者按照能力顺序处理信息

spring:
  rabbitmq:
    listener:
      simple: # 简单队列和work队列的配置
        prefetch: 1 # 每次只能获取一条消息,处理完成才获取下一条消息

5、测试

运行生产者和消费者类,两个消费者收到的同一个队列中的消息肯定是不一样的。
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

3.发布订阅模型

在发布订阅模型中,多了一个exchange角色,而且过程略有变化:

  • producer:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)

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

    • fanout:广播,将消息交给所有绑定到交换机的队列
    • direct:定向,把消息交给符合指定 routing key 的队列
    • topic:通配符,把消息交给符合 routing pattern 的队列
  • consumer:消费者,订阅队列

  • queue:消息队列,接收消息、缓存消息。

exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与 exchange 绑定,或者没有符合路由规则的队列,那么消息会被丢弃!
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

3.1.Fanout广播

Fanout广播官方文档
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

在广播模式下,消息发送流程是这样的:

  • 可以有多个消费者

  • 每个消费者有自己的queue(队列)

  • 每个队列都要绑定到Exchange(交换机)

  • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。

  • 交换机把消息发送给绑定过的所有队列

  • 队列的消费者都能拿到消息。实现一条消息被多个消费者消费

  • 使用内置的 amq.fanout 交换机
    中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

  • 两个队列不用手动创建,是在下面

1、创建生产者测试类

@Test
void testFanoutExchange() {
    rabbitTemplate.convertAndSend("amq.fanout", "", "Hello amq.fanout");
}

2、创建消费者测试类


@Component
public class SpringRabbitListener {
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue01"),
            exchange = @Exchange(name = "amq.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void fanoutQueueListener01(String message) {
        System.out.println("消费者01接收到fanout.queue01的消息:" + message);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue02"),//使用@Queue(name = "fanout.queue01")RabbitMQ自动生成队列
            exchange = @Exchange(name = "amq.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void fanoutQueueListener02(String message) {
        System.out.println("消费者02接收到fanout.queue02的消息:" + message);
    }
}

3、测试

运行生产者和消费者
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

3.2.Direct路由

Direct路由官方文档
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
在 Fanout 模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到 direct 类型的 exchange。

Direct模型下:

  • 队列与交换机的绑定要指定一个 RoutingKey
  • 消息的发送方在向 exchange 发送消息时,也必须指定消息的 RoutingKey。
  • exchange 不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey 与消息的 Routing key 完全一致,才会接收到消息

1、创建生产者测试类

@Test
void testDirectExchange() {
    rabbitTemplate.convertAndSend("amq.direct", "save", "新增通知");
    rabbitTemplate.convertAndSend("amq.direct", "delete", "删除通知");
}

2、创建消费者测试类

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue01"),
    exchange = @Exchange(name = "amq.direct", type = ExchangeTypes.DIRECT),
    key = {"save"}
))
// 处理新增的业务
public void directQueueListener01(String message){
    System.out.println("消费者01接收到direct.queue01的消息:" + message);
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue02"),
    exchange = @Exchange(name = "amq.direct", type = ExchangeTypes.DIRECT),
    key = {"delete"}
))
// 处理删除的业务
public void directQueueListener02(String message){
    System.out.println("消费者02接收到direct.queue02的消息:" + message);
}

3、测试

运行生产者和消费者测试类
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型

3.3.Topics通配符

Topics通配符官方文档
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
Topics 类型的 Exchange 与 Direct 相比,都是可以根据 RoutingKey 把消息路由到不同的队列。

不同的是 Topic类型的 Exchange 可以让队列在绑定 Routingkey 的时候使用通配符

通配符规则:

  • #:匹配一个或多个单词

  • *:匹配一个单词

举例:

  • user.#:能够匹配 user.add 或者 user.detail.add

  • user.*:只能匹配 user.add

1、创建生产者测试类

@Test
public void testTopicExchange() {
    rabbitTemplate.convertAndSend("amq.topic", "user.add", "新增用户通知");
    rabbitTemplate.convertAndSend("amq.topic", "user.update", "更新户通知");
    rabbitTemplate.convertAndSend("amq.topic", "dept.add", "新增部门通知");
    rabbitTemplate.convertAndSend("amq.topic", "dept.update", "更新部门通知");
}

2、创建消费者测试类

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue01"),
    exchange = @Exchange(name = "amq.topic", type = ExchangeTypes.TOPIC),
    key = "user.*"
))
public void topicQueueListener01(String message){
    System.out.println("消费者01接收到topic.queue01的消息:" + message);
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue02"),
    exchange = @Exchange(name = "amq.topic", type = ExchangeTypes.TOPIC),
    key = "dept.*"
))
public void topicQueueListener02(String message){
    System.out.println("消费者02接收到topic.queue02的消息:" + message);
}

3、测试

运行生产者和消费者测试类
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型
中间件_RabbitMQ五种消息模型,微服务,java-rabbitmq,五种消息模型文章来源地址https://www.toymoban.com/news/detail-736175.html

到了这里,关于中间件_RabbitMQ五种消息模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 消息中间件之RabbitMQ

    1.基于AMQP协议Erlang语言开发的一款消息中间件,客户端语言支持比较多, 比如Python,Java,Ruby,PHP,JS,Swift.运维简单,灵活路由,但是性能不高, 可以满足一般场景下的业务需要,三高场景下吞吐量不高,消息持久化没有采取 零拷贝技术,消息堆积时,性能会下降 2.消息吞吐量在

    2024年01月19日
    浏览(74)
  • 消息中间件RabbitMQ详解

    消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中

    2024年02月16日
    浏览(36)
  • 中间件RabbitMQ消息队列介绍

    1.1 什么是 MQ MQ ( message queue ),从字面意思上看,本质是个队列, FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中, MQ 是一种非常常 见的上下游 逻辑解耦+物理解耦 的消息通信服务。使用了 MQ 之

    2024年02月13日
    浏览(47)
  • RabbitMQ:可靠消息传递的强大消息中间件

     消息中间件在现代分布式系统中起着关键作用,它们提供了一种可靠且高效的方法来进行异步通信和解耦。在这篇博客中,我们将重点介绍 RabbitMQ,一个广泛使用的开源消息中间件。我们将深入探讨 RabbitMQ 的特性、工作原理以及如何在应用程序中使用它来实现可靠的消息传

    2024年02月12日
    浏览(60)
  • 高性能消息中间件 RabbitMQ

    消息队列 MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的 异步通信 。 同步通信相当于两个人当面对话,你一言我一语。必须及时回复: 异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系。 消息

    2024年02月11日
    浏览(88)
  • 消息队列中间件(二)- RabbitMQ(一)

    接收,存储,转发消息 生产者 交换机 队列 消费者 简单模式 工作模式 发布 路由模式 主题模式 发布订阅模式 Broker 接收和分发消息的应用 Virtual host 虚拟分组 Connection: TCP连接 Channel: 节省连接,每次访问建立一次Connection消耗太大,所以使用信道代替连接 交换机 队列 www.r

    2024年02月11日
    浏览(44)
  • Springboot整合RabbitMQ消息中间件

    spring-boot-rabbitmq–消息中间件整合 前言:RabbitMQ的各种交换机说明 1、直连交换机 生产者发布消息时必须带着routing-key,队列绑定到交换机时必须指定binding-key ,且routing-key和binding-key必须完全相同,如此才能将消息路由到队列中 直连交换机通常用来循环分发任务给多个workers,

    2024年02月11日
    浏览(32)
  • 快速掌握MQ消息中间件rabbitmq

    Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denpendies. 需求: 1.video A https://www.bilibili.com/video/BV1cb4y1o7zz?p=12vd_source=533ee415c42b820b0f4105acb4932a02 参考资料 官方文档 开源社区 博客文

    2024年02月11日
    浏览(37)
  • Python学习(3)- 消息中间件rabbitmq

    消息队列中间件是分布式系统中重要的组件,主要解决 应用解耦 , 异步消息 , 流量削锋 等问题,实现高性能,高可用,可伸缩和最终一致性架构 rabbitmq 简单模式 生产者: 链接rabbitmq 创建队列 向指定的队列中插入数据 交换机模式 发布订阅模式 模式 模糊匹配模式

    2024年02月22日
    浏览(30)
  • 【消息中间件】1小时快速上手RabbitMQ

    前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:深入、全面、系统的介绍消息中间件 🌰 文章简介:本文将介绍RabbitMQ,一小时快速上手RabbitMQ 下面是MQ的优缺点 1.2.1 优点1:应用解耦 考虑由订单系统与库存系统、支付系统、物流

    2024年02月02日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包