ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### Spring IOC如何管理Bean之间的依赖关系,怎么样避免循环依赖 ### SpringBean创建过程中的设计模式? ### 用MQ采集消息的时候,有没有做消息重复消费处理?怎么做的? > 生产者在向Kafka写数据时,每条消息会有一个offset,表示消息写入顺序的序号。当消费者消费后,**每隔一段时间会把自己已消费消息的offset通过Zookeeper提交给Kafka**,告知Kafka自己offset的位置。这样一来,如果消费者重启,则会从Kafka记录的offset之后的数据开始消费,从而避免重复消费。 #### 发生重复消费后,如何**保证消息消费时的幂等性** 1. 向数据库insert数据时,先**根据主键查询,若数据存在则不insert,改为update** 2. 向Redis中写数据可以用**set去重,天然保证幂等性** 3. 生产者发送每条消息时,增加一个全局唯一id(类似订单id),消费者消费到时,先**根据这个id去Redis中查询是否消费过该消息**。如果没有消费过,就处理,将id写入Redis;如果消费过了,那么就不处理,保证不重复处理相同消息。 4. 基于数据库的**唯一键约束**来保证不会插入重复的数据,当消费者企图插入重复数据到数据库时,会报错。 总结: - Kafka采取类似**断点续传**的策略保证消息不被重复消费。具体是通过**每隔一段时间把已消费消息的offset通过Zookeeper提交给Kafka**实现的。 - 但是当消费者**处理完成但尚未提交offset**的时间段宕机或重启等意外情况发生时,还是可能出现消息被重复消费。 - 保证消息不被重复消费(保证消息消费时的幂等性)其实是保证数据库中数据的正确性。几种保证系统幂等性的思路:通过主键查询,若存在则update;Redis天然set去重;根据全局id查询,若已消费则不处理;唯一键约束保证不插入重复数据等。 ### RocketMQ 1. commitLog是什么? > commtLog的存储其实是分多层的,commitLog -> mappedFileQueue -> mappedFile,其中真正存储数据的是mappedFile。 2. 为什么commitlog每个文件大小是1G > rocketMQ主要通过MappedByteBuffer对文件进行读写操作。MappedByteBuffer这种内存映射的方式有几个限制,其中之一是一次只能映射1.5~2G 的文件至用户态的虚拟内存,这也是为何RocketMQ默认设置单个CommitLog日志数据文件为1G的原因了 3. `nameServer`的作用是什么 > 主要功能是为整个MQ集群提供服务协调与治理,具体就是记录维护Topic、Broker的信息,及监控Broker的运行状态 > > Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步 4. 与`zookeeper`的区别 > NameServer是没有leader和follower区别的,不进行数据同步,通过Broker轮训修改信息.