MQ概述
- MQ全称Message Queue(消息队列),在web中小的数据都可以称为消息,队列是一种容器,用来存储数据的都可以称为容器,多用于分布式系统之间的通信
- A系统(生产者)->MQ(中间件)->B系统(消费者)
MQ的优势
- 应用解耦:使用MQ使得应用间解耦,提升容错性和可维护性。
- 异步提速:提升用户体验和系统吞吐量
- 削峰填谷:提高系统稳定性
MQ的劣势
- 系统可用性降低:系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响
- 系统复杂度提高:MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行一步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?怎么保证消息传递额顺序性
- 一致性问题:A系统处理完业务,通过MQ给BCD三个系统发消息数据,如果BC系统处理成功,D失败,如何保证消息数据的一致性。
同步和异步调用
- 同步调用时单线程的,A调用B,必须等待B给出响应之后A才能继续执行,否则A处于阻塞状态;异步调用是多线程的,A调用B之后不用等待B的响应即可继续执行。
MQ使用的条件
- 生产者不需要从消费者处获得反馈。引入消息队列之前的直接调用,其接口的返回值为空,才不用等待被调用者的动作做完,调用者直接把被调用者当做已经做完。
- 容许短暂的数据不一致
JMS
- JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件的API
RabbitMQ安装
小鬼当家:虚拟机安装Linux,JDK,MySql,Tomcat,Redis,Nginx,RabbitMQzhuanlan.zhihu.com
代码
channel.queueDeclare(String queue,boolean exclusive,boolean autoDelete, Map<String,Object> ar);
// queue:队列名称
// durable:是否持久化,当mq重启后,还在
// exclusive:是否独占。只能有一个消费者监听这个队列
// autoDelete:当没有consumer时,是否自动删除
work queues工作队列模式(一条消息只能一个消费者消费)
- 概念:与简单模式相比,多了一些消费端,多个消费端共同消费同一个队列中的消息,存在竞争关系
- 应用场景:任务较重的情况下,多个消费者处理消息可以提高任务处理的速度
Pub/Sub订阅模式
生产者将消息发送给交换机,交换机负责转发给特定的队列,交换机不存储消息
- direct:定向
- fanout:发送消息到每一个队列
Routing 路由模式
topic
消息的可靠投递
- rabbitmq消息投递路径:producer->rabbitmq broker->exchange->queue->consume
-
confirm确认模式:消息从producer到exchange会返回一个confirmCallback
- 实现流程: 确认模式开启->在工具类上通过匿名内部类 定义回调函数
-
return退回模式:消息从exchange到queue投递失败则会返回一个returnCallback
- 实现流程:开启回退模式->设置returnCallback->设置Exchange处理消息的模式(1如果消息没有路由到queue,则丢弃消息;2如果消息没有路由到queue,返回消息给发送方ReturnCallback)
消费端限流
- 确保消费端签收机制为手动签收
- 在<listener-container>配置属性perfetch=N表示消费端每次从mq拉取一条消息来确认,知道消费完毕后,才会继续拉取下一条消息。
TTL(Time To Live存活/过期时间)
- 当消息到达存活时间后,还没有被消费,会被自动清除(队列统一过期或者某个消息过期)
- 如果同时设置消息和队列的过期时间,以时间短的为准
死信队列(Dead Letter Exchange)DLX
- 当消息称为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。DLX又可以绑定队列,使得消息可以被重新消费。
-
消息成为死信的三种情况:
- 队列的消息长度达到限制
- 消费者拒绝消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false
- 原队列存在消息过期设置,消息到达超时时间未被消费
延迟队列
消息进入队列后不会立即被消费,只有到达指定时间后才会被消费
RabbitMQ搭建集群
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=RABBIT1 rabbitmq-server start
HAProxy安装
版权声明:本文为weixin_39991148原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。