共计 1832 个字符,预计需要花费 5 分钟才能阅读完成。
传统架构的三大痛点
- 状态流转高度耦合 :评审流程中的
初稿提交→格式审查→专家分配→多轮评审等状态变更深埋在单体数据库事务中,任何环节变更都需要全量回归测试 - 峰值流量应对不足 :截稿日前 48 小时提交量占总量 70% 以上,单体架构下 MySQL 连接池经常被撑爆,导致
HTTP 503服务不可用 - 扩展性成本高:PDF 解析等 CPU 密集型操作与非 CPU 敏感的评审逻辑竞争资源,垂直扩展性价比极低
微服务拆分策略
领域边界划分
采用事件风暴(Event Storming)工作坊识别出核心领域模型:

- Submission Service:处理论文元数据及文件上传,采用
S3兼容存储 - FormatCheck Service:验证 PDF 格式规范(如页数、字体嵌入),集成
Apache PDFBox - Review Orchestration:状态机驱动的评审流程控制,核心代码如下
状态机实现(Spring StateMachine)
@Configuration
@EnableStateMachineFactory
public class ReviewStateMachineConfig {
@Bean
public StateMachinePersister<ReviewStates, ReviewEvents, String> persister() {return new DefaultStateMachinePersister<>(new JpaStateMachineRepository());
}
@Bean
public Guard<ReviewStates, ReviewEvents> timeoutGuard() {
return ctx -> {Review review = ctx.getExtendedState().get("review", Review.class);
return Duration.between(review.getUpdateTime(), Instant.now())
.toDays() > 14; // 超 14 天自动驳回};
}
}
分布式事务设计
TCC vs SAGA 选型
| 维度 | TCC 模式 | SAGA 模式 |
|---|---|---|
| 一致性 | 强一致(预留资源) | 最终一致(补偿事务) |
| 复杂度 | 需实现 Try/Confirm/Cancel | 只需正向事务 + 补偿逻辑 |
| 适用场景 | 资金类操作 | 长周期业务(如评审流程) |
最终选用 SAGA 模式,因为:
- 评审流程平均持续 45 天,不适合长时资源预留
- 补偿逻辑明确(如撤回评审邀请只需发邮件通知)
异步化改造实践
RocketMQ 幂等处理
@Component
@RocketMQMessageListener(topic = "SUBMISSION_TOPIC", consumerGroup = "format_check_group")
public class FormatCheckConsumer implements RocketMQListener<MessageExt> {
@Override
@Transactional(rollbackFor = Exception.class)
public void onMessage(MessageExt message) {String msgId = message.getMsgId();
if(redisTemplate.opsForValue().setIfAbsent("MSG_"+msgId, "1", 24, HOURS)) {// 实际处理逻辑}
}
}
性能优化指标
JMeter 压测报告(4C8G Pod ×3)
| 并发量 | 平均延迟 | 99 线延迟 | DB 连接池使用率 |
|---|---|---|---|
| 1000 | 83ms | 142ms | 68% |
| 3000 | 121ms | 187ms | 92% |
| 5000 | 164ms | 213ms | 100% |
关键优化点:
- 调整 HikariCP 的
maximumPoolSize为CPU 核心数 × 2 + 有效磁盘数 - 对评审意见表启用
TiDB分库分表
生产环境避坑指南
- PDF 解析内存限制:Docker 需配置
-m 2g --oom-kill-disable,避免 OOM Killer 误杀进程 - 专家分配冷启动 :新会议初期用
PageRank 算法计算学者影响力,后期切换为协同过滤 - 跨时区处理 :所有时间戳存 UTC,前端按
Intl.DateTimeFormat本地化展示
开放性问题
如何利用强化学习(Reinforcement Learning)优化论文自动分派?可能的思路:
- 将评审结果质量作为 reward 信号
- 定义 action space 为{接受,拒绝,转其他专家}
- 用 DQN 建模学者研究方向与论文匹配度
期待在 2026 年会议上看到更多工程实践分享!
正文完
