RabbitMQ (一)--基本概念及简单使用

 

消息中间件:MQ

mq作用

1.异步

生产者把消息放入mq后,可以继续去生产其他的消息,不用等着消费者消费。

2.解耦

各个服务之间解耦,减少服务依赖,提高稳定性。而且一个生产者生产的消息可以由多个消费者消费。

3.削峰填谷

非核心业务如:积分服务等在高峰期时放入消息队列,服务器空闲时再消费。提高吞吐

mq优缺点

使用mq对我们的系统有以上各种好处,但是加入任何的中间件对系统也是有他的缺点。

缺点:

降低系统可用性,系统加入了mq,如果mq宕机那么系统肯定就会不可用。

系统复杂性提高,异步调用链路增加,还要考虑mq丢失,幂等,顺序等等问题

消息一致性问题,a系统发送消息,到b,c系统处理,b系统成功,c系统失败

有优点,有缺点,所以说我们在选择中间件的时候,需要根据业务实际情况进行选择。下面给出一个常用mq的对比

关于mq的理论知识先简单介绍下,至于常见的比如消息幂等,顺序,及消息高可用每个中间件有不同的处理方式,就不挨个说了,后面写到的话就稍微说明下。接下来我们直接进入使用,安装步骤请自行百度了

MQ简单使用

本文采用spring boot+rabbit mq来学习,就不演示单纯用管理界面使用rabbit了

1.新建一个spring boot项目,并加入rabbit mq依赖

<!-- rabbit -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>2.6.6</version>
        </dependency>

2.配置mq

# rabbitMq 相关配置
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: /
    username: guest
    password: ZLbleak7474

3.订阅发布模式配置

4.新建一个controller用来发送消息

package com.rabbit.controller;

import com.rabbit.config.FanoutExchangeConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping(value = "send")
public class ProducerController {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @GetMapping("fanout-exchange")
    public void sendExchange(){
        String msg = "hello rabbit";
        rabbitTemplate.convertAndSend(FanoutExchangeConfig.FANOUT_EXCHANGE, null, msg);
    }
}

现在就可以启动访问发送消息了,发送了以后也可以登录管理界面查看

5.新建消费者消费消息

package com.rabbit.config;

import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @ClassName ConsumerDemo
 * @Description 消费者模拟
 * @Author andy
 * @Date 2022/7/16 17:09
 * @Version 1.0
 */
@Component
public class ConsumerDemo {

    Logger log = LoggerFactory.getLogger(ConsumerDemo.class);

    /**
     * 监听消息队列,记得注解里面用常量,否则报错
     */
    @RabbitListener(queues = FanoutExchangeConfig.QUEUE_ONE)
    public void listenerOne(String msg, Channel channel, Message message){
        log.info("接收到队列one的消息:"+msg);
    }
    @RabbitListener(queues = FanoutExchangeConfig.QUEUE_TWO)
    public void listenerTwo(String msg, Channel channel, Message message){
        log.info("接收到队列two的消息:"+msg);
    }

}

注意一个点,如果最开始还没有发送消息,也没有去控制台新建交换器队列等内容,不要把消费者一起启动,不然就找不到定义的消息。

本章主要先了解一下rabbit的简单使用,下次会介绍其他交换器,以及消息等等。

经验分享 程序员 微信小程序 职场和发展