看完RabbitMQ了的几种消息模型,我对RabbitMQ有了新的认识

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

前言:大家好,我是小威,24届毕业生,曾经在某央企公司实习,目前在某税务公司。前面已经记录了两种消息模型知识,因此本篇文章将记录和分享剩下的RabbitMQ几种消息模型相关知识点。
本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中的大佬🤩🤩。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,曾经在某央企公司实习,目前在某税务公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

以下正文开始

rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

FanoutExchange广播模型

Fanout Exchange 会将接收到的消息广播到每一个跟其绑定的queue。

Fanout Exchange不需要配置RoutingKey路由键,同时发布到FanoutExchange交换机上的消息都会被转发到与此交换机绑定的队列上。
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

以一个小例子来解释:首先在consumer消费者模块中,声明一个交换机(fanoutExchange)和两个队列(fanoutQueue1,fanoutQueue2),并将两个队列绑定到交换机上,同时添加相应的注解,交给spring容器管理bean。

在消费者模块,编写两个消费者方法,分别监听两个队列:

package cn.itcast.mq.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FanoutConfig {
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("xiaowei.fanout");// 新建交换机xiaowei.fanout
    }
    @Bean //使用bean注解,交给spring容器处理
    public Queue fanoutQueue1(){ //方法名为唯一id
        return new Queue("fanout.queue1");
    }
    @Bean
    //将队列1绑定到fanoutExchange交换机上
    public Binding fanoutBinding1(Queue fanoutQueue1,FanoutExchange fanoutExchange){
        return BindingBuilder
                .bind(fanoutQueue1)
                .to(fanoutExchange);
    }
    @Bean
    public Queue fanoutQueue2(){
        return new Queue("fanout.queue2");
    }
    @Bean
    //将队列2绑定到fanoutExchange交换机上
    public Binding fanoutBinding2(Queue fanoutQueue2,FanoutExchange fanoutExchange){
        return BindingBuilder
                .bind(fanoutQueue2)
                .to(fanoutExchange);
    }
}

编写代码完成后运行消费者模块,刷新RabbitMQ网页可看到两个队列已经生成:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列
查看fanoutExchange交换机详情,可以看到fanoutQueue1和fanoutQueue2哥俩已经与该交换机绑定了:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

接着在生产者模块中编写方法,向上面定义的交换机中发送消息:

    @Test
    public void testSendFanoutExchange(){
        String exchangeName="xiaowei.fanout";//上面定义的交换机名称
        String message="hello,evertone!";//发送的信息
        rabbitTemplate.convertAndSend(exchangeName,"",message);//中间变量为路由键,此时设置为空字符串
    }

运行测试方法,可以看到控制台打印的日志:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列
从上述结果可以看出,FanoutExchange交换机就像广播一样,不配置路由键,会将消息发送给所有与之绑定的消息队列上。

DirectExchange定向模型

对于FanoutExchange交换机,我们了解到,可以讲消息发送到每一个与之绑定的队列上。有的时候,虽然我们队列与交换机绑定到了一起,但是我们是不想其他队列接收到消息的。

因此我们此时需要用到路由键(RoutingKey),在生产者发送消息的时候,我们需要向指定RoutingKey,消息才会被发送到指定的队列上。
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

举个小栗子,下面是消费者consumer部分代码,定义两个队列(direct.queue1和direct.queue2)和一个交换机(xiaowei.direct),使用注解的方式使得两个队列绑定到交换机上,并且两者的RoutingKey有所不同。

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue1")
            ,exchange = @Exchange(name = "xiaowei.direct",type = ExchangeTypes.DIRECT)
            ,key = {"red","blue"} 
    ))  //direct.queue1的key为red和blue
    public void listenDirectQueue1(String msg){
        System.out.println("消费者1已经接收到direct.queue1的消息:[" + msg +  "]");
    }
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2")
            ,exchange = @Exchange(name = "xiaowei.direct",type = ExchangeTypes.DIRECT)
            ,key = {"red","yellow"}
    )) //direct.queue2的key为red和yellow
    public void listenDirectQueue2(String msg){
        System.out.println("消费者2已经接收到direct.queue2的消息:[" + msg +  "]");
    }

编写代码完成后,运行项目可以看到两个队列已经生成:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列
同时查看xiaowei.direct交换机,可以看到RoutingKey栏目中有与队列相对应的key:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

编写生产者的相关测试代码,声明交换机名称为“xiaowei.direct”,同时消息发送到路由键为“blue”的队列上面:

    @Test
    public void testSendDirectExchange(){
        String exchangeName="xiaowei.direct";
        String message="hello,blue!";
        rabbitTemplate.convertAndSend(exchangeName,"blue",message);//路由到key为blue的队列上面
    }

运行项目,可以看到控制台中,消费者1会接收到交换机发送来的消息,因为只有消费者1的RoutingKey为blue。
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列
将生产者的测试代码换成key为yellow时,由于队列2中有yellow的路由键,因此队列2可以接收到消息,如下图所示:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列
将生产者的测试代码换成key为red的情况,由于队列1和队列2都包含路由键key,因此队列1和队列2都能接收到消息。控制台输出结果如下图:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

TopicExchange主题模型

Topic 主题模式可以实现发布与订阅模式和Routing路由模式的功能,Topic在配置的时候可以使用通配符,比较灵活。

所有发送到TopicExchange交换机上面的消息都会被转发到与RoutingKey相关的队列上。

通配符的使用规则:
“#” 字符表示匹配0个或多个单词;
“*” 字符表示匹配一个单词

rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

