消息中间件-Rabbitmq

[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/MQ/mq-rabbitmq.html

RabbitMQ是一款开源的消息中间件,采用AMQP(高级消息队列协议)作为底层协议,提供了可靠的消息传递机制、灵活的路由方式以及多种消息发布/订阅模式等特性,被广泛应用于分布式系统、微服务架构等场景中

数据发布方式

RabbitMQ支持多种消息发布方式,主要包括以下几种:

1. P2P(点对点)模式

P2P模式是最简单的消息发布方式,即消息生产者直接将消息发送到指定的队列中,消费者通过消费该队列中的消息来获取数据

2. 发布/订阅模式

发布/订阅模式是指生产者将消息发送到一个交换机(exchange)中,而消费者则创建一个或多个队列并绑定到该交换机上,从而获取该交换机中的消息
在发布/订阅模式中,可以使用Fanout类型的exchange,该类型的交换机将消息广播给所有绑定到该交换机上的队列

3. Routing模式(路由模式)

Routing模式是指生产者将消息发送到一个Direct类型的交换机中,交换机将消息交给符合指定routing key的队列来处理。routing key通常是一个字符串,可以是任何内容,但通常用于表示消息的类型、来源等信息

4. Topic模式(主题模式)

Topic模式是指生产者将消息发送到一个Topic类型的交换机中,交换机将消息给到相关的几条Topic,Topic可以使用通配符进行匹配
例如,可以使用"item.#“表示能够匹配"item.spu.insert"或者"item.spu”,而"item.*“只能匹配"item.spu”

节点

RabbitMQ节点分为内存节点磁盘节点两种类型。其中,内存节点将消息存储在内存中,读写性能较高,但节点重启后消息会丢失;
而磁盘节点则将消息存储在磁盘上,读写性能相对较低,但具有消息持久化的特性,即节点重启后消息不会丢失

在RabbitMQ集群中,至少需要一个磁盘节点来存储元数据信息,否则节点重启后元数据将丢失

集群模式

RabbitMQ提供了两种集群模式,分别是普通集群模式和镜像集群模式

1. 普通集群模式

普通集群模式下,各个节点只保存所有的队列、Exchange、Virtual Host等元数据,不保存队列中的消息本身。这种模式可以降低存储压力,提高系统吞吐量,但不能实现系统的高可用性
如果某个节点崩溃,而且消息没有被持久化,那么将导致该节点下所有未被消费的数据丢失

2. 镜像集群模式

镜像集群模式下,集群中的每个节点都有一份元数据以及消息数据,读写只在master节点进行,master接收命令后会向slave节点进行组播,slave节点会按照命令执行顺序执行
这种模式通过数据冗余极强地提高了可靠性,可以极大地减少数据丢失的风险。但是,由于镜像队列需要为每个节点同步所有的消息实体,因此会导致存储压力变大,可能会出现网络带宽和IO瓶颈等问题

3. After All

普通集群模式和镜像集群模式分别具有不同的优势和问题:

  • 普通集群模式可以降低存储压力、提高系统吞吐量,但不能实现系统的高可用性
  • 而镜像集群模式可以提高可用性、可靠性,但需要消耗更多的存储空间、网络带宽和IO资源

在选择集群模式时,需要根据具体的业务场景进行综合考虑,并根据需求选择合适的部署方案

作者

神奇宝贝大师

发布于

2021-01-09

更新于

2021-08-09

许可协议

评论