🔥 100. 如何实现 Spring 应用的健康检查和就绪检查?
健康检查端点:
- /actuator/health:应用健康状态
- /actuator/info:应用信息
- 自定义端点:业务健康检查
就绪检查: - 数据库连接就绪
- 缓存连接就绪
- 外部服务就绪
- 消息队列就绪
K8s 集成: - readinessProbe:就绪探针
- livenessProbe:存活探针
- startupProbe:启动探针(慢启动应用)
🔥 101. 如何设计一个支持实时反欺诈的风控系统?
欺诈类型:
- 身份盗用:异常登录地点、设备
- 交易欺诈:异常金额、异常时间
- 薅羊毛:批量注册、刷单
- 洗钱:资金异常流转模式
技术架构:
- 规则引擎:实时规则匹配(Drools)
- 机器学习:异常检测模型(孤立森林、LSTM)
- 图计算:关联分析(Neo4j、JanusGraph)
- 实时计算:Flink CEP(复杂事件处理)
数据源:用户行为日志、设备指纹、IP 库、黑名单
🔥 102. 如何实现 Spring 应用的零停机部署?
部署策略:
- 蓝绿部署:新旧版本并行,流量切换
- 金丝雀发布:逐步放量,监控指标
- 滚动更新:分批替换,自动健康检查
- 影子流量:复制生产流量到新版本测试
技术实现:
- 服务注册中心:优雅下线(先反注册,再停止)
- 负载均衡器:连接排空(等待现有请求完成)
- 数据库:向后兼容(新版本兼容旧数据)
- 配置中心:动态配置切换
🔥 103. 如何设计一个支持海量日志的检索系统?
日志特点 :半结构化、高吞吐、实时写入、长期存储
技术栈:
- 采集:Filebeat、Fluentd、Logstash
- 存储:Elasticsearch(热数据)、S3(冷数据)
- 索引:倒排索引、分词优化
- 查询:Kibana、Grafana Loki
优化策略: - 索引生命周期管理(ILM)
- 日志结构化(JSON 格式)
- 采样存储(降低存储成本)
- 压缩算法(zstd、lz4)
🔥 104. 如何实现数据库的跨库关联查询?
关联场景:
- 垂直分库:用户库 + 订单库关联
- 水平分库:分表后的跨分片关联
- 异构数据库:MySQL + MongoDB 关联
解决方案:
- 应用层关联:分别查询,内存关联(数据量小)
- 数据同步:ETL 到数据仓库统一查询
- 联邦查询:Presto/Trino 跨数据源查询
- 冗余存储:宽表设计,避免关联
性能考量:网络开销、数据倾斜、索引利用
🔥 105. 如何设计一个支持动态定价的电商系统?
定价策略:
- 成本加成:成本 + 利润率
- 市场竞争:竞争对手价格跟踪
- 动态调价:供需关系、库存压力
- 个性化定价:用户画像、购买历史
架构设计: - 价格计算引擎:规则引擎 + 机器学习
- 价格缓存:Redis 缓存计算结果
- 价格版本管理:A/B 测试、灰度发布
- 审计日志:价格变更记录、操作追溯
实时性:价格实时生效、库存实时更新
🔥 106. 如何实现 Java 应用的内存优化?
内存区域:
- 堆内存:对象实例
- 非堆内存:元空间、线程栈、直接内存
- 堆外内存:Netty DirectBuffer、MMAP
优化策略:
- 对象复用:对象池、线程局部变量
- 减少创建:避免频繁创建临时对象
- 及时释放:及时置 null、关闭资源
- 数据结构优化:原始类型数组 vs 对象数组
工具:JProfiler 内存分析、Eclipse MAT 堆分析
🔥 107. 如何设计一个支持实时聊天的即时通讯系统?
核心功能:
- 一对一聊天、群聊
- 消息推送、已读回执
- 文件传输、图片预览
- 消息漫游、历史记录
技术架构: - 连接层:WebSocket 长连接管理
- 消息路由:基于用户 ID 的路由策略
- 存储层:消息持久化(MySQL + 时序存储)
- 推送层:离线消息推送(APNs、FCM)
扩展性:单聊 → 群聊 → 聊天室 → 直播互动
🔥 108. 如何实现 Spring 应用的链路追踪集成?
链路追踪要素:
- TraceId:一次请求的唯一标识
- SpanId:单个操作的标识
- ParentSpanId:父操作标识
- Tags/Logs:附加信息
集成方案:
- Sleuth + Zipkin:Spring Cloud 标准方案
- SkyWalking:Java Agent 无侵入
- 自研:基于 MDC 和 Filter 拦截
采样策略:
- 固定比例采样(1%)
- 自适应采样(根据流量调整)
- 错误全采样(错误请求 100% 采样)
🔥 109. 如何设计一个支持多租户的任务调度系统?
租户需求:
- 任务隔离:租户只能看到自己的任务
- 资源隔离:CPU、内存、存储配额
- 权限隔离:租户管理员 vs 普通用户
架构设计: - 任务定义:租户级任务模板
- 任务实例:租户级任务执行记录
- 调度器:租户级调度队列
- 执行器:租户级资源池
扩展性:支持定时任务、依赖任务、工作流任务
🔥 110. 如何实现数据库的读写分离和数据同步?
读写分离方案:
- 中间件代理:MyCat、ProxySQL
- 客户端路由:Spring AbstractRoutingDataSource
- 数据库原生:MySQL Router、PostgreSQL pgpool
数据同步工具:
- 主从复制:基于 binlog 的异步复制
- 双向同步:Tungsten Replicator、MaxScale
- 多源复制:多个主库同步到一个从库
一致性保证: - 半同步复制:至少一个从库确认
- 并行复制:多线程加速同步
- GTID:全局事务标识,避免重复执行
🔥 111. 如何设计一个支持实时推荐的内容平台?
推荐算法栈:
- 召回层:协同过滤、内容相似、热门召回
- 粗排层:轻量级模型快速筛选
- 精排层:深度学习模型精细排序
- 重排层:业务规则(去重、多样性、新鲜度)
实时特征:
- 用户实时行为:点击、浏览、搜索
- 内容实时热度:阅读数、点赞数、评论数
- 上下文特征:时间、地点、设备
工程实现:特征工程平台、模型训练平台、在线推理服务
🔥 112. 如何实现 Java 应用的类加载优化?
类加载层次:
- Bootstrap ClassLoader:加载 JDK 核心类
- Extension ClassLoader:加载扩展类
- Application ClassLoader:加载应用类
- 自定义 ClassLoader:插件化、热部署
优化策略:
- 减少类数量:合并小类、移除无用类
- 类加载缓存:缓存已加载类
- 并行类加载:-XX:+UseParallelClassLoading
- 类共享:AppCDS(Application Class-Data Sharing)
工具:-verbose:class 查看类加载过程
🔥 113. 如何设计一个支持多语言的自然语言处理系统?
NLP 任务:
- 分词:中文分词、命名实体识别
- 情感分析:正面/负面情感判断
- 文本分类:主题分类、垃圾内容识别
- 机器翻译:多语言互译
技术栈: - 传统方法:CRF、SVM、朴素贝叶斯
- 深度学习方法:BERT、GPT、Transformer
- 框架选择:TensorFlow、PyTorch、Hugging Face
工程挑战: - 模型部署:TensorFlow Serving、TorchServe
- 性能优化:模型量化、剪枝、蒸馏
- 多语言支持:语言检测、编码处理
🔥 114. 如何实现 Spring 事务的隔离级别控制?
隔离级别:
- READ_UNCOMMITTED:读未提交(脏读)
- READ_COMMITTED:读已提交(Oracle 默认)
- REPEATABLE_READ:可重复读(MySQL 默认)
- SERIALIZABLE:串行化(最高隔离)
问题现象: - 脏读:读到未提交的数据
- 不可重复读:同一事务内两次读取结果不同
- 幻读:同一查询条件返回不同行数
实现原理:MVCC(多版本并发控制)、锁机制
🔥 115. 如何设计一个支持实时监控的告警系统?
告警流程:
- 数据采集:指标收集、日志解析
- 规则匹配:阈值规则、表达式规则
- 告警生成:去重、升级、抑制
- 通知发送:多渠道通知(钉钉、短信、电话)
高级特性:
- 告警收敛:相似告警合并
- 告警升级:长时间未处理自动升级
- 告警恢复:自动检测恢复并通知
- 告警分析:根因分析、关联分析
工具链:Prometheus Alertmanager、夜莺、Zabbix
🔥 116. 如何实现数据库的在线数据迁移?
迁移场景:
- 表结构变更:增加字段、修改类型
- 数据迁移:旧表到新表
- 数据库迁移:MySQL → PostgreSQL
- 分库分表:单表拆分为多表
在线迁移工具: - pt-online-schema-change:不锁表变更
- gh-ost:GitHub 开源,无触发器
- Flyway/Liquibase:版本化迁移
- 自研:双写 + 增量同步
验证步骤:数据一致性校验、性能压测、业务验证
🔥 117. 如何设计一个支持弹性伸缩的缓存集群?
伸缩策略:
- 垂直伸缩:增加单节点内存
- 水平伸缩:增加节点数量
- 读写分离:主从架构,读扩展
- 数据分片:一致性哈希分片
Redis 集群方案:
- Redis Cluster:官方集群,自动分片
- Twemproxy:Twitter 代理,客户端透明
- Codis:豌豆荚开源,支持平滑扩容
- 自研:基于代理层的分片管理
数据迁移:slot 迁移、增量同步、数据校验
🔥 118. 如何实现 Java 应用的代码热更新?
热更新场景:
- 修复线上 bug(不重启)
- 功能开关切换
- 配置项更新
技术方案:
- Java Agent + Instrumentation:字节码替换
- Arthas:在线诊断和热修复
- JRebel:商业工具,支持广泛
- 自定义 ClassLoader:重新加载类
限制:
- 不能修改方法签名
- 不能增加/删除方法
- 不能修改类层次结构
- 静态变量状态保持
🔥 119. 如何设计一个支持多租户的搜索系统?
租户隔离:
- 索引隔离:每个租户独立索引
- 文档隔离:同一索引,租户字段过滤
- 查询隔离:查询时自动添加租户过滤条件
Elasticsearch 实现:
- 别名路由:基于租户 ID 路由到不同索引
- 权限过滤:Search Guard 插件权限控制
- 资源配额:索引级资源限制
性能优化:租户级缓存、查询优化、索引优化