type
status
date
slug
summary
tags
category
titleIcon
password
icon
calloutIcon
技术重点在三个方面:幂等性保障|延迟任务|合并写,除去这一部分,其他主要为基本业务,简单且量大,对初学友好,如果不是第一次做微服务项目,选看这三个方面就可以跳了。文中图片与代码块较多,善用展开懒加载。
接口幂等性(数据库唯一约束);分库分表的主键id(雪花/Redis);高并发写优化(MQ改异步写/Redis合并写请求);RabbitMQ;SpringTask单机定时任务;@PostConstruct生命周期Hook;Spring Data Redis逆天API;定时任务持久化播放记录;区分Spring与Swagger的@RequestBody注解;Interface常量类;Delayed单机延迟任务;Caffeine本地缓存;自动装配
接口设计通用思路
根据产品原型确定:
- 请求方式(如果公司没有要求POSTful,而是RESTful实践)
- 请求路径
- 请求参数(分页的Query,传参的DTO)
- 请求返回(VO)
接口幂等性保障
数据库唯一约束
- 数据库添加唯一约束,多次调用会触发数据库异常。

Redis保存唯一标识
- 保存当前订单id于Redis中,保存一段时间(如60s),业务先判断当前订单id是否在Redis中,如果有数据就不再调用业务。
业务表主键id选取
- 雪花id/Redis生成(考虑分库分表)
- 自增id(不考虑分库分表)
高并发优化思路
提高单机并发
- 通过减小业务接口响应时间,提升单机性能与并发。
缩短业务响应时间
读优化
- 优化代码,SQL
- Redis缓存数据
写优化
- 优化代码,SQL
- 同步写改异步写(MQ实现),仅发送MQ通知,不等待业务执行。
- 不需要等待业务执行,可以显著减少响应时间。
- 利用MQ暂存消息,流量削峰。
- 降低数据库写频率,减轻数据库压力。
- 依赖MQ可靠性。
- 不减少写次数。
- 业务复杂,链路较长,多次写操作的业务。
优点
缺点
场景
- 合并写请求,先将每次数据更新到Redis,定期将缓存数据批量写入数据库。
- 写入Redis显著快于MySQL,可以减少响应时间。
- 降低数据库写频率与减少写次数,减轻数据库压力。
- 不支持事务。
- 复杂业务实现复杂。
- 依赖Redis可靠性。
- 写频率高,写业务简单的场景。
优点
缺点
场景
水平扩展
- 对热点服务进行水平扩展,负载均衡,提高整个集群并发能力。
服务保护
- 通过服务熔断与降级保护提高服务高可用性。
延时任务(写合并)
业务场景
- 订单超时自动取消
- 下单成功短信通知
实现方式
- Java API,DelayQueue(√)|ScheduledExecutorService (单机)
- Redisson,Redis数据结构模拟DelayQueue
- MQ延迟消息 (分布式)
- 分布式调度XXL-JOB (分布式)
- Netty时间轮
项目使用
业务情景
- 合并写,合并多次播放记录写,仅写入用户最后一次提交的播放记录。
- 延迟任务,更新Redis后(前端15s提交一次更新请求)提交延迟任务,在20s后获得的延迟任务里查询Redis检查本次与上回数据是否一致,一致则为最后一次,写回数据库。

业务实现
展开





ES与MySQL同步方式
- MQ方式,实时性好,不能批量。
- Canal伪装MySQL从库,数据同步。
- (LogStash)定时任务同步,不即时,可批量更新。
- RPC方式,响应时间长。
Day02课表练习参考实现
删除课表中课程
检查课程是否有效
展开

查询用户课表中指定课程状态
展开

统计课程的学习人数
展开

Day03练习参考实现
课程过期SpringTask定时任务
展开

Day04练习参考实现
延迟任务线程池改造
展开


定时任务持久化播放记录
展开






Day05练习参考实现
修改问题
展开

删除问题
展开

管理端隐藏或显示问题
展开

管理端根据id查询问题详情
展开



新增回答或评论
展开

分页查询回答或评论列表|管理端分页查询回答或评论列表
展开



管理端显示或隐藏评论
展开

其他注意事项
区分Spring与Swagger的@RequestBody注解

代码参考模板
RabbitMQ消费者模板

Interface常量类模板

SpringTask定时任务模版
启动类

定时任务类

DelayQueue单机延迟任务模板
DelayTask任务定义





Caffeine模板|自动装配




自动装配模板


Openfeign模板|自动装配

了解更多
- 作者:CamelliaV
- 链接:https://camelliav.netlify.app/article/tjxt-day02-05?target=comment
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。