mq队列模型:
    Basic Queue 简单队列模式 使用默认交换机
    work Queue 工作队列模式 使用默认交换机
    发布/订阅 模式
    fanout: 广播 每个交换机的队列都会收到消息
    Direct:路由 使用 指定的key 指定交换机的队列会收到消息
    Topic: 话题 话题 用 ”.“ 链接 通配符 # 多个 * 一个 符合统配条件的交换机队列会收到消息

    交换机的作用:

    • 接收publisher发送的消息
    • 将消息按照规则路由到与之绑定的队列
    • 不能缓存消息,路由失败,消息丢失
    • FanoutExchange的会将消息路由到每个绑定的队列

    mq的优势

    • 吞吐量提升:无需等待订阅者处理完成,响应更快速
    • 故障隔离:服务没有直接调用,不存在级联失败问题
    • 调用间没有阻塞,不会造成无效的资源占用
    • 耦合度极低,每个服务都可以灵活插拔,可替换
    • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

    声明队列、交换机、绑定关系的Bean是什么?

    • Queue 队列
    • FanoutExchange 交换机
    • Binding 绑定队列和交换机关系

    fanout 广播模式下 消息队列发送方式

    1. 可以有多个队列
    2. 每个队列都要绑定到Exchenge(交换机)
    3. 生产者发送消息,只能发送到交换机,交换机决定发送到那个队列,生产者无法决定
    4. 交换机把消息发送给绑定过的 所有队列
    5. 订阅队列的消费者都能收到消息

    Direct 模式下消息队列发送方式

    1. 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
    2. 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey
    3. Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的Routing key`完全一致,才会接收到消息

    Topic模式下消息队列发送方式

    1. Topic类型的ExchangeDirect相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key` 的时候使用通配符!

    Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert

    1. 通配符规则:
      #:匹配一个或多个词
      *:匹配不多不少恰好1个词
      image-20210717170705380.png

    springAMQP
    发送消息 和 接收消息代码
    1 .引入 spring-amqp 依赖 2 . 注入RabitTemplate 3 编写逻辑,绑定队列 发送消息

    1. 配置文件
    2. spring:
    3. rabbitmq:
    4. host: 192.168.200.130 # 主机名
    5. port: 5672 # 端口
    6. virtual-host: / # 虚拟主机
    7. username: root # 用户名
    8. password: root # 密码
    9. listener:
    10. simple:
    11. prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息
    12. //发送消息
    13. @Autowired
    14. private RabbitTemplate rabbitTemplate;
    15. public void testFanoutExchange() {
    16. // 队列名称
    17. String exchangeName = "itcast.fanout";
    18. // 消息
    19. String message = "hello, everyone!";
    20. //中间冒号声明队列绑定交换机的 key 不写默认都可以收到
    21. rabbitTemplate.convertAndSend(exchangeName, "", message);
    22. }
    23. //接收消息
    24. @RabbitListener(queues = "fanout.queue1")
    25. public void listenFanoutQueue1(String msg) {
    26. System.out.println("消费者1接收到Fanout消息:【" + msg + "】");
    27. }

    发布订阅模式

    基于@Bean 的声明队列和交换机
    需要绑定 交换机和消息队列
    fanout 广播 创建队列和创建交换机方式

    1. //创建交换机
    2. @Bean
    3. public FanoutExchange fanoutExchange(){
    4. return new FanoutExchange("itcast.fanout");
    5. }
    6. /**
    7. * 第1个队列 这个是创建队列
    8. */
    9. @Bean
    10. public Queue fanoutQueue1(){
    11. return new Queue("fanout.queue1");
    12. }
    13. /**
    14. * 绑定队列和交换机
    15. */
    16. @Bean
    17. public Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange){
    18. return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    19. }

    基于注解声明队列和交换机

    1. @RabbitListener(bindings = @QueueBinding(
    2. //队列名称
    3. value = @Queue(name = "direct.queue1"),
    4. //交换机名称
    5. exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
    6. key = {"red", "blue"}
    7. ))
    8. public void listenDirectQueue1(String msg){
    9. System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
    10. }