2026/5/19 0:09:19
网站建设
项目流程
专业网站建设设计公司,网站开发流程人物,一台服务器怎么做多给网站,辛集建设局网站Java实习模拟面试#xff5c;上海禾赛科技后端实习一面面经#xff1a;高并发数据去重、事务与MQ一致性、反射争议与缓存选型深度解析关键词#xff1a;禾赛科技后端实习#xff5c;Java高并发#xff5c;消息可靠性#xff5c;事务传播行为#xff5c;Redis vs 本地缓存…Java实习模拟面试上海禾赛科技后端实习一面面经高并发数据去重、事务与MQ一致性、反射争议与缓存选型深度解析关键词禾赛科技后端实习Java高并发消息可靠性事务传播行为Redis vs 本地缓存反射破坏封装线程池调优CSDN面经在准备2025届暑期实习的过程中我针对上海禾赛科技Hesai Tech的Java后端岗位进行了一场高度仿真的模拟一面。作为一家专注于激光雷达与智能感知系统的硬科技公司其后端系统对数据可靠性、高并发处理、跨服务通信一致性有极高要求。本文以真实对话形式还原整场60分钟面试采用“面试官提问 候选人口头回答 连环追问”结构覆盖项目深挖、并发基础、Spring事务、缓存选型、反射哲学、MQ可靠性设计六大核心模块助你精准把握硬科技公司对实习生的技术期待1. 拷打上一份实习如何保证数据可靠、去重、高并发面试官提问你在上一段实习中提到处理大量传感器上报数据怎么保证数据不丢、不重、高并发写入我我们面对的是每秒数万条设备上报的原始点云元数据核心挑战是幂等写入 高吞吐 低延迟。我们的方案分三层1去重机制每条数据携带全局唯一trace_id由设备生成符合UUIDv7规范。写入前先查Redis布隆过滤器Bloom Filter若不存在 → 放行若存在 → 再查 MySQL 唯一索引trace_id做二次校验避免布隆误判。布隆过滤器定期滚动如每小时重建防止内存无限增长。2高并发写入使用ShardingSphere 分库分表按device_id % 16分片分散写压力。批量插入Kafka消费者攒批1000条/批 or 100ms超时用INSERT ... ON DUPLICATE KEY UPDATE实现幂等。3可靠性保障Kafka 生产者开启acksall 幂等enable.idempotencetrue消费者手动提交 offset确保“处理成功才提交”。追问如果 Redis 宕机布隆过滤器失效会不会导致大量重复请求打到 DB我会所以我们做了降级策略当 Redis 不可用时自动跳过布隆过滤直接走 MySQL 唯一索引同时触发告警运维介入虽然 QPS 会短暂下降因 DB 唯一索引冲突回滚但数据正确性不受影响。2. List 和 Set 的区别面试官提问说说List和Set的核心区别我特性ListSet有序性有序按插入顺序无序除 LinkedHashSet重复元素允许不允许典型实现ArrayList, LinkedListHashSet, TreeSet, LinkedHashSet底层结构ArrayList: 动态数组LinkedList: 双向链表HashSet: HashMapkey-onlyTreeSet: 红黑树使用场景List需要保留插入顺序、允许重复如日志记录、任务队列Set去重、快速查找如用户ID集合、权限校验。3. 如何实现线程面试官提问Java 中创建线程有哪几种方式我主要有三种继承Thread类不推荐Java单继承限制实现Runnable接口常用解耦任务与线程实现CallableVFutureTask支持返回值和异常现代最佳实践永远不要手动 new Thread()而是使用线程池如Executors或ThreadPoolExecutor避免资源耗尽。4. 线程池核心参数 如何设置面试官提问线程池有哪些核心参数怎么合理设置我ThreadPoolExecutor七大参数newThreadPoolExecutor(intcorePoolSize,// 核心线程数常驻intmaximumPoolSize,// 最大线程数longkeepAliveTime,// 空闲线程超时时间TimeUnitunit,BlockingQueueRunnableworkQueue,// 任务队列ThreadFactorythreadFactory,RejectedExecutionHandlerhandler// 拒绝策略);如何设置看任务类型CPU密集型如计算core CPU核数 1IO密集型如DB/网络core 2 * CPU核数经验值队列选择高吞吐LinkedBlockingQueue无界慎用可能OOM控制资源ArrayBlockingQueue有界配合拒绝策略拒绝策略生产环境建议自定义记录日志 告警而非直接抛异常。5–6. Spring 事务方式 传播行为面试官提问Spring 有哪两种事务管理方式事务传播行为有哪些我两种方式编程式事务TransactionTemplate手动控制灵活但冗余声明式事务Transactional注解主流AOP实现七种传播行为重点记前3个行为说明REQUIRED默认有事务则加入无则新建REQUIRES_NEW挂起当前事务新建独立事务SUPPORTS有事务则用无则非事务执行NOT_SUPPORTED挂起事务非事务执行MANDATORY必须在事务中否则抛异常NEVER不能在事务中否则抛异常NESTED嵌套事务Savepoint回滚典型场景日志记录用REQUIRES_NEW避免主业务回滚导致日志丢失批量处理用NESTED单条失败不影响整体。7. Redis 与本地缓存的优点对比面试官提问Redis 和 Caffeine/Guava 这类本地缓存各有什么优劣我维度Redis分布式缓存本地缓存Caffeine访问速度~1ms网络开销~100ns内存直取一致性强可集群同步弱各节点独立容量GB~TB级受限于单机内存高可用主从哨兵/Cluster无进程挂即丢适用场景跨服务共享数据如用户会话高频读、低变更数据如配置、字典最佳实践多级缓存先查本地缓存 → 未命中查 Redis → 再查 DB并异步回填两级缓存。8. Spring 预先加载的注解和顺序面试官提问Spring Bean 初始化时哪些注解控制加载顺序我关键注解及其执行顺序构造函数注入Autowired/Resource字段/方法注入PostConstruct初始化方法InitializingBean.afterPropertiesSet()init-methodXML或Bean指定注意PostConstruct是 JSR-250 标准比 Spring 特有接口更通用。9–10. 如何访问私有方法反射破坏封装了吗面试官提问怎么调用一个类的私有方法这是否破坏了面向对象的封装性我访问私有方法Methodmethodclazz.getDeclaredMethod(privateMethod);method.setAccessible(true);// 绕过访问检查method.invoke(obj);是否破坏封装我的观点工具无罪滥用有害。合理场景单元测试Mock私有逻辑、框架开发如Spring AOP代理风险破坏类的不变性invariants导致难以维护设计原则优先通过公有接口暴露能力若必须用反射应加安全校验如模块权限控制。JDK9 模块系统JPMS已限制跨模块反射进一步强化封装。11. Java 常见的锁实现面试官提问Java 中有哪些常见的锁我锁类型实现特点synchronizedJVM内置Monitor自动加解锁不可中断ReentrantLockAQSAbstractQueuedSynchronizer可中断、超时、公平锁ReadWriteLockReentrantReadWriteLock读写分离提升并发StampedLock乐观读tryOptimisticRead性能更高但复杂分布式锁RedisSETNX、ZooKeeper跨JVM协调选型建议简单同步 →synchronizedJVM优化后性能接近ReentrantLock需要超时/公平 →ReentrantLock读多写少 →ReadWriteLock。12. 并发多线程需要注意的问题面试官提问写多线程程序要注意哪些坑我五大核心问题可见性用volatile或锁保证主存同步原子性复合操作如 i需加锁或用AtomicInteger有序性指令重排序可能导致逻辑错误volatile/锁禁止重排死锁避免嵌套锁、按固定顺序加锁线程安全类误用如SimpleDateFormat非线程安全应改用DateTimeFormatter。调试工具jstack查死锁Arthastrace 方法耗时。13. MQ 消息发生在事务前还是事务后合适面试官提问在数据库事务中MQ 消息应该在 commit 前发还是后发我绝对不能在 commit 前发否则可能事务回滚 → 消息已发 →下游收到无效消息数据不一致正确做法最终一致性事务内写 DB 写消息表与业务表同库同事务事务外异步扫描消息表发送 MQ成功后删除记录进阶方案本地消息表如上RocketMQ 事务消息半消息 回查Seata TCCTry-Confirm-Cancel14. 场景题如何可靠推送消息给外部公司服务面试官提问你们要通过 MQ 推送数据给合作公司的 HTTP 服务如何保证不丢失、不重复、顺序正确我这是一个典型的跨系统最终一致性问题我的方案如下1消息生产端我们使用持久化队列如 RocketMQ/Kafka 副本开启生产者幂等 ACKall消息体包含msg_id全局唯一、biz_seq业务序号、payload2消息消费端我们→ 外部HTTP可靠投递消费后先存 DB状态“待发送”调用外部 HTTP 接口带 retry 超时成功 → 更新状态“已发送”失败 → 加入重试队列指数退避幂等接收要求对方支持请求头带X-Request-ID: msg_id对方基于msg_id去重3兜底机制对账系统每天比对我们 DB 与对方回执日志修复差异人工干预入口支持重推单条消息。关键原则我们只保证“尽力送达”最终一致性靠双方协同。总结禾赛科技一面考察重点模块考察意图复习建议项目深挖工程落地能力、故障意识准备“问题-方案-结果”案例并发基础线程、锁、线程池动手写 Demo 验证Spring 事务分布式系统一致性基石理解传播行为 事务边界缓存选型性能 vs 一致性权衡对比 Redis/Caffeine/EhcacheMQ 可靠性跨系统协作核心掌握本地消息表、事务消息硬科技公司特点不追求炫技但极度重视系统稳定性、数据准确性、可维护性。回答时多提“监控”、“降级”、“对账”、“幂等”等关键词觉得这篇面经有帮助欢迎点赞 收藏 关注