# rabbitMQ **Repository Path**: Hinak0/rabbit-mq ## Basic Information - **Project Name**: rabbitMQ - **Description**: rabbitMQ实操笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-07-21 - **Last Updated**: 2022-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rabbitMQ ## 基本组成 - 生产者 - 交换机(路由器) - 队列(消息存放的地方,呈队列结构) - 消费者 ## 工作模式 ```生产者 -> 交换机 -> 队列 -> 消费者```\ Exchange(交换机)有三种类型: - 广播(fanout) - 单播(direct) - 通配符(topic)(组播) - headers ### sampleQueue 简单队列,一个生产者对应一个消费者 ### workQueues - 相比简单工作模式,是一个生产者对应对多个消费者的模式 - 多个消费者的调度为顺序调度 ### Pub/Sub模式 绑定不同的交换机与队列,形成映射关系 ### route模式 通过routingKey判断消息推送到哪个队列 ### topic模式 通过routingKey的一部分+通配符判断映射关系 ## 整合SpringBoot - 引入依赖 - 编写配置 **生产者:** - 创建MQ生产工厂 - 在需要的地方自动注入 **消费者:** - 使用`@RabbitListener(queues="queueName")`监听message(消息放在Message类里作为参数) ## 高级特性 ### 消息可靠投递 两种模式需要在配置文件中开启 #### confirm模式 当生产者发送消息后,触发`confirmCallback`函数,参数有配置信息,是否成功,失败原因。 #### return模式 当exchange路由到queue失败时,触发`returnConfirm`回调\ 消息路由失败,默认丢弃消息,但是设置了`rabbitmqTemplate.setMandatory(true)`的话,消息通过`returnConfirm`返回给生产者。 ### 消费者确认(Consumer Ack) - 配置开启手动确认 - 使用`channel.basicAck(deliveryTag,true)`确认,或者`basicNack()`拒收,拒收有一个requeue参数表示是否重回队列。 ### 消费端限流 - 消费端为手动确认 - 配置`prefetch`属性,拉取消息的数目 ### 生存时间(TTL) 可以配置队列ttl也可以配置单个消息ttl,单个消息ttl优先级更高。 ### 死信队列(DLX) 将死信推送到特定的交换机,再推给死信队列 #### 什么是死信? - 超过队列长度的消息 - 消费者拒收消息且`requeue = false` - 超过存活时间 ### 延迟队列 **TTL+死信队列,不再赘述** ### 消息追踪 配置`trace_on`可获得每一条消息的详细信息。 ### 应用问题 #### 消息补偿 - 多次确认 - 监察系统对比消费者端和生产者端 - 发送失败则再次尝试\ \ _但是俗话说,越复杂的系统出问题的几率越大_ #### 消息幂等性 略 ### 集群搭建 #### 镜像集群 多个虚拟机由一个总代理机对外提供服务 #### haproxy 一个代理程序