消息中间件-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资源
在选择集群模式时,需要根据具体的业务场景进行综合考虑,并根据需求选择合适的部署方案
消息中间件-Rabbitmq