每日八股:消息队列

什么是消息队列?

可以把消息队列理解为一个使用队列来通信的组件。它的本质就是个转发器,包含发消息、存消息、消费消息的过程。我们通常说的消息队列,简称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选手#
全部评论

相关推荐

05-17 09:59
门头沟学院 Java
白驹过隙,时光如梭,一眨眼研一下马上结束了,最近拿下了手子的offer,对研一下做个总结吧,顺便规划下剩下的时间如何度过。首先,年初在本地某中厂进行了一段实习,很不错的一段时间,让我对业务,软件开发流程有了更加清晰的认识,也让我认识到我可能想走的路,走一步看一步吧。离职后在学校沉淀+改论文,在此感谢师兄,给我挂了论文,让我研一也有论文了,虽然不是一作,但是可以拿出去装逼。我自己的论文也有所进展,最近刚投递出去,希望有个好结果。与此同时,开发的东西也没落下,学八股,做项目,很充实,最后很幸运的麻烦了暑假期间的日常实习。再说说感想吧,身体是革命的本钱,没有身体都是扯淡,要保护眼睛,少吃凉的,多睡会儿,让自己休息会儿,慢下来。总得来说,研一下是充实的,是有所收获的,是有所进步的。科研,实习,都有所进展,对自己到底想要什么也有更进一步的认识,更加了解自己,希望我能成为一个活的明白的人。最后,做一下这段时间和暑假期间的计划吧:1. 复习期末,就剩三周了,稳住成绩2. 暑假期间全身心投入实习,好好感受互联网强度,看看自己能不能接受3. 根据暑假期间的收获和所想所得,决定9月份的自己何去何从respect#牛客AI配图神器#
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客企业服务