• 原则
      • 消息传输的可靠性:保证消息不会丢失。
      • 支持集群,包括横向扩展,单点故障都可以解决。
      • 性能要好,要能够满足业务的性能需求。
    • RabbitMQ支持大多数语言;因为实现的是协议
    • 选型

    image.png
    image.png
    image.png
    image.png

    • exchange和queues绑定: BindingKey
    • 生产者:发送给交换器,会有一个RoutingKey,会和BindingKey对比进行绑定。然后放在某一个queue里面
    • 交换器类型
      • fanout
        • 一对多直接交换
        • 不需要BK和RK
      • Direct
        • RK和BK,点对点,
        • 如果没有匹配的,可以设置丢掉还是退回给生产者
      • Topic交换器
        • RK和BK可以指定通配符
        • BK和RK点分单词:
        • *一个单词;#零到多个单词
    • 存储机制
      • 持久化消息和非持久化消息
      • 这两种消息都会写入磁盘
        • 性能弹性
          • 非持久化消息写盘: 内存不够
          • 持久化写内存:

    image.png

    • 队列的四种状态
    1. alpha:消息索引和消息内容都存内存,最耗内存,很少消耗CPU
    2. beta:消息索引存内存,消息内存存磁盘
    3. gama:消息索引内存和磁盘都有,消息内容存磁盘
    4. delta:消息索引和内容都存磁盘,基本不消耗内存,消耗更多CPU和I/O操作
    • 延伸题目:如果rabbit大量消息堆积后果
      • 会堆积磁盘,延迟很小,出现大量磁盘IO,效率很低
    • 有没有大小限制?
      • 理论上没有,看磁盘大小
    • 安装注意版本兼容
    • 工作流程
      • 生产时候:需要声明交换器和RK

    image.png

    • 消费流程

    image.png

    • Connection和Channel关系

    image.png
    通过信道复用TCP连接,使用时候会加锁

    • 秒杀应用
      • 分为高并发读和高并发写

    image.png
    image.png

    • 工作模式:
      • Work Queue

    image.png

    • 发布订阅模式(fanout)
      • 类似于广播,人不在,挺不到
      • image.png
    • 路由模式 // direct
    • 主题模式 // topic
      • 消息可靠性
    • 重复消费
      • 通过构建一个线程监听;根据指标监听,然后分到相同消息者里面
    • 顺序消费
    • 消息丢失
      • 异常捕获
      • 确认机制:生产者确认和消费者确认
      • 高可用:broker镜像队列、高可用备份
      • 生产者重发;消费者重试
      • 事务机制: 不建议用
        • image.png
      • 数据持久化:
        • 交换器的持久化、队列的持久化、消息的持久化
        • 进项队列
      • 消费端限流: 防止推模式下消费端堆积
      • 流控机制: 生产方阻塞
      • QoS机制: 仅对推模式有效

    image.png

    • 三个消费的层级

    image.png

    • 不支持恰好一次
    • 通过最少一次+ 幂等性
      • TTL机制
    • 对消息设置TTL
    • 对消息队列设置TTL
    • 不同的消息队列设置时间不同,意义不大:
      • 只检查超时队列头部的
    • 闹钟不合适;延迟支付还可以
      • 死信队列
    • 配置以后,消息过期后会进入死信队列
    • 队列达到最大长度
    • 消息被拒绝;并设置requeue为false
      • 延迟队列
    • 定时操作
    • 使用插件rabbitmq_delayed_message_exchange
    • 可以实现按照过期时间进行轮训
      • 集群
    • 主备、主从、主主、分片集群、异地多活
    • nginx : keep-alive 进行IP漂移,实现nginx的高可用
    • 集群两个目标: 横向扩容和高可用
      • 常用负载均衡算法
    • 随机、轮询、加权、最少活跃、原地址、一致性hash
      • 脑裂
    • 过半机制
    • 通过Zk实现过半机制
      • 缺点浪费资源
        • kafka逆势
    • 不用过半
    • 不用内存
      • RabbitMQ的集群
    • 兔子窝:主备模式
    • 铲子模式: 数据复制
    • Federation联邦模式 : 实现跨集群、节点消息同步的插件。
    • 一般不用来解决问题;因为数据库没法跟着配置;容易出现问题
    • 集群
      • 共享元数据;不共享消息

    image.png

    • 挂在嘴上的镜像队列
      • 每个镜像队列包含一个master,若干个镜像。master存在于称为master的节点上。
        所有的操作都是首先对master执行,之后广播到镜像。
        这涉及排队发布,向消费者传递消息,跟踪来自消费者的确认等。镜像意味着集群,不应该WAN使用。
      • 提供了高可用,但是没有负载均衡。 使用HA-Proxy进行负载均衡。
      • image.png
    • 大厂面试题

    image.png
    image.png