🔥 41. 如何设计一个支持多租户的缓存策略?
隔离要求:租户数据完全隔离,缓存高效利用
方案:
key 前缀隔离:tenant:{tenantId}:user:{userId}
独立 Redis 实例/数据库:完全物理隔离
缓存命名空间:Redis 的 select 命令(不推荐生产)
优化:
租户级缓存统计和监控
热点租户缓存资源倾斜分配
缓存穿透防护(布隆过滤器)
缓存雪崩防护(随机过期时间)
🔥 42. 如何实现一个可靠的分布式任务编排系统?
场景:多个微服务任务需要按特定顺序执行
架构模式:
工作流引擎:Camunda、Activiti
状态机:Spring State Machine
基于消息的 Saga 编排
自研 DSL 任务描述语言
可靠性保证:
任务状态持久化
补偿任务定义
超时和重试策略
可视化监控和干预
🔥 43. Spring AOP 如何实现方法执行时间的监控?
实现方式:
注解方式:自定义 @MonitorTime 注解
切点表达式:匹配特定包或方法
Around 增强:记录开始和结束时间
优化考虑:
异步记录日志(避免影响主流程)
采样率控制(高频方法抽样监控)
耗时分布统计(p50/p90/p99)
关联 TraceId(链路追踪)
🔥 44. 如何设计一个支持动态扩容的数据库架构?
扩容场景:
读扩展:读写分离、缓存层、CDN
写扩展:分库分表、时序数据库、NewSQL
存储扩展:对象存储、分布式文件系统
平滑扩容方案:
双写阶段:新旧集群同时写入
数据迁移:增量同步工具
流量切换:逐步切流验证
回滚预案:随时可回退
工具链:ShardingSphere 在线扩容、TiDB 自动调度
🔥 45. 如何实现接口的敏感数据脱敏?
脱敏场景:
日志输出:手机号、身份证、银行卡号
接口返回:根据用户权限差异化返回
数据导出:批量导出时脱敏
技术实现:
注解驱动:@SensitiveData + 序列化定制
AOP 切面:方法返回结果后处理
数据库代理层:查询结果实时脱敏
字段级加密:存储加密,按需解密
合规要求:GDPR、个人信息保护法
🔥 46. 如何优化 Spring 应用的启动时间?
分析工具:
Spring Boot Startup Endpoint(/actuator/startup)
JFR(Java Flight Recorder)录制启动过程
AsyncProfiler 火焰图分析
优化手段:
延迟初始化(@Lazy)
排除不必要的自动配置
并行初始化(@Async Configuration)
类路径优化(减少 jar 扫描)
AOT 编译(Spring Native)
🔥 47. 如何设计一个高可用的文件上传服务?
需求:断点续传、分片上传、秒传、图片处理
架构设计:
前端:WebUploader、Plupload 分片
网关:Nginx 直接上传(避免应用服务器压力)
存储:对象存储(OSS/S3)vs 自建分布式存储
处理:异步队列处理(缩略图、水印、转码)
扩展功能:
病毒扫描(ClamAV)
内容审核(敏感图片识别)
版权检测(重复文件识别)
🔥 48. 如何实现数据库的读写分离和故障自动切换?
读写分离:
中间件:MyCat、ShardingSphere
客户端:Spring AbstractRoutingDataSource
代理层:ProxySQL、MaxScale
故障切换:
健康检查:定期探测主从库状态
切换策略:手动确认 vs 自动切换
数据一致性:切换后数据同步状态检查
客户端通知:配置中心推送新数据源配置
🔥 49. 如何设计一个支持多语言的消息推送系统?
推送渠道:
移动端:APNs(iOS)、FCM(Android)
Web 端:WebPush、WebSocket
短信:阿里云、腾讯云
邮件:SMTP、邮件服务商 API
统一抽象层:
消息模板管理(支持变量替换)
渠道路由策略(用户偏好、到达率)
发送状态追踪(已发送、已到达、已阅读)
降级策略(主渠道失败切备用渠道)
🔥 50. 如何实现 Spring Bean 的动态注册和注销?
动态场景:
插件系统:运行时加载新功能
多租户:按租户动态创建数据源
配置驱动:根据配置开关 Bean
实现方式:
BeanDefinitionRegistry 编程式注册
@Import 动态导入配置类
自定义 BeanFactoryPostProcessor
使用 GenericApplicationContext
生命周期管理:
依赖注入完整性保证
销毁钩子注册
循环依赖检测
🔥 51. 如何设计一个支持实时数据同步的缓存架构?
场景:数据库更新后,缓存需要实时或准实时更新
同步策略:
写后删除缓存(Cache-Aside):简单但存在不一致窗口
写后更新缓存:保证强一致,但更新可能失败
基于 binlog 的异步更新(Canal/Debezium):最终一致,解耦
双写一致性:事务内同时更新 DB 和缓存
难点:缓存穿透、缓存击穿、缓存雪崩防护
🔥 52. Spring Security 如何实现动态权限管理?
需求:权限可配置、角色可分配、接口可授权
架构:
RBAC(Role-Based Access Control)模型
权限表设计:用户-角色-权限多对多关系
动态 URL 权限匹配:AntPathRequestMatcher
方法级权限控制:@PreAuthorize、@PostAuthorize
扩展:
数据权限(行级、列级过滤)
操作日志(谁在什么时候做了什么)
权限变更实时生效(无需重启)