RabbitMQ常用Exchange详解

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

目录

1.Exchange 介绍

1.2 路由键(RoutingKey)

1.3 绑定键(BindingKey)

 2. 直连交换机:Direct exchange

3. 主题交换机:Topic

4. 扇形交换机:Fanout exchange


 

1.Exchange 介绍

在RabbitMQ中,生产者发送消息不会直接将消息投递到队列中,而是先将消息投递到交换机中,在由交换机转发到具体的队列,队列再将消息以推送或者拉取方式给消费者进行消费

RabbitMQ常用Exchange详解

1.2 路由键(RoutingKey)

生产者将消息发送给交换机的时候,会指定RoutingKey指定路由规则。

1.3 绑定键(BindingKey)

通过绑定键将交换机与队列关联起来,这样RabbitMQ就知道如何正确消息路由到队列。

小结:

生产者将消息发送给哪个E ×change是需要由RoutingKey决定的,生产者需要将E× change与哪个队列绑定时需要由BindingKey决定的

 2. 直连交换机:Direct exchange

直连交换机的路由算法非常简单:将消息准送到binding key与该消息的routing key相同的队列

RabbitMQ常用Exchange详解

直连交换机x上绑定了两个队列。第一个队列绑定了绑定键orange,第二个队列有两个绑定踺:black和greeno在这种场景下,一个消息在指定了路由键为orange将会只被路由到队列QI,路由键为black和greeno的消息都将被路由到队列 Q2。其他的消息都将被丢失。

示例:文章来源地址https://www.toymoban.com/news/detail-400042.html

  • provider
package com.wyy.provider;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DirectQueueConfig {

    /**
     * 创建直连交换机队列
     * @return
     */
    @Bean
    public Queue directQueue(){
        return new Queue("DirectQueue",true);
    }

    /**
     * 创建直连交换机
     * @return
     */
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("directExchange");
    }

    /**
     * 进行队列与交换机绑定
     * @return
     */
    @Bean
    public Binding directBindingA(){
        return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct");
    }
}
package com.wyy.provider.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DirectController {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @RequestMapping("/senderDirect/{msg}")
    public Object senderDirect( @PathVariable String msg){
        rabbitTemplate.convertAndSend("directExchange",msg,"??????");
        return "yes";
    }
}
  •  consumer
package com.wyy.consumer.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RabbitListener(queues = "DirectQueue")
public class DirectController {

    @RabbitHandler
    public void process(String msg){
        log.warn("DirectQueue接受:"+msg);
    }
}

3. 主题交换机:Topic

发送到主题交换机的消息不能有任意的routing key,必须是由点号分开的一串单词,这些单词可以是任意的,但通常是与消息相关的一些特

比如以下是几个有效的routing key: "stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit",routing key的单词可以有很多,最大限制是 255 byteso

Topic交换机的逻辑与direct交换机有点相似,使用特定路由踺发送的消息将被发送到所有使用匹配绑定键绑定的队列,然而,绑定键有两个特殊的情况:

  •  *  表示匹配任意一个单词
  • #  表示匹配任意一个或多个单词

RabbitMQ常用Exchange详解

示例:

  • provider
package com.wyy.provider;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TopicQueueConfig {
    public static String KEY_A ="*.wyy.*";
    public static String KEY_B ="*.*.wyy";
    public static String KEY_C ="wyy.#";

    /**
     * 创建主题交换机队列
     * @return
     */
    @Bean
    public Queue topicQueue(){
        return new Queue("TopicQueue",true);
    }

    /**
     * 创建主题交换机
     * @return
     */
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("topicExchange");
    }

    /**
     * 进行队列与交换机绑定1
     * @return
     */
    @Bean
    public Binding topicBindingA(){
        return BindingBuilder.bind(topicQueue()).to(topicExchange()).with(KEY_A);
    }

    /**
     * 进行队列与交换机绑定2
     * @return
     */
    @Bean
    public Binding topicBindingB(){
        return BindingBuilder.bind(topicQueue()).to(topicExchange()).with(KEY_B);
    }

    /**
     * 进行队列与交换机绑定3
     * @return
     */
    @Bean
    public Binding topicBindingC(){
        return BindingBuilder.bind(topicQueue()).to(topicExchange()).with(KEY_C);
    }
}
package com.wyy.provider.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TopicController {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @RequestMapping("/senderTopic/{msg}")
    public Object senderDirect( @PathVariable String msg){
        rabbitTemplate.convertAndSend("topicExchange",msg,"~~~~~~~");
        return "yes";
    }
}
  • consumer
package com.wyy.consumer.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RabbitListener(queues = "TopicQueue")
public class TopicController {

    @RabbitHandler
    public void process(String msg){
        log.warn("TopicQueue接受:"+msg);
    }
}

4. 扇形交换机:Fanout exchange

扇形交换机是最基本的交换机类型,它所能做的事清非常简单广播消息。

扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要''思考",所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的。

RabbitMQ常用Exchange详解

示例:

  • provider
package com.wyy.provider;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutQueueConfig {

    /**
     * 创建扇形交换机队列
     * @return
     */
    @Bean
    public Queue fanoutQueue(){
        return new Queue("fanoutQueue",true);
    }

    /**
     * 创建扇形交换机
     * @return
     */
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanoutExchange");
    }

    /**
     * 进行队列与交换机绑定
     * @return
     */
    @Bean
    public Binding fanoutBindingA(){
        return BindingBuilder.bind(fanoutQueue()).to(fanoutExchange());
    }
}
package com.wyy.provider.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FanoutController {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @RequestMapping("/senderFanout")
    public Object senderFanout(){
        rabbitTemplate.convertAndSend("fanoutExchange",null,"#######");
        return "yes";
    }
}
  •  consumer
