RabbitMQ的好处
服务解耦,流量削峰,异步调用.
AMQP核心概念
- Server又称Broker,接收客户端连接,实现AMQP实体服务.
- Connection连接,应用程序与Broker的网络连接.
- Channel网络信道,进行消息读写的通道.客户端可以建立多个Channel,每个Channel代表一个会话任务.
- Message消息,由Properties和Body组成,Properties可以对消息进行修饰,比如消息的优先级,延迟等.Body则就是消息体内容.
- Virtual host虚拟地址,用于进行逻辑隔离,最上层的消息路由.一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不可以有相同名称的Exchange或Queue.
- Exchange交换机,接收消息,根据路由键转发消息到绑定的队列.
- Binding绑定,Exchange和Queue之间的虚拟连接,binding中可以包含routing key.
- Routing key路由键,一个路由规则,虚拟机可用它来确定如何路由一个特定消息.
- Queue也称Message Queue,保存消息并将它们转发给消费者.
Exchange交换机的类型
- direct直连交换机.RabbitMQ默认的交换机类型,所有发送到直连交换机的消息都会按RouteKey发送到匹配(完全匹配)的队列中.
- topic主题交换机,所有发送到主题交换机的消息会被转发到所有关心RouteKey中指定Topic的Queue上.交换机将RouteKey和某Topic进行模糊匹配.队列需要绑定一个Topic(#代表匹配一个或多个词,*匹配不多不少一个词).
- fanout扇出交换机.不处理路由键,只需要简单的将队列绑定到交换机上.转发消息性能好.消息会被转发到所有与扇出交换机绑定的队列上.
- headers头交换机,根据消息头转发.
如何保证消息的100%投递成功
生产端的可靠性投递:
- 保障消息的成功发出.
- 保障MQ节点的成功接收.
- 发送端收到MQ节点(Broker)确认应答.
- 完善的消息进行补偿机制.
解决方案:
消息的延迟投递,做二次确认,回调检查.
如何避免消息的重复消费问题
消费端的幂等性保障(避免重复消费):
- 唯一ID+指纹码 机制,利用数据库主键去重.缺点:高并发下有数据库写入的性能瓶颈.解决方法:跟进ID进行分库分表进行算法路由.
- 利用Redis的原子性去实现.
RabbitMQ常用的消息投递方式:Confirm确认消息,Return返回消息.
消息的ACK与重回队列,略.
消息的限流
RabbitMQ的消费端限流:BasicQos方法,非自动确认消息的前提下,如果一定数目的消息未被确认,则不进行消费新的消息.
TTL消息
可以设置消息的过期时间,或者给队列添加过期时间.从消息入列开始,只要超时,就会清除消息.
死信队列
利用死信队列,当消息在一个队列中变成死信之后,它能被重写publish到另一个Exchange,这个Exchange就是DLX(死信交换机/死信队列).
消息变成死信的几种情况:消息被拒绝.消息TTL过期.队列达到最大长度.
RabbitMQ集群架构模式
主备模式:又叫Warren,就是一个主备方案.主节点如果挂了,从节点顶上.
远程模式:远程模式可以实现双活,简称Shovel模式,就是让我们可以把消息进行不同数据中心的复制工作,我们可以跨地域的让俩个mq集群互联.
镜像模式:也称为Mirror模式,可以保证100%数据不丢失,应用简单,使用广泛.镜像队列(属于100%数据可靠性解决方案一般是3节点).
多活模式:这种模式是实现异地数据复制的主流模式,因为远程模式配置比较复杂,所以一般实现异地集群都是使用这种双活或者多活模型来去实现的.这种模式需要依赖RabbitMQ的federation插件,可以实现持续的可靠的AMQP数据通信,多活模式在实际配置与应用上非常简单.采用双中心或者多中心结构.
SET化架构