每日八股:消息队列
什么是消息队列?
可以把消息队列理解为一个使用队列来通信的组件。它的本质就是个转发器,包含发消息、存消息、消费消息的过程。我们通常说的消息队列,简称MQ(Message Queue),它其实就是消息中间件,比较流行的有RabbitMQ,RocketMQ,Kafka。
如何保证幂等性?
幂等性是指同一操作的多次执行对系统状态的影响与一次执行结果一致。 实现幂等性的核心方案:
1.唯一标识(幂等键):客户端为每个请求生成全局唯一ID(如UUID、业务主键),服务端校验该ID是否已处理,适用场景接口调用、消息消费等。
2.数据库事务+乐观锁:通过版本号或状态字段控制并发更新,确保多次更新等同于单次操作,适用场景数据库记录更新。
3.数据库唯一约束:利用数据库唯一索引防止重复数据写入,适用场景数据插入场景。
4.分布式锁:通过锁机制保证同一时刻仅有一个请求执行关键操作,适用场景高并发下的资源抢夺(如秒杀)。
5.消息去重:消息队列生产者为每条消息生成唯一的消息ID,消费者在处理消息前,先检查该消息ID是否已经处理过,如果已经处理过则丢弃该消息。
RabbitMQ的特性
RabbitMQ以可靠性、灵活性和易扩展性为核心优势,适合需要稳定消息传递的复杂系统。核心特性如下:
1.持久化机制:RabbitMQ支持消息、队列和交换机的持久化。当启用持久化时,消息会被写入磁盘,即使RabbitMQ服务器重启,消息也不会丢失。
2.消息确认机制:提供了生产者确认和消费者确认机制。生产者可以设置confirm模式,当消息成功到达RabbitMQ服务器,会收到消息;消费者在处理完消息后,会向RabbitMQ服务器发送确认信号,告知服务器该消息已被成功处理,服务器就会将消息从队列中删除。
3.镜像队列:支持创建镜像队列,将队列的内容复制到多个节点上,提高消息的可用性和可靠性,当一个节点出现故障时,其他节点仍然可以提供服务,确保消息不会丢失。
4.多种交换器类型:RabbitMQ提供了多种类型的交换器。不同类型的交换器根据不同的规则将消息路由到队列中。
RabbitMQ的底层架构是什么?
1.核心组件:生产者负责发送消息到RabbitMQ,消费者负责从RabbitMQ接收并处理消息,RabbitMQ本身负责存储和转发消息。
2.交换机:交换机接收来自生产者的消息,并根据routing key和绑定规则将消息路由到一个或多个队列。
3.持久化:RabbitMQ支持消息的持久化,可以将消息保存在磁盘上,以确保在RabbitMQ重启后消息不丢失,队列也可以设置为持久化,以保证其结构在重启后不会丢失。
4.确认机制:为了确保消息可靠送达,RabbitMQ使用确认机制,消费者在处理完消息后发送确认给RabbitMQ,未确认的消息会重新入队。
5.高可用性:RabbitMQ提供了集群模式,可以将多个RabbitMQ实例组成一个集群,以提高可用性和负载均衡。通过镜像队列,可以在多个节点上复制同一队列的内容,以防止单点故障。
#八股##消息队列##Java选手#