携程AI后端开发实习一面面经
《面试题目》
- 实习经历深挖
- 项目介绍及上线情况
- 本地缓存与令牌桶限流的实现细节
- 令牌桶放入令牌的逻辑
- 消息队列服务在多机部署下的处理
- 算法改造思路
- RateLimiter组件实现原理
- AT模式与死信队列的关系
- MySQL处理超卖问题的可行性分析
- RabbitMQ消费侧MySQL写入失败的异常处理机制
- AI工具在开发中的应用
- Java中所有类的公共父类
- equals与hashCode同时改写的必要性及举例
手撕算法:
- 快速排序
- 从大数组中查找前10个最大值
《参考解析》
- 令牌桶限流:令牌桶以固定速率向桶内放入令牌,请求需获取令牌才能通过。RateLimiter底层基于Semaphore或同步原语控制获取节奏,支持平滑突发限流。
- 分布式事务(AT模式):AT模式是Seata提供的一种无侵入式方案,通过记录undo_log实现回滚。死信队列用于处理消费失败后的兜底,两者均属于分布式场景下的稳定性保障机制。
- 超卖问题:在MySQL中可用
UPDATE table SET stock = stock - 1 WHERE stock > 0配合数据库行锁解决,但在高并发下数据库压力大,通常引入Redis预减库存。 - 消息消费失败处理:可通过ACK机制、重试机制、本地消息表或死信队列解决。最严谨做法是保持消费的幂等性,并使用本地事务结合消息表保证最终一致性。
- equals与hashCode:Java规定如果两个对象equals返回true,则hashCode必须相等。如果不成对重写,在HashMap等集合中,相同的对象可能被存储在不同的桶中,导致无法正确检索。