赞
踩
RabbitMQ是一个基于AMQP协议实现的企业级消息系统,想要顺畅的玩耍的前提是得先了解它,本文将主要介绍rabbitmq的一些基本知识点
它是采用Erlang语言实现的AMQP(Advanced Message Queued Protocol)的消息中间件,最初起源于金融系统,用在分布式系统存储转发消息,目前广泛应用于各类系统用于解耦、削峰
首先得了解一下rabbitmq的特点,看看是否满足我们的系统需求(毕竟学习一个框架也是要不少时间的)
以下内容来自: MQ和RabbitMQ作用特点
主要特点,大致可以归纳为以下几个
下图为rabbitmq的内部结构图
从上图也可以发现几个基本概念(Message, Publisher, Exchange, Binding, Queue, Channel, Consuer, Virtual host)
下面逐一进行说明
具体的消息,包含消息头(即附属的配置信息)和消息体(即消息的实体内容)
由发布者,将消息推送到Exchange,由消费者从Queue中获取
消息生产者,负责将消息发布到交换器(Exchange)
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
绑定,用于给Exchange和Queue建立关系,从而决定将这个交换器中的哪些消息,发送到对应的Queue
消息队列,用来保存消息直到发送给消费者
它是消息的容器,也是消息的终点
一个消息可投入一个或多个队列
消息一直在队列里面,等待消费者连接到这个队列将其取走
连接,内部持有一些channel,用于和queue打交道
信道(通道),MQ与外部打交道都是通过Channel来的,发布消息、订阅队列还是接收消息,这些动作都是通过Channel完成;
简单来说就是消息通过Channel塞进队列或者流出队列
消费者,从消息队列中获取消息的主体
虚拟主机,表示一批交换器、消息队列和相关对象。
虚拟主机是共享相同的身份认证和加密环境的独立服务器域。
每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。
vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
可以理解为db中的数据库的概念,用于逻辑拆分
消息队列服务器实体
从前面的内部结构图可以知晓,消息由生产者发布到Exchange,然后通过路由规则,分发到绑定queue上,供消费者获取消息
接下来我们看一下Exchange支持的四种策略
消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中
简单来讲,就是rounting key与binding key完全匹配
举例说明
Exchange和两个队列绑定在一起:
注意
这个策略可以看成是Direct策略的升级版,通过routing key与 bingding key的模式匹配方式来分发消息
简单来讲,直接策略是完全精确匹配,而topic则支持正则匹配,满足某类指定规则的(如以xxx开头的路由键),可以将消息分发过去
一个更直观的实例如下
Producer发送消息时需要设置routing_key,
广播策略,忽略routing key 和 binding key,将消息分发给所有绑定在这个exchange上的queue
这个实际上用得不多,它是根据Message的一些头部信息来分发过滤Message,忽略routing key的属性,如果Header信息和message消息的头信息相匹配
在进入rabbitmq如何保证一致性之前,我们先得理解,什么是消息一致性?
数据的一致性是什么
按照我个人的粗浅理解,我认为的消息一致性,应该包含下面几个
发送端
为了确保发布者推送的消息不会丢失,我们需要消息持久化
为了确定消息正确接收
这里的持久化,主要是指将内存中的消息保存到磁盘,避免mq宕机导致的内存中消息丢失;然而单纯的持久化,只是保证一致性的其中一个要素,比如publisher将消息发送到exchange,在broker持久化的工程中,宕机了导致持久化失败,而publisher并不知道持久化失败,这个时候就会出现数据丢失,为了解决这个问题,rabbitmq提供了事务机制
事务机制能够解决生产者与broker之间消息确认的问题,只有消息成功被broker接受,事务才能提交成功,否则就进行事务回滚操作并进行消息重发。但是使用事务机制会降低RabbitMQ的消息吞吐量,不适用于需要发布大量消息的业务场景。
注意,事务是同步的
RabbitMQ学习(六)——消息确认机制(Confirm模式)
消息确认机制,可以区分为生产端和消费端
生产端
Confirm模式属性异步,publisher发布一条消息之后,在等信道返回确认的同时,依然可以继续发送下一条消息,所以小概率会出现投递的消息顺序和broker中持久化消息顺序不一致的问题
一般从编程角度出发,Confirm模式有三种姿势
消费端
ACK机制是消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除。
按照目前的发展趋势,一个不支持集群的中间件基本上是不会有市场的;rabbitmq也是支持集群的,下面简单的介绍一下常见的4种集群架构模式
以下内容来自网上博文,详情请点击右边:RabbitMQ 的4种集群架构
这个属于常见的集群模式了,但又不太一样
主节点提供读写,备用节点不提供读写。如果主节点挂了,就切换到备用节点,原来的备用节点升级为主节点提供读写服务,当原来的主节点恢复运行后,原来的主节点就变成备用节点
远程模式可以实现双活的一种模式,简称 shovel 模式,所谓的 shovel 就是把消息进行不同数据中心的复制工作,可以跨地域的让两个 MQ 集群互联,远距离通信和复制。
如上图,有两个异地的 MQ 集群(可以是更多的集群),当用户在地区 1 这里下单了,系统发消息到 1 区的 MQ 服务器,发现 MQ 服务已超过设定的阈值,负载过高,这条消息就会被转到 地区 2 的 MQ 服务器上,由 2 区的去执行后面的业务逻辑,相当于分摊我们的服务压力。
非常经典的 mirror 镜像模式,保证 100% 数据不丢失。在实际工作中也是用得最多的,并且实现非常的简单,一般互联网大厂都会构建这种镜像集群模式。
如上图,用 KeepAlived 做了 HA-Proxy 的高可用,然后有 3 个节点的 MQ 服务,消息发送到主节点上,主节点通过 mirror 队列把数据同步到其他的 MQ 节点,这样来实现其高可靠
也是实现异地数据复制的主流模式,因为 shovel 模式配置比较复杂,所以一般来说,实现异地集群的都是采用这种双活 或者 多活模型来实现的。这种模式需要依赖 rabbitMQ 的 federation 插件,可以实现持续的,可靠的 AMQP 数据通信,多活模式在实际配置与应用非常的简单
rabbitMQ 部署架构采用双中心模式(多中心),那么在两套(或多套)数据中心各部署一套 rabbitMQ 集群,各中心的rabbitMQ 服务除了需要为业务提供正常的消息服务外,中心之间还需要实现部分队列消息共享。
federation 插件是一个不需要构建 cluster ,而在 brokers 之间传输消息的高性能插件,federation 插件可以在 brokers 或者 cluster 之间传输消息,连接的双方可以使用不同的 users 和 virtual hosts,双方也可以使用不同版本的 rabbitMQ 和 erlang。federation 插件使用 AMQP 协议通信,可以接受不连续的传输。federation 不是建立在集群上的,而是建立在单个节点上的,如图上黄色的 rabbit node 3 可以与绿色的 node1、node2、node3 中的任意一个利用 federation 插件进行数据同步。
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。