← 全部案例研究

12 年企业案件管理平台(匿名)

发布于 2026年9月1日

背景

这个故事的顶层是一个案件管理系统:美国某社会服务机构用它登记无家可归者、协调他们获得的帮助,每个个案工作者的日常都经过它。但真正值得剖析的是系统脚下的东西——一套用来生成业务系统的应用平台:关系数据管理、基于 Web 的协同处理、分布式企业数据的无缝访问,外加一整套紧密整合的功能模块与工具,用于组装新的应用系统。案件管理是它承载的旗舰业务,而"不同客户的特殊需要能在平台上灵活满足"是它存在的理由。

两条约束贯穿十二年:业务连续性压倒一切(系统不能停);数据天然分散(SQL Server 与 Oracle 异构并存,必须无缝访问)。

我的角色

20 人团队,我负责平台的地基——所有业务模块脚下踩着的那一层:

  • 数据操作引擎(平台关系数据管理的核心):读取、刷新、更新数据源收敛到一个统一接口后面,业务团队从不手写裸数据访问代码
  • 网关与身份:反向代理(YARP)、验证,以及每个服务都要用的公共操作类库
  • 三个服务域及其多年升级:Account Server、Chat Server、Library Server
  • 横向工具:数据转换工具、短链接服务、数据库复制工具

平台的目标是让业务系统"生成得快、跑得稳";我的职责是让这一切站在同一块地基上。在二十人的团队里,"负责地基的开发"是一种特殊的信任:你的模块挂了,所有人的都挂。

技术决策

六代演进,零推倒重写。从 2007 年的 VB.NET + WinForms 起,平台跨过 Silverlight、ASP.NET MVC、AngularJS SPA、Angular + .NET Core,走到今天的 .NET 8 微服务;数据层始终是 SQL Server(按负载分别用 EF 与 Dapper),部署从本地服务器走向云。每一代都是在线迁移而非绿地重启——前端的五张脸换过,数据引擎纹丝不动,这是分层锁定的回报:

六代平台演进

这些升级里沉淀的判断是:长期系统死于被跳过的升级,远多于死于被认真做完的大升级。

我最自豪的工作:跨库复制管线。平台承诺"分布式企业数据的无缝访问",而现实是千万行级的 SQL Server → Oracle 同步。早期版本又慢又偶尔丢数据;最终架构让丢数据在构造上不可能、让重投天然无害——源端 Change Tracking 在引擎内捕获变更(写事务零负担),交付窗口物化后经拉模式 API 分页出站;Oracle 端 Windows Service 幂等写入、逐行确认,服务端游标只在连续确认段上前进:未确认的自动重投,行级失败(约束冲突)走独立重试通道、永不阻塞整体窗口。结构化错误跟踪把漂移定位到具体的行,健康状态一条查询可答,异常即时邮件报警:

复制管线架构

五千万行的整表更新以 1,316 行/秒端到端走完,五表并发聚合 17,306 行/秒——但这条管线最难的部分从来不是速度,是失败的可读性:任何时刻,每一行数据处于什么状态都有答案。它后来沉淀为独立的 ReplicationServer,完整的设计、失败模型与度量数据见专门的案例研究。

"同步健康吗?"从一次排查变成一条状态查询——这不是锦上添花,这是值班的人能不能睡觉的区别。

结果

12年 · 一个平台
6代演进 · 零推倒重写
10M+行跨库同步 · 零丢失
1个数据引擎 · 前端五换脸

十二年,一个平台,六代技术,零次重写。它交付的不只是一个案件管理系统,而是一种能力:业务系统可以在不惊动地基的前提下,一代一代地换装前行。