27实习 携程AI后端开发一面分享
面试题目
一、项目与基础
- 实习拷打
- 挑一个项目介绍一下
- 项目有没有上线
- 本地缓存加令牌桶控制频率具体怎么做的
- 如何往令牌桶里放令牌(追问:如果很多用户岂不是有很多令牌桶,按顺序放会不会很慢)
- 发消息的服务是否放在多台机器上
- 改造这个算法你会怎么做
- RateLimmiter组件如何做到的
- AT模式和死信队列的关系
- 超卖问题用mysql会出现吗
- 能不能通过mysql去解决这个问题
- 如果RabbitMQ发消息后,消费者去写MySQL的时候失败了怎么办?
- 是否会用ai去解决问题
- java里所有类的公共父类是什么
- Object中equals和hashCode的方法,Java里有个规定是这两个方法必须同时改写,不能只改写其中一个,原因是什么?举例说明
二、手撕算法
- 快速排序
- 有一个很大的整数数组,找出里面最大的10个数字
- 长整形的数字计算它二进制表示一的个数
参考解析
1. 令牌桶限流与高并发处理: 令牌桶通常基于AtomicLong或Semaphore实现,应对多用户场景可使用Redis的Lua脚本原子化操作。大规模并发下,应避免串行阻塞,采用滑动窗口或基于Redis Cluster分布式存储,提升吞吐量。
2. RabbitMQ消息可靠性(消费者写库失败): 采用确认机制(ACK)。若写库失败,建议引入重试机制(如本地重试+延时队列),或在数据库中记录处理记录,通过幂等逻辑(如全局唯一ID/分布式锁)保证多次消费不影响数据一致性。
3. Equals与HashCode的约定: 根据Java规范,若两对象equals相等,其hashCode必须相等。若只重写equals不重写hashCode,会导致对象在放入HashMap等集合时,因哈希值不同无法找到对应的Entry,破坏集合的唯一性约束。
4. 找最大TopK数字: 针对海量数据,最优解是维护一个大小为10的最小堆(Min-Heap)。遍历数组,当前数大于堆顶则替换并重新调整堆,时间复杂度为O(N log K),比全排序快得多。