虾皮 核心搜推后端(上海) ld面
面试
- redis:
- zset 底层数据结构:跳表
- 一致性怎么做
- 延迟双删为什么大家不常用
- 你做的缓存一致性过期时间具体是多少
- ES 了解多少:不了解
- MQ:
- 为什么在搜索这种业务上要用 Kafka
- Kafka 为什么快,列七点
- 批处理具体体现在哪儿
- 零拷贝是什么
- mmap 是什么,你之前用 C++ 肯定经常用吧
- JMM
- 设计模式了解吧,Spring Boot 中用什么设计模式,AOP 什么设计模式
- 微服务的缺陷:
- HTTP 慢要用 RPC,不对
- 复杂度提升,维护成本上升,不对
- 下游依赖服务出问题了怎么办,如何解决:维护快照到缓存,离线数据
- AI 的研究,有没有实现过 RAG,longchain 框架用过吗
- 分布式事务:
- 对账:
- 业务操作阶段:直接执行创建订单的本地事务,同时发送事件,其他服务订阅并异步执行
- 实时对账阶段:轻量级流式快速粗检,通过订单创建时间触发,通知对账服务实时检查数据,若不一致则告警
- 离线对账阶段:天级别的彻查,保证完全的最终一致性,进行事务补偿
- 2PC:
- Prepare 阶段:协调者向所有参与者发送“准备”指令,询问它们是否可以执行事务。执行者执行事务但不提交,并将结果发送给协调者,所有资源均被锁定。
- Commit 阶段:若所有参与者均返回成功,则提交并释放资源。若存在至少一个参与者返回失败,则取消事务回滚并释放资源。
- 3PC:
- CanCommit 询问阶段:协调者询问所有参与者是否准备好执行事务。如果所有参与者都响应“可以”,则进入下一阶段。
- PreCommit 预提交阶段:协调者向参与者发送预提交指令。
- DoCommit/DoRollback 提交/回滚阶段:协调者根据预提交阶段的结果,决定最终是提交还是回滚。
- TCC(Try-Confirm-Cancel):
- Try(尝试):尝试执行业务,完成所有资源的预留或锁定。
- Confirm(确认):确认执行业务,当所有参与者都成功执行了 Try 阶段,协调者会执行 Confirm 阶段,真正完成操作。
- Cancel(取消):取消执行业务,如果任何一个参与者在 Try 阶段失败,协调者会执行 Cancel 阶段,释放所有预留的资源。
- Saga(将分布式事务独立转化为本地事务,以服务为粒度抽象本地事务和补偿事务):
- 按顺序执行事务,检测到异常,以类似栈的顺序执行本地的补偿事务
- 本地事务表:
- 服务 A 执行操作时,原子性地写入消息到本地事务表(持久化介质)中
- A 的本地事务提交,服务 B 订阅并消费消息,执行其本地事务
- 服务 B 不断重试消息直到成功,由 A 的本地事务表记录事务成功与否
- 分布式一致性算法:
- Raft 和 CAP
- 幂等性在多集群 DB 中的落库应该怎么做
- Flink 和 HBase:
手撕
- 删除排序链表中的重复元素
- 合并两个有序数组