认识rabbitmq

RabbitMQ是一个消息队列中间件,用于服务间解耦、异步通信和流量削峰。例如,在在线商店系统中,订单服务和库存服务通过RabbitMQ进行通信,降低耦合。同时,RabbitMQ支持ram和disc两种节点模式,以及普通和镜像集群,以实现不同级别的数据持久化和高可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.rabbitmq是什么

rabbitmq是一个消息队列中间件,客户端即用户是生产者,生产消息,服务端是消费者,消费消息,客户端生产的消息存入rabbitmq的消息队列中,服务端去消费队列中的消息,当服务端消费完后,rabbitmq就会把队列中的这条消息删除

2.rabbitmq的作用

rabbitmq最经典的三个作用就是服务间解耦、实现异步通信、流量削峰

服务间解耦:使用 RabbitMQ 可以实现服务之间的解耦,RabbitMQ 是一个消息队列,它允许服务之间通过发送和接收消息来进行通信。发送消息的服务不需要知道接收消息的服务的具体位置,只需要将消息发送到 RabbitMQ 上,由 RabbitMQ 负责将消息路由到正确的服务

例如,假设有一个在线商店系统,包含了订单服务和库存服务。当用户下单时,订单服务需要检查库存是否足够,并将订单信息保存到数据库中。在没有 RabbitMQ 的情况下,订单服务需要直接调用库存服务来查询库存,这样就会产生耦合。但是,使用 RabbitMQ 可以将订单信息发送到一个名为“订单队列”的队列中,库存服务则监听这个队列。当库存服务检测到有新的订单信息时,它会从队列中获取订单信息,并检查库存是否足够。如果库存足够,库存服务会将库存数量减少,并将处理结果发送到一个名为“库存队列”的队列中。订单服务也会监听这个队列,当它检测到库存服务已经处理完毕时,它会将订单信息保存到数据库中

通过使用 RabbitMQ,订单服务和库存服务之间的通信变得松耦合,它们不再直接相互调用,而是通过消息队列进行通信。这种方式使得系统更加灵活,容易扩展和维护

实现异步通信:RabbitMQ 异步通信的作用在于提高系统的性能和可伸缩性,使用异步通信,可以将耗时的操作放入消息队列中进行处理,并让主线程继续处理其他请求,从而提高系统的并发处理能力

假设有一个 Web 应用程序,需要处理大量的图像上传请求。为了提高性能,可以将图像上传请求放入一个名为“上传队列”的 RabbitMQ 队列中,然后,使用一个名为“处理队列”的队列来处理这些请求。这个队列上的消费者可以异步地处理图像上传请求,这样就可以让 Web 应用程序的请求处理线程专注于处理其他请求

流量削峰:RabbitMQ 流量削峰的作用在于保护系统免受过载的影响,提高系统的稳定性和可靠性,使用流量削峰,可以将请求放入消息队列中进行处理,并使用异步处理的方式来控制系统的并发处理能力,从而避免系统因为过多的请求而崩溃或变得不可用

假设有一个 Web 应用程序,需要处理大量的用户请求。为了防止系统崩溃,可以将请求放入一个名为“请求队列”的 RabbitMQ 队列中,然后,使用一个名为“处理队列”的队列来处理这些请求。这个队列上的消费者可以异步地处理请求,并且可以通过调节消费者的数量来控制系统的并发处理能力,从而达到流量削峰的效果

3.rabbitmq节点模式

ram模式:此模式为内存模式,rabbitmq的所有数据都存在内存中,优点是读取写入速度快,缺点是服务重启后数据就会全被丢失

disc模式:此模式为磁盘模式,rabbitmq的所有数据都存在磁盘中,优点是存储在磁盘中的数据不会丢失,缺点是读取写入性能稍微慢一点

4.rabbitmq集群

rabbitmq的集群节点数量官方的建议是奇数化节点,即1、3、5、7,并且要求集群中至少有一个disc节点,RabbitMQ 集群使用 Raft 算法进行数据复制和故障转移,需要在集群中达成多数派才能保证数据的一致性和可用性,当rabbitmq集群节点是3个节点时,只能容忍1个节点挂掉,集群还能正常使用,节点为5个节点时,只能容忍2个节点挂掉,集群还能正常使用,即挂掉的节点不能比正常的节点多

普通集群:每个节点都保存集群的元数据和所有队列的元数据,但是消息只存在于一个节点上的队列里,服务消费的时候,如果访问的是存在消息的节点队列,就会直接消费这个消息,但是访问的是其它节点队列,这个节点就会通过队列的元数据定位到消息所在的节点位置,把数据拉取过来,被消费者消费掉后把消费结果同步给原节点,普通集群无法保证高可用,当存放消息的节点挂掉时,这个消息就无法被消费,若是节点做了持久化,在节点恢复后,可以被再次消费,若是节点没做持久化,消息就丢失了

镜像集群:即在普通集群的基础上配置镜像策略,配置了镜像策略的队列,会将队列元数据和消息数据全都复制到其它节点上,每次写入消息的时候都会自动把数据同步到其余节点的队列上,但是镜像出来的队列不参与请求响应,仅仅只是做备份用,只有当主的节点挂掉时,备份队列才会响应请求

5.rabbitmq镜像集群知识点

在 RabbitMQ 中,交换器本身并不存储消息,而是负责将消息路由到队列中。因此,与队列相比,交换器的高可用性要求相对较低,通常不需要进行镜像。即使某个节点上的交换器发生故障,也可以通过重新创建交换器来恢复其功能,而不需要从其他节点上的镜像交换器中恢复数据

需要注意的是,在 RabbitMQ 中,镜像交换器只是交换器的副本,不会存储任何消息。因此,即使您在多个节点上创建了镜像交换器,也无法保证消息的高可用性和可靠性。如果希望提高消息的可用性和可靠性,建议使用 RabbitMQ 的镜像队列功能,将消息的副本存储在多个节点上

在 RabbitMQ 的镜像队列中,消息会被同步到所有节点上的队列中。这意味着,即使某个节点上的交换器发生故障,消息仍然可以在其他节点上的队列中被消费。如果使用的是 RabbitMQ 的高可用性集群,那么当某个节点上的交换器发生故障时,其他节点上的交换器会自动接管消息的路由,从而保证消息的高可用性和可靠性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值