# kt-learn-rabbitmq **Repository Path**: javis_code/kt-learn-rabbitmq ## Basic Information - **Project Name**: kt-learn-rabbitmq - **Description**: 学习RabbitMQ记录 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-12-06 - **Last Updated**: 2021-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MQ 典型的生产者消费者模式,生产消费都是异步,仅负责消息接收和推送,不入侵业务逻辑,轻松实现系统间解耦 # MQ对比 ActiveMQ:API成熟,性能、吞吐量不行;适合中小型企业 Kafka:高吞吐,性能高;不支持事务;适合日志场景 RocketMQ:阿里出品;参照Kafka并有优化;开源版本不支持事务; RabbitMQ:高性能;基于AMQP协议实现;多模型;适用于要求稳定性、一致性和可靠性的系统;相比Kafka性能略低; # 常用MQ模式 ## 路由模式 ![](pic/direct.png) 图解: - P:生产者,向Exchange发送消息,会指定一个Routing Key - X: Exchange,接收生产者消息,然后把消息递交给与Routing Key完全匹配的队列 - C1:消费者,其所在队列指定了需要Routing Key为error的消息 - C2:消费者,其所在队列指定了需要Routing key为info、error、warning的消息 模式特点: - 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key) - 消息的发送方向在Exchange发送消息时,也必须指定消息的RoutingKey - Exchange不再把消息交给每一个绑定的队列,而是根据消息的RoutingKey进行判断,只有队列的RoutingKey 与消息的RoutingKey一致时,才会接受到消息 ## 扇出(广播)模式 ![](pic/fanout.png) 流程: - 可以有多个消费者 - 每个消费者有自己的queue - 每个队列有自己的exchange - 生产者只能把消息发送到exchange,exchange来决定发送到哪个队列 - 交换机把消息发送到所有绑定过的队列 - 队列的消息都能拿到消息,实现一条消息被多个消费者消费 ## P2P模式 ![](pic/p2p.png) 流程: P:生产者,生产消息 C:消费者,消费消息 Q:消息队列,可以缓存消息,生产者投递信息,消费者从中取出消息 ## 订阅模式 和direct一样都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列绑定RoutingKey的时候使用通配符。 这种模型一般都由多个单词组成,以"."分割,例如:item.insert ![](pic/topic.png) 图解: 参考direct 模式特点: - 与direct模式一样 - RoutingKey支持通配符 - #号表示匹配多个 ## 工作队列模式 ![](pic/workqueue.png) 流程: P:生产者,生产消息 C1:消费者,消费消息 C2:消费者,消费消息 Q:消息队列,可以缓存消息,生产者投递信息,消费者从中取出消息 默认情况下是平均分配,称之为循环; 应该调整成为,每个消费者每次只消费一个消息,消费成功后手动ack给MQ,这样就能最大化消费效率 ```java // 设置每次只消费一个消息 channel.basicQos(1); @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { ...... /* 手动确认 参数1:手动确认消息标识 参数2:true每次确认多个 false 每次确认一个 */ channel.basicAck(envelope.getDeliveryTag(), false); } ``` # MQ应用场景 - 异步处理:用户注册后需要发送注册邮件或短信,缩减响应时间 - 应用解耦:订单系统下单后把消息推送给库存系统 - 流量削峰:秒杀活动,控制活动人数,超过阈值直接丢弃,可以缓解短时间的高流量压垮应用