java社招练题app_Java社招面试题

### 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轮训修改信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值