RabbitMq的work&topic&fanout模式

简介: RabbitMq的work&topic&fanout模式

一、rabbitMq应用场景


1、异步处理:传统的注册成功,注册写入数据库,在发送邮箱,在发送短信,则返回注册成功,利用rabbitmq异步处理,直接写入数据库后返回注册成功,之后再去rabbitmq消费发送邮箱和短信。

2、双11狂欢节,传统做法应用解耦:订单系统访问库存系统,这种做法有缺点,库存系统出现故障,订单会丢失,可以采用rabbitmq,订单系统下单成功,写入rabbitmq返回下单成功,订阅模式,库存系统去rabbitmq消费。

3、流量削峰,秒杀活动中,人流量太大,存入rabbitmq:可以控制人数,订单超过值,直接丢弃,秒杀失败,缓解短时间流量太大压垮应用。


二、rabbitMq代码实例


首先引入maven包,集成springboot在代码配置文件加上:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
# ----- RabbitMq -------- #
spring.rabbitmq.virtual-host=/
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin

work模式(多对多使用):

@Component
public class RabbitQuestConfig {
    @Bean
    public Queue create(){
        return new Queue("work");
    }
}

接口里写上:

 

@RequestMapping("/work")
    public void work() {
        String str = "work";
        for (int i = 0; i < 100; i++) {
            rabbitTemplate.convertAndSend("work", str);
        }
    }
@Component
@Slf4j
public class ConsumerRabbitMq {
    @Resource
    private RabbitMqMapper rabbitMqMapper;
    @RabbitListener(queues = "work")
    public void test(String message) {
        System.out.println("work消费成功1:" + message);
    }
    @RabbitListener(queues = "work")
    public void test2(String message) {
        System.out.println("work消费成功2:" + message);
    }
}

Topic Exchage(主题订阅)

topic 是RabbitMQ中最灵活的一种方式,可以根据routing_key自由的绑定不同的队列

 

@Configuration
public class TopicRabbitConfig {
    final static String message = "topic_message";
    final static String messages = "topic_messages";
    @Bean
    public Queue topicMessage() {
        return new Queue(TopicRabbitConfig.message);
    }
    @Bean
    public Queue topicMessages() {
        return new Queue(TopicRabbitConfig.messages);
    }
    /**
     * 声明topic交换机
     *
     * @return
     */
    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("topicExchange");
    }
    /**
     * 绑定queue交换机 
     * 只能消费message
     */
    @Bean
    Binding bindExchangeMessage(Queue topicMessage, TopicExchange topicExchange) {
        return BindingBuilder.bind(topicMessage).to(topicExchange).with("topic.message");
    }
    /**
     * 绑定queue交换机
     * 全部都可以消费,包含message,messages
     */
    @Bean
    Binding bindExchangeMessages(Queue topicMessages, TopicExchange topicExchange) {
        return BindingBuilder.bind(topicMessages).to(topicExchange).with("topic.#");
    }
}@Configuration
public class TopicRabbitConfig {
    final static String message = "topic_message";
    final static String messages = "topic_messages";
    @Bean
    public Queue topicMessage() {
        return new Queue(TopicRabbitConfig.message);
    }
    @Bean
    public Queue topicMessages() {
        return new Queue(TopicRabbitConfig.messages);
    }
    /**
     * 声明topic交换机
     *
     * @return
     */
    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("topicExchange");
    }
    /**
     * 绑定queue交换机 
     * 只能消费message
     */
    @Bean
    Binding bindExchangeMessage(Queue topicMessage, TopicExchange topicExchange) {
        return BindingBuilder.bind(topicMessage).to(topicExchange).with("topic.message");
    }
    /**
     * 绑定queue交换机
     * 全部都可以消费,包含message,messages
     */
    @Bean
    Binding bindExchangeMessages(Queue topicMessages, TopicExchange topicExchange) {
        return BindingBuilder.bind(topicMessages).to(topicExchange).with("topic.#");
    }
}
/**
     * topic
     */
    @RequestMapping("/topic")
    public void topic() {
        for (int i = 0; i < 50; i++) {
            String topicMessage1 = "topicMessage1";
            rabbitTemplate.convertAndSend("topicExchange", "topic.message", topicMessage1);
            String topicMessage2 = "2topicMessage2";
            rabbitTemplate.convertAndSend("topicExchange", "topic.messages", topicMessage2);
        }
    }