package com.wyy.consumer.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RabbitListener(queues = "fanoutQueue")
public class FanoutController {

    @RabbitHandler
    public void process(String msg){
        log.warn("fanoutQueue接受:"+msg);
    }
}

到了这里,关于RabbitMQ常用Exchange详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • linux常用命令介绍 06 篇——Linux查看目录层级结构以及创建不同情况的层级目录

    Linux命令01篇——Linux解压缩文件常用命令. Linux命令02篇——linux日常常用命令介绍. linux常用命令介绍 03 篇——常用的文本处理工具之grep和cut(以及部分正则使用). linux常用命令介绍 04 篇——uniq命令使用介绍(Linux重复数据的统计处理). linux常用命令介绍 05 篇——实际应用

    2024年02月12日
    浏览(48)
  • Rabbitmq的Federation Exchange

    (broker 北京 ) , (broker 深圳 ) 彼此之间相距甚远,网络延迟是一个不得不面对的问题。有一个在北京的业务(Client 北京 ) 需要连接 (broker 北京 ) ,向其中的交换器 exchangeA 发送消息,此时的网络延迟很小,(Client 北京 ) 可以迅速将消息发送至 exchangeA 中,就算在开启了 publisherc

    2024年02月11日
    浏览(38)
  • rabbitmq第三课-RabbitMQ高级功能详解以及常用插件实战

    实际上是可以选择三种队列类型的,classic经典队列,Quorum仲裁队列,Stream流式队列。 后面这两种队列也是RabbitMQ在最近的几个大的版本中推出的新的队列类型。3.8.x推出了Quorum仲裁队列,3.9.x推出了Stream流式队列。这些新的队列类型都是RabbitMQ针对现代新的业务场景做出的大的

    2024年02月10日
    浏览(92)
  • Docker中为RabbitMQ安装rabbitmq_delayed_message_exchange插件

    rabbitmq_delayed_message_exchange是一款向RabbitMQ添加延迟消息传递(或计划消息传递)的插件。 插件下载地址:https://www.rabbitmq.com/community-plugins.html 欢迎访问我的个人博客:https://wk-blog.vip 首先需要确定我们当前使用的RabbitMQ的版本,我们可以直接登录Web端的管理界面查看版本 也可

    2024年02月10日
    浏览(54)
  • rabbitMQ:绑定Exchange发送和接收消息(direct)

    AMQP 协议中的核心思想就是生产者和消费者的解耦,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息 发送到一个交换机。先由 Exchange 来接收,然后 Exchange 按照特定的策略转发到 Queue 进行存储。Exchange 就类似于一个交换机,

    2024年02月15日
    浏览(35)
  • Docker中为RabbitMQ安装rabbitmq_delayed_message_exchange延迟队列插件

    1、前言 rabbitmq_delayed_message_exchange是一款向RabbitMQ添加延迟消息传递(或计划消息传递)的插件。 插件下载地址:https://www.rabbitmq.com/community-plugins.html 1、下载插件 首先需要确定我们当前使用的RabbitMQ的版本,我们可以直接登录Web端的管理界面查看版本   也可以在RabbitMQ容器中

    2024年02月12日
    浏览(46)
  • 工具篇--4.1RabbitMq--常用配置参数详解

    前言: 在使用Rabbitmq 过程中,每次配置参数都需要进行搜索和回忆,本文对rabbitmq 中常用的配置成参数进行列举并解释; 这里先粘下比较常用的参数及其简单注注释,更为详细的注释可以在文章中后面的部分进行解读: 参数分类介绍: 1 基础参数: 客户端连接mq 服务端必要

    2024年02月12日
    浏览(46)
  • RabbitMQ系列(27)--RabbitMQ使用Federation Exchange(联邦交换机)解决异地访问延迟问题

    前言: (broker北京)、(broker深圳)彼此之间相距甚远,网络延迟是一个不得不面对的问题。有一个在北京的业务(Client北京)需要连接(broker北京),向其中的交换器exchangeA发送消息,此时的网络延迟很小,(Client北京)可以迅速将消息发送至exchangeA 中,就算在开启了publisherconfirm机制或

    2024年02月13日
    浏览(66)
  • RabbitMq:Topic exchange(主题交换机)的理解和使用

    在RabbitMq中,生产者的消息都是通过交换机来接收,然后再从交换机分发到不同的队列中去,在分发的过程中交换机类型会影响分发的逻辑,下面主要讲解一下主题交换机。 ​ 主题交换机核心是可以以范围的行为向队列发送消息,它和直连交换机区别在于,直连交换机一个队

    2024年02月12日
    浏览(34)
  • RabbitMQ之Exchange(交换机)属性及备用交换机解读

    目录 基本介绍 主要结论 备用交换机  springboot代码实战(备用交换机) 实战架构 工程概述 RabbitConfigDeal 配置类:创建队列及交换机并进行绑定  MessageService业务类:发送消息及接收消息 主启动类RabbitMq01Application:实现ApplicationRunner接口 在 RabbitMQ 中,交换机主要用来将生产

    2024年02月02日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包