一、语雀-Java并发面试题
1、如何实现主线程捕获子线程异常
1. 为什么不能在try-catch中捕获子线程的异常?
2、什么是happens-before原则?
3、ThreadLocal的应用场景有哪些?
4、ThreadLocal为什么会导致内存泄漏?如何解决的?
1. 解决办法
5、AQS的同步队列和条件队列原理?
1. 同步队列
2. 条件队列
3. 二者区别
6、什么是AQS的独占模式和共享模式?
二、语雀-Mybatis面试题
1、Mybatis的优点有哪些?
2、DO、DTO、VO都是干什么的?
3、Mybatis是如何实现字段映射的?
4、#和$的区别是什么?什么情况必须用后者?
5、Mybatis的工作原理?
6、Mybatis的缓存机制
1. 一级缓存
2. 二级缓存
7、Mybatis用的什么连接池?
三、语雀-Tomcat面试题
1、Tomcat基础
Tomcat 是 Apache Software Foundation 开发的开源 Java Web 服务组件,主要用于 部署和运行 Java Servlet、JSP(JavaServer Pages) 等动态 Web 应用。以下是其核心要点:
1. 核心功能
- Servlet 容器
Tomcat 是 Java Servlet 规范的实现,负责接收 HTTP 请求,调用对应的 Servlet 处理逻辑,并返回响应。 - JSP 支持
将 JSP 文件动态编译为 Servlet,简化 Java 代码嵌入 HTML 的开发。 - Web 应用部署
支持 WAR(Web Application Archive)格式的打包部署,自动解压并运行应用。 - 内置 HTTP 服务器
包含 Coyote 协议引擎,可直接处理静态资源(HTML/CSS/JS)和动态请求,无需额外配置 Web 服务器(如 Nginx)。
2. 技术栈集成
- Java EE(Jakarta EE)兼容
支持 Servlet 5.x、JSP 2.3 等标准,但需注意 Tomcat 10+ 已迁移至 Jakarta EE(如jakarta.servlet包),与旧版 Java EE 不完全兼容。 - WebSocket 支持
提供@ServerEndpoint注解实现 WebSocket 通信,适用于实时交互场景。 - 安全机制
内置 Basic 认证、SSL/TLS 加密、角色权限控制等功能。
3. 典型应用场景
- 开发与测试
快速部署原型应用,调试 Servlet 和 JSP 逻辑。 - 生产环境(中小型项目)
轻量级(约 10MB),适合资源有限的服务器,或作为反向代理(如 Nginx + Tomcat)的一部分。 - 微服务
结合 Spring Boot 等框架,快速构建 RESTful API 服务。
2、过滤器和拦截器的区别是什么?
3、Tomcat与Web服务器(如Apache)之间的关系是什么?
✅Tomcat与Web服务器(如Apache)之间的关系是什么?
四、大营销面试题
1、介绍一下大营销的架构
设计:架构图、拓扑图、用例图、流程图、建模图 | 小傅哥 bugstack 虫洞栈
软件架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。软件架构会包括软件组件、组件之间的关系,组件特性以及组件间关系的特性。软件架构可以和建筑物的架构相比拟。软件架构是构建计算机软件,开发系统以及计划进行的基础,可以列出开发团队需要完成的任务。
该大营销系统采用微服务架构,以高可用性和高性能为核心设计理念,构建了涵盖流量入口、服务治理、数据存储及运维监控的全链路技术生态。前端基于React/Node.js实现多端交互,通过CDN加速与LVS/F5负载均衡集群接收用户请求,结合SSL协议保障传输安全;网关层集成Dubbo RPC框架实现跨服务通信,依托Nacos完成服务注册发现与动态配置管理,并通过DCC动态控制服务熔断、限流、降级机制保障系统稳定性。业务层采用双机房部署模式(4C8G*N规格京东云LVM集群),结合Redis缓存集群、Elasticsearch搜索引擎及MySQL主从同步(通过Canal监听binlog)实现高效数据处理,支持分库分表与读写分离。运维体系集成了Prometheus+Grafana实时监控、Jenkins持续集成、Git版本控制及Jmeter压测工具,配合xxl-job分布式任务调度和RabbitMQ消息队列,形成覆盖部署发布、日志采集、异常预警、性能调优的全方位运维能力,最终通过微信通知与业务监控面板实现闭环管理,整体架构兼具弹性扩展性与技术栈统一性。
2、业务流程图
系统业务功能流程图(Business Functional Flow Diagram,BFD)是一种用于描述和展示系统内业务功能及其之间关系的图形化工具。它通常用于系统分析和设计阶段,以帮助理解和沟通业务流程、功能要求以及系统的各个组件如何协同工作。
- 在该流程中,详细的展示出了系统的业务流转关系,从1~6的用户行为,全面的展示出了系统中的流程动作。怎么抽奖、怎么返利、怎么兑换积分。
- 画这个图到时候,首先,需要识别系统中的主要业务功能。这些业务功能通常可以通过业务需求文档、需求分析会谈以及与业务用户的交流中得出。之后,识别各业务功能之间的关系和依赖性。这包括理解哪些业务功能依赖于哪些其他功能,以及它们如何相互作用。最后,绘制流程图,以图形方式展示业务功能和它们之间的关系。
3、工程分层图
工程的分层有 MVC 三层架构、DDD 四层架构,其实 DDD 不能只是说它是架构,因为用于承载 DDD 的架构是;整洁架构、洋葱架构、六边形架构、菱形架构这些。
- 六边形架构,会把本身提供到外部的放到trigger,让接口调用、消息监听、任务调度,都可以统一一个入口处理。而对于需要调用外部同类的能力统一放到 infrastructure 基础设施层,包括;数据库、缓存、配置、调用其他方的接口。
- querys 模块是为了提供查询设计的模块,这样一些基本简单的查询就不需要再走到 domain 领域层了。
根据提供的简历内容,以下是对两个项目的难点与亮点的分析:
4、项目难点与亮点
1. 仿掘金营销玩法场景-抽奖策略系统
技术难点:
-
高并发场景下的性能优化
• 抽奖决策需支持高并发请求(如秒杀场景),需将时间复杂度从 O(n) 优化至 O(1),这对算法设计和数据结构选择要求极高。 • 库存扣减需防止超卖,同时保证数据库与缓存的最终一致性,涉及分布式事务和异步处理的设计。 -
分布式系统复杂性
• 基于 DDD 领域驱动设计,需合理划分限界上下文(如抽奖策略、积分、奖品等),并协调多服务间的交互。 • 消息队列(RabbitMQ)的可靠性和补偿机制设计,需处理失败重试、消息幂等性等问题。 -
分库分表与路由策略
• 自研分库分表路由组件(DB-Router)需支持动态路由规则(按用户 ID 等字段分库/分表),并保证数据分布均匀性。 • SQL 改写和动态数据源切换需低侵入式集成到现有框架(如 MyBatis),技术实现复杂度高。
技术亮点:
-
创新性技术方案
• O(1) 时间复杂度抽奖算法:通过离散化概率空间和哈希映射表预处理,将抽奖决策效率提升至常数级。 • 责任链模式 + 决策树:实现抽奖前置过滤(黑名单、权重)和后置处理(库存扣减、兜底奖励)的可插拔流程引擎。 -
高可用架构设计
• Redis 分段锁 + 异步持久化:采用 RedisDECR分段消费 +SETNX锁兜底防止超卖,结合延迟队列异步更新数据库,兼顾性能与数据一致性。 • MQ 解耦与补偿机制:通过 RabbitMQ 监听库存变化解耦发奖流程,定时任务补偿失败任务,确保消息可靠性。 -
扩展性与可维护性
• 分库分表路由组件:支持按需分库、分表或混合策略,自定义路由注解简化开发流程。 • DDD 分层架构:通过工厂、策略、模板等模式构建易维护的业务体系,提升代码可扩展性。
2. DB-Router 数据库路由组件
技术难点:
-
动态数据源管理
• 基于AbstractRoutingDataSource实现动态数据源切换,需解决多线程环境下路由上下文(ThreadLocal)的线程安全问题。 -
SQL 改写与路由策略
• 动态解析 SQL 并改写表名(如user_0→user_1),需兼容不同数据库方言(如 MySQL、PostgreSQL)。 • 扰动函数设计:通过哈希散列(如 MurmurHash)实现数据均匀分布,避免分库分表后的热点问题。 -
低侵入式集成
• 基于 AOP 切面拦截自定义注解(如@DBRouter),需在不修改业务代码的前提下实现路由逻辑。
技术亮点:
-
灵活的路由策略
• 支持自定义路由键(如用户 ID、订单号),可配置分库、分表或混合模式,满足不同业务场景需求。 -
高性能与高可用
• 通过扰动函数优化数据分布,减少分片冲突;支持数据库读写分离和主从切换。 -
轻量化与易用性
• 无侵入式集成到 Spring 生态,提供统一路由组件,降低分库分表实施成本。