RabbitMq&常见问题&介绍&架构&集群搭建

RabbitMq介绍

使用RabbitMq和不使用RabbitMq的区别

  • 分布式通信方式:直接远程调用或者通过中间件完成间接通信

  • 使用中间件:消息发送方称为生产者,消息接收方称为消费者。

  • 图解:

使用RabbitMq有点和缺点

  • 优点: 3点
    • 应用解耦 : 将系统由原来的高耦合变为低耦合
    • 异步提速: 调用者发送请求之后不需要等待,可以异步调用

不使用mq:

使用mq:

* 削峰填谷 什么是削峰填谷呢?

图解1:
复制代码

如果还是不明白削峰填谷还有第二张图解:

图解2:

  • 劣势

    • 系统可用性降低 : 系统稳定性差,如果mq宕机,就会对业务造成致命性的打击, 一般不会宕机因为要搭建集群,在一个就是RabbitMq也比较成熟了

    • 系统负载性提高 原有方式直接调用,现在需要通过mq来进行交互。

    • 数据一致性问题:

      消息重复

      消息丢失

      消息消费失败

    MQ常见产品

  • ActiveMQ:使用java开发,古老的产品,现在一般不使用,属于Apache

  • RabbitMQ:使用erlang语言开发,现在流行的mq产品,属于Rabbit

  • RockerMQ:使用java开发,脱胎于kafka,所以吞吐量在同类产品中占据优势,属于阿里。

    • mq中的消息阅读完直接销毁
  • Kafka:一般用户大数据环境,属于Apache

    • kafka中的消息是阅读完不会进行销毁,他有一个失效期

RabbitMq架构

执行流程

  • 1:生产者与mq建立连接(TCP,类似于线程池)通过连接中的通道发送消息至mq的交换机(交换机不具备存储消息的功能),交换机将消息路由到对应的队列中.
  • 2:消费者也是通过连接中的通道进行监听队列,拉取消息,完成消费
- 交换机不具备存储消息功能
- 队列完成消息的存储
- 交换机和队列都是属于v-host,mq默认v-host是 / ,作用: v-host  配合 用户 完成了权限控制. (这样使用的比较少)
复制代码

控制台简单介绍

控制台的默认端口是: 15672
默认的账号&密码: guest
复制代码

Rabbitmq五种发送消息的模式

官方介绍: https://www.rabbitmq.com/getstarted.html 
复制代码
  • 1: 简单模式
    • 代码

yml 配置:
spring:
  application:
    name: spring-rabbitmq
  rabbitmq:
    host: 192.168.200.132
    port: 5672
    password: guest
    virtual-host: /
    username: guest
    
通过代码的方式创建队列: 
@Configuration
public class QueueBean {
    /**
     * @program: day10
     * @description:
     * @author: Mr.Li
     * @create: 2020-07-26 19:21
     **/
//    创建队列
    @Bean
    public Queue queue() {
        return new Queue("li_xian_sheng");
    }
}

创建生产者: 
@RestController
public class ProducerController {

    /**
     * @program: day10
     * @description:
     * @author: Mr.Li
     * @create: 2020-07-26 19:24
     **/
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @GetMapping("/sendMsg/{msg}")
    public void sendMsg(@PathVariable String msg){
        rabbitTemplate.convertAndSend("li_xian_sheng", msg);
    }

}

消费者: 
@Component
@RabbitListener(queues = "li_xian_sheng")  //  设置监听的队列
public class ConsumerListener {

    /**
     * @program: day10
     * @description:
     * @author: Mr.Li
     * @create: 2020-07-26 19:27
     **/
    @RabbitHandler // 转换
    public void receiveMsg(String msg) {
        System.out.println("执行了: " + msg);
    }
RabbitHandler:作用是将接受到的数据格式进行一个转换

}
注意:  如果想要从队列中获取数据, 消费者的参数必须和生产者的参数一致
特点:  - 只有一个消费者,消息阅后即焚
       - 使用交换机是默认交换机

复制代码
  • 2: 工作队列模式(work queue 多个消费者去监听一个队列)
工作队列模式特点:

- 在消费者之间进行轮训
- 消费者之间是竞争关系,消息阅后即焚
- 使用的交换机是默认交换机
复制代码
  • 3:发布订阅模式

      需要自己手动创建交换机,并绑定队列(可以绑定多个)
    复制代码

* fanout exchange(广播类型交换机)
复制代码

示意图:

消费者发送请求到交换机,交换机会将消息路由到 a and b 消费者完成消费

fanout模式特点:

- 需要手动创建交换机
- 需要完成交换机与队列的绑定
- 只要与交换机完成绑定的队列都可以接收到消息
复制代码
  • direct exchange(Routing key--->点对点)
    需要手动绑定路由
direct模式总结:

- 需要手动创建交换机
- 需要完成交换机与队列的绑定,需要指定routing key
- 只有满足与生产者发送方routing key相符的消息才可以从交换机路由至队列
复制代码
  • topic exchange(主题模式)

topic模式总结:

- '*' 号匹配不多不少只有一个词
- '#'号匹配大于等于0个词
如果不满足路由键,消息会丢失因为交换机不能存储数据
复制代码

猜你喜欢

转载自juejin.im/post/5f1d49a76fb9a07eb57d3c25