day04 RabbitMQ消息队列基本使用

  • Distributed
  • Distributed
约 1464 字

介绍

  • RabbitMQ 是一个开源的、高度可靠的、基于 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)协议实现的消息中间件。它可以用于构建高效、可靠的分布式应用程序,支持消息的路由、持久化、发布与订阅、事务等功能。
  • RabbitMQ 采用分布式架构,消息的生产者(producer)通过将消息发送到 RabbitMQ 的 Exchange(交换器),Exchange 再将消息路由到一个或多个队列(queue)中。消息的消费者(consumer)从队列中取出消息并进行处理。在 RabbitMQ 中,消息发送者和消息接收者之间是解耦的,它们不需要知道彼此的存在,也不需要关注消息是如何被处理的,这使得系统变得更加灵活和可扩展。

image.pngimage.png

同步通讯和异步通讯

  • 同步通讯和异步通讯是在计算机系统中常见的两种通讯方式。
    • 同步通讯:指的是在发送和接收消息或数据时,发送方和接收方需要进行协同,必须在一个确定的时间点上进行通讯,只有在对方做出响应后才能进行下一步操作。在这种通讯方式下,发送方需要等待接收方响应后才能继续执行,而接收方则需要在接收到消息后立即进行处理并响应,否则会导致发送方一直处于等待状态。同步通讯通常会造成阻塞,如果接收方处理时间过长,就会影响整个系统的性能和响应速度。
      • 优点:
        • 时效性较强,可以立即得到结果
      • 缺点:
        • 耦合度高:每次加入新的需求,都需要修改代码
        • 性能和吞吐能力下降:生产者需要等待消费者的响应
        • 有额外的资源消耗:生产者等待时不能做其他指令,性能浪费
        • 有级联失败问题:消费者出现问题,生产者也会出现问题
    • 异步通讯(rabbitmq 就是基于此技术):则是指在发送和接收消息时,发送方和接收方可以独立进行操作,不需要进行协同,发送方发送消息后就可以继续执行其他操作,而接收方则可以在自己的时间范围内处理和响应消息。在这种通讯方式下,发送方不需要等待接收方响应,而是通过回调、轮询等方式获取接收方的处理结果。由于异步通讯不需要进行协同,因此可以大大提高系统的并发性能和响应速度。
      • 优点:
        • 吞吐量提升:无需等待订阅者处理完成,响应更快速
        • 故障隔离:服务没有直接调用,不存在级联失败问题
        • 调用间没有阻塞,不会造成无效的资源占用
        • 耦合度极低,每个服务都可以灵活插拔,可替换
        • 流量削峰:不管发布事件的流量波动多大,都由 Broker(中间件)接收,订阅者可以按照自己的速度去处理事件
      • 缺点:
        • 架构复杂了,业务没有明显的流程线,不好管理
        • 需要依赖于 Broker 的可靠、安全、性能

rabbitmq 的 web 界面管控台

  • Overview
    • 查看节点信息
  • Connections
    • 连接:消息的生产者和消费者连接信息
  • Channels
    • 通道:消息的具体对象。消费者基于通道完成消息的消费,生产者基于通道完成生产
  • Exchanges
    • 交换机:实现路由消息到队列
  • Queues
    • 队列:消息的暂存
  • Admin
    • 管理用户信息
      • 虚拟主机(virtral hosts):mq 中的逻辑划分,不同的用户可以有不同的逻辑划分。是对 queue、exchange 等的逻辑分组,实现多用户之间的工作区间不混淆。

AMQP 协议

  • AMQP(Advanced Message Queuing Protocol)是一种开放式的消息队列协议,它定义了在分布式系统中传输消息的标准格式和规范。AMQP 的设计目标是提供高效、可靠、安全、可扩展的消息传递机制,支持不同平台和语言之间的互操作性。
  • 在 AMQP 协议中,消息生产者将消息发布到交换机(Exchange)中,交换机根据指定的路由键(Routing Key)将消息路由到一个或多个消息队列中,消费者从队列中订阅并消费消息。消息可以包含任意类型的数据,如文本、JSON、XML、二进制数据等。
  • AMQP 协议支持多种消息传递模式,包括点对点(Point-to-Point)模式和发布/订阅(Publish/Subscribe)模式等,可以满足不同的应用场景和需求。

使用

  • 使用 Rabbit 的原生 API 生产队列和消费队列 (rabbitmqAPI)
    • 导入依赖 amqp-client
  • 使用 Rabbit Springboot 生产队列和消费队列 (rabbitmqSpringBoot)
    • 导入依赖 spring-boot-starter-amqp
    • 启动类添加 @EnableRabbit
    • 消息的限流(配置文件)
    • 配置类的使用
      • 交换机,配置队列,路由,绑定关系
    • 注解的使用
      • 交换机,配置队列,路由,绑定关系
    • 对象序列化的方式(配置类)

5 种工作模式

  • 无交换机,一个管道,一个消费者 simple queue 模式
  • 无交换机,一个管道,多个消费者 work queue 模式
  • publish/subscribe(发布/订阅模式)
    • 有交换机,无路由,多个管道,多个消费者 fanout
    • 有交换机,有路由,多个管道,多个消费者 Direct(Routing)
    • 有交换机,有路由,多个管道,多个消费者 Topics 模式 (路由支持通配符)