//消费者:
@RabbitListener(queues = "topic_message")
    public void topicMessage1(String message) {
        System.out.println("topicMessage 消费成功只能消费 topicMessage1:" + message);
    }
    /**
     * topic
     */
    @RabbitListener(queues = "topic_messages")
    public void topicMessage2(String message) {
        System.out.println("topicMessages 消费 topicMessage1 & topicMessage2:" + message);
    }

Fanout Exchange(广播模式):


@Configuration
public class FanoutRabbitConfig {
   @Bean
    public Queue aMessage(){
       return new Queue("a_message");
   }
    @Bean
    public Queue bMessage(){
        return new Queue("b_message");
    }
    @Bean
    FanoutExchange fanoutExchange(){
       return new FanoutExchange("fanoutExchange");
    }
    @Bean
    Binding bindingExchangeA(Queue aMessage,FanoutExchange fanoutExchange){
       return BindingBuilder.bind(aMessage).to(fanoutExchange);
    }
    @Bean
    Binding bindingExchangeB(Queue bMessage,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(bMessage).to(fanoutExchange);
    }
}

生产者和消费者

/**
     * fanoutExchange
     */
    @RequestMapping("/fanout")
    public void fanout() {
        String fanout = "fanout";
        rabbitTemplate.convertAndSend("fanoutExchange", "", fanout);
    }
    /**
     * fanout
     */
    @RabbitListener(queues = {"a_message"})
    public void fanoutA(String message) {
        System.out.println("fanout广播消费:" + message);
    }
    @RabbitListener(queues = {"b_message"})
    public void fanoutB(String message) {
        System.out.println("fanout广播消费:" + message);
    }

(完...)

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件
RabbitMQ消息模型之Work Queues
RabbitMQ消息模型之Work Queues
155 1
RabbitMQ消息模型之Work Queues
|
消息中间件 RocketMQ
RocketMQ报错:MQClientException:no route info of this topic的解决
RocketMQ报错:MQClientException:no route info of this topic的解决
771 0
|
消息中间件 Java Spring
SpringBoot实现RabbitMQ的广播交换机(SpringAMQP 实现Fanout广播交换机)
SpringBoot实现RabbitMQ的广播交换机(SpringAMQP 实现Fanout广播交换机)
342 2
|
消息中间件 Kubernetes RocketMQ
消息队列 MQ产品使用合集之topic是怎么选择分布在哪里brocker上面的
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
消息中间件 存储 Java
【RabbitMQ】-SpringAMQP以及Work模型
RabbitMQ的工作模型通过消息队列和消费者的并行处理,极大地提高了任务处理的效率。通过Spring AMQP可以方便地与RabbitMQ进行交互,实现高效的消息传递和任务处理。本文详细介绍了如何配置和使用Spring AMQP来实现RabbitMQ的工作模型,包括生产者、消费者的定义以及消息的发送和接收过程。
275 14
|
消息中间件 存储 缓存
RabbitMQ:交换机详解(Fanout交换机、Direct交换机、Topic交换机)
RabbitMQ:交换机详解(Fanout交换机、Direct交换机、Topic交换机)
1598 7
RabbitMQ:交换机详解(Fanout交换机、Direct交换机、Topic交换机)
|
消息中间件 负载均衡 算法
聊聊 RocketMQ中 Topic,Queue,Consumer,Consumer Group的关系
本文详细解析了RocketMQ中Topic、Queue、Consumer及Consumer Group之间的关系。文中通过图表展示了Topic可包含多个Queue,Queue分布在不同Broker上;Consumer组内多个消费者共享消息;并深入探讨了集群消费与广播消费模式下Queue与Consumer的关系,以及Rebalancing机制在实例增减时如何确保负载均衡。理解这些关系有助于更好地掌握RocketMQ的工作原理,提升系统运维效率。
3223 2
|
消息中间件 开发者
【RabbitMQ深度解析】Topic交换器与模式匹配:掌握消息路由的艺术!
【8月更文挑战第24天】在消息队列(MQ)体系中,交换器作为核心组件之一负责消息路由。特别是`topic`类型的交换器,它通过模式匹配实现消息的精准分发,适用于发布-订阅模式。不同于直接交换器和扇形交换器,`topic`交换器支持更复杂的路由策略,通过带有通配符(如 * 和 #)的模式字符串来定义队列与交换器间的绑定关系。
447 2
|
消息中间件 测试技术 Apache
消息队列 MQ产品使用合集之在测试环境中拥有大量的topic会有什么影响
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
325 1
|
消息中间件 存储 Java
消息队列 MQ使用问题之如何将RocketMQ中某个集群的topic迁移到另一个集群
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。