首先还是在消费者中定义两队列(topic.queue1和topic.queue2)和一个交换机(xiaowei.topic),并通过注解的方式将队列绑定到交换机上,指定topic.queue1队列的key为“china.#”,表示可以匹配以china开头的key;指定topic.queue2队列的key为#.news,表示可以匹配以news为结尾的key。

举栗:

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name ="topic.queue1" ),
            exchange=@Exchange(name = "xiaowei.topic",type = ExchangeTypes.TOPIC),
            key = "china.#"
    ))
    public void listenTopicQueue1(String msg){
        System.out.println("消费者1已经接收到topic.queue2的消息:[" + msg +  "]");
    }
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue2"),
            exchange = @Exchange(name = "xiaowei.topic",type = ExchangeTypes.TOPIC),
            key = "#.news"
    ))
    public void listenTopicQueue2(String msg){
        System.out.println("消费者2已经接收到topic.queue2的消息:[" + msg +  "]");
    }

运行项目可以看到生成了上述的两队列:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列
查看xiaowei.topic交换机,可看到两队列的绑定情况以及路由情况:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列
编写生产者的测试模块:

    @Test
    public void testSendTopicExchange(){
        String exchangeName="xiaowei.topic";
        String message="祝诸佬们2023更上一层楼";
        rabbitTemplate.convertAndSend(exchangeName,"china.news",message);//两者都能匹配上
    }

运行项目可以看到控制台输出结果:
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

改变生产者测试模块代码得:

    @Test
    public void testSendTopicExchange(){
        String exchangeName="xiaowei.topic";
        String message="2023小威还要向诸佬学习呀";
        rabbitTemplate.convertAndSend(exchangeName,"china.strong",message);//只有以china为开头的队列1能匹配得上
    }

rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

本篇文章就先分享到这里了,后续会继续分享RabbitMQ其他更深入的知识,感谢大佬认真读完支持咯~
rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻
希望能和诸佬们一起努力,今后进入到心仪的公司
再次感谢各位小伙伴儿们的支持🤞

rabbitmq八种消息模型的区别,云原生系列--微服务,java-rabbitmq,rabbitmq,springcloud,消息队列文章来源地址https://www.toymoban.com/news/detail-791461.html

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

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

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

相关文章

  • 【STM32】STM32 CANFD外设的几种消息接收过滤模式

    在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。 STM32G47x芯片的CAN外设有如下几种接收消息过滤方法: 这是一种范

    2024年01月18日
    浏览(36)
  • 面试必问:RabbitMQ 有哪几种消息模式?

    原文:juejin.cn/post/6998363970037874724 Rabbitmq 是使用 Erlang 语言开发的开源消息队列系统,基于 AMQP 实现,是一种应用程序对应用程序的通信方法,应用程序通过读写出入队列的消息来通信,而无需专用连接来链接它们。消息传递指的是应用程序之间通过在消息中发送数据进行通信

    2024年02月06日
    浏览(54)
  • PyTorch框架训练的几种模型区别

    在PyTorch中,.pt、.pth和.pth.tar都是用于保存训练好的模型的文件格式,它们之间的主要区别如下: .pt文件是PyTorch 1.6及以上版本中引入的新的模型文件格式,它可以保存整个PyTorch模型,包括模型结构、模型参数以及优化器状态等信息。.pt文件是一个二进制文件,可以通过torc

    2023年04月08日
    浏览(35)
  • 游戏中模型动画的几种实现方式

    游戏内动画的实现方式一般有这几种: 骨骼动画 顶点动画 材质动画 CPU蒙皮动画 骨骼动画是一种基于骨骼系统的动画技术,它通过对骨骼进行变换来控制模型的姿态和动作。 在骨骼动画中,模型通常被分解成多个部分,每个部分都与一个或多个骨骼相连,通过对骨骼进行旋

    2024年02月05日
    浏览(64)
  • 私有部署类chatGPT大语言模型的几种方案

    ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于  General Language Model (GLM)  架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行

    2024年02月02日
    浏览(52)
  • RabbitMq消息模型-队列消息

    基本模型(SimpleQueue)、工作模型(WorkQueue) 队列消息特点: 消息不会丢失 并且 有先进先出的顺序。 消息接收是有顺序的,不是随机的,仅有一个消费者能拿到数据,而且不同消费者拿不到同一份数据。 基本模型: SimpleQueue 在上图的模型中,有以下几个概念: P:为生产

    2024年02月09日
    浏览(49)
  • 在微信小程序部署AI模型的几种方法

    本文只是分享思路,不提供可完整运行的项目代码 以目标检测类模型为例,该类模型会输出 类别信息 , 置信度 , 包含检测框的4个坐标信息 但不是所有的onnx模型都能在微信小程序部署,有些算子不支持,这种情况需要点特殊操作。 微信小程序提供的接口相当于使用onnxr

    2024年04月27日
    浏览(61)
  • RabbitMQ--消息模型

    可参考RabbitMQ官网:RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ 简单队列模式的模型图: 官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色: publisher:消息发布者,将消息发送到队列queue queue:消息队列,负责接受并缓存消息 consumer:订阅队列,

    2024年01月24日
    浏览(42)
  • RabbitMQ---基本消息模型

    官方介绍: RabbitMQ是一个消息代理:它接受和转发消息。 你可以把它想象成一个邮局:当你把邮件放在邮箱里时,你可以确定邮差先生最终会把邮件发送给你的收件人。 在这个比喻中,RabbitMQ是邮政信箱,邮局和邮递员。 RabbitMQ与邮局的主要区别是它不处理纸张,而是接受,

    2024年02月11日
    浏览(42)
  • RabbitMQ-消息模型

    MQ全称是Message Queue,即消息对列!消息队列是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。

    2023年04月20日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包