ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

得物社招面试经验

得物社招面试经验

1、自我介绍;
答:xxx xxx


2、介绍一两个比较熟悉的项目;
答:项目太多太杂,只介绍了一个类似于电商场景的项目;


3、你项目中用过kafka,那么在kafka在消息投递过程中有没有可能丢掉消息?那生产端ACK的类型有哪些?

答:可能会丢掉消息。生产端ACK类型没答上来?想到的流程就是生产者投递消息到broker,broker返回ack告诉生产者收到消息的流程。

面试官想要的答案:
acks=0,生产者不等待任何确认,消息可能因网络问题丢失,适用于对可靠性要求低的场景。‌
acks=1‌(默认):生产者仅等待领导者副本确认,若领导者写入成功但未同步至所有副本时发生故障,消息可能丢失。
acks=all‌(或acks=-1):生产者等待所有同步副本确认,可靠性最高但延迟最长,适用于金融等对数据完整性要求高的场景。


4、那再说消费端,如果partition数量大于消费者数量,消息是怎么分发的?

答:此处一下子也没想到。。。我只记得一般消费者组的consumer的数量与partition的数量一致。当时问大于的时候我想到了是不是要说负载均衡,哈希一致性算法之类的。不确定没回答。

面试官想要的答案:
同一个partition内的消息只能被同一个消费者组中的一个消息消费;
那么如果partition数量大于消费者数量,多个partition会被一个消费者消费。负载均衡策略有下面几种,
1)Round-robin(轮询):这是最简单也是最常见的负载均衡策略。当有新的消费者加入消费者群组或者有分区需要重新分配时,Kafka按照轮询的方式将分区依次分配给消费者实例。这意味着每个消费者实例依次接收到一个分区,然后循环往复。轮询策略适用于消费者实例处理能力相当的情况。
2)Range(范围):这种策略会将主题分区根据分区ID的范围进行分配。每个消费者实例被分配一定范围的分区。例如,如果一个主题有10个分区,而消费者群组有4个消费者实例,则第一个消费者实例被分配分区0-2,第二个消费者实例被分配分区3-5,依此类推。范围策略适用于消费者实例的处理能力不同的情况,可以更合理地分配负载。
3)Capacity-based(基于处理能力):这种负载均衡策略根据消费者实例的处理能力来进行分配。在消费者实例加入消费者群组或者分区需要重新分配时,Kafka会根据每个消费者实例的处理能力(例如,每秒处理消息的数量)来动态调整分配。较强的消费者实例会被分配更多的分区,以确保整体上的负载均衡。基于处理能力的策略适用于消费者实例的处理能力差异较大的情况。

在这里插入图片描述


5、项目里的超时取消是怎么做的?

答:定时任务用的ElasticJob去实现的,因为业务体量较小,我们直接定时任务轮训订单是否超时,超时则取消订单。如果说数据量比较多的话,这种方案就不太适合,轮训数据库表没有走索引会全表扫描,影响效率,还会增大数据库压力。然后介绍了使用队列的方法,如果用Java自带的延迟队列DelayQueue,把订单Id+时间戳放在队列,然后while(true)不断轮训队列,这样当订单数据量大的话,也会把队列撑满,且应用重启后数据丢失,所以不合适。还可以使用Redis去实现延迟队列。这里说的有点多,其实还准备说RocketMQ和RabbitMQ消息中间件,面试官直接开始提问了。

追问:Redis的延迟队列底层数据结构选用哪种?
答:List(此处答错)。

追问:List那不是也要遍历所有元素,然后比较时间戳。
答:是的,ZSet数据结构适用于排行榜那些(此时其实已经说到答案上了,但是没想清楚)。

面试官想要的答案:
redissonClient.getDelayedQueue延迟队列使用的是sorted set,它能够存储不重复的元素,且将这些元素按照score进行排序,我们可以通过zrangebyscore配合当前时间戳来查询并移除这些元素。

追问:Java的延迟队列怎么实现的?

答:实现了Delayed接口,然后把订单对象塞到延迟队列里,然后起一个监听线程监听延迟队列。

追问:为什么要实现Delayed接口?

答:卡顿了,我(没记起来)。

面试官想要的答案:
DelayQueue延迟队列的take方法里需要队列里任务的延迟时间戳,然后根据延迟时间戳判断这个任务是否需要出队列还是继续等待。


6、你项目里用到了ElasticJob对吧,那你能说说ElasticJob和Spring自带的@Schedule的区别吗?

答: 我们当时是封装好的ElasticJob,有定时任务平台,用法上和@Schedule没有啥区别。(没答上来)

面试官想要的答案:
ElasticJob是专业的分布式任务调度框架,支持高并发、弹性扩容和故障转移,适用于大规模任务调度场景。@Scheduled是Spring Boot内置的轻量级定时任务解决方案,更适合简单周期性任务处理。


7、你还有什么想问的吗?

答到这里感觉已经GG了,面试官人还是蛮不错的,自己没有准备好。

返回列表