十一假期,本来想找一本书读一读。机缘巧合就找到了这本《交易时间》。这本书主要讲了上海证券交易系统在技术管理、架构设计、应用调优、切换部署、运行维护等方面的经验和教训。成书的时间大概是在2010年,交易系统的上线时间大概在2008年,聚现在已经接近十年了,但是书中介绍的很多开发时候的原则和思路放在今天来看也有很大的价值可以学习。同时,这也是一本介绍大型系统开发的简要过程的参考书目。
本书涉及了不少的证券相关知识,涉及证券知识的章节我就略读做了解。对剩下的关于大型系统的设计,管理,架构,优化相关的章节进行了精读,记录相关笔记供自己回顾和思考。
大型系统的管理
团队管理:
将整个系统自上而下的分割为多个松耦合的且相对独立的系统,这样来避免出现整个系统级的问题,遇到问题分而治之。在系统初期设计系统时隐藏细节实现,提前发现系统总体架构上的缺陷,提前修正。各个独立的小系统可用分别的启动,评审,开发测试。
配合系统分制的结构,人员也分解为小团队。团队目标一致,团队内的文档,设计,代码均是公开的,团队成员都是知晓的。
系统的设计和开发过程中,团队成员在有纪律和规则的前提下进行发散和创新。团队中应该有一个人来确保,讨论以后收敛结论,保证团队“有序”和“规则”。无限的发散只会带来大量内耗。
项目质量
这一部分,没有什么争议,对于测试的重要性,应该已经是开发人员公认的公理。
保证测试时间。
测试范畴推广,作者指出,不但要对代码进行测试,还需要对文档,设计提前测试。
纠错优于创新。
面向変更
看完作者这一部分的描写,简直不能同意更多。
这一章的第一个小标题就是“为了将来丢弃而现在建设”。大型系统的开发不是一蹴而就的,很多系统的初版都是不太能令人满意的,所以不断的重构是一直贯穿到系统的生命周期之中的。作者所谓的“为了将来丢弃而现在建设”,就是开发过程中准备在将来用更高效的和更易于扩展的代码来替代目前正在编写的模块。
重构的过程中,要有精确定义的需求为指导。否则重构结果并不乐观。
系统的不断演进和需求不断的增加,会导致系统代码混乱,“熵”不断增加。重构就是为了减少系统的“熵”。
系统的不断开发中,会产生“死代码”,需要及时去除。重构中要考虑去除复制张贴的代码,并把这些代码抽象为公共库。
需求的变更是常态,开发中不应该抗拒和讨厌,对变更进行管理。开发过程中应该为变更做好准备。但是一个系统不能“广泛参数化”。平衡度也很关键。
系统架构
系统设计目标
在设计开始前应当估计系统的极限,留有一定的安全余量,进行开发。
在大型系统设计中,一直性是重要的考量,有的时候可以牺牲不规则的特性和改进,保证一致性。同时应当保证一致性的文档应该落地。
高内聚低耦合,这个原则应该是我们初学编程就一直强调的原则,我们应该保证模块之间的正交性质。保证低耦合,我们应该做的就是强制接口定义,隐藏实现细节,不使用公共的数据结构。所谓高内聚是指一个模块只实现一个功能。高内聚的软件易于维护和改进。
系统应当适当的进行“过度设计”,提升系统的灵活性。
使用“打包”提升系统的吞吐量。一个是“时间片”,定时进行打包操作一次请求。二是收集足够多的的处理请求后打包处理。在系统优化的过程中,一个是优化算法的实现,二是使用空间换时间的。
高可用的设计,使用“持久化”和“冗余”提升系统的高可靠性。
系统的高扩展性,通过以下方式提升:
- 按照功能划分模块独立部署
- 按照负载划分系统
- 避免分布式事务
- 在模块间使用异步处理
系统设计原则
系统分层设计,系统设计成金字塔型,越核心的测系统,设备接入越少,关系越简单,可靠性越高。
故障隔离设计。
无单点。
消息驱动模型的设计:
- 前台发消息无ack重发
- 后台消息处理需要幂等
- 消息在每个界定啊都被存储并加标记
其实这个设计,很类似Kafka的实现。
调优原则
先将单机的能力提升,再水平扩展
对大量访问的数据,使用内存方式提高速度(现在看来就是使用缓存),结合磁盘“持久化”。
优化核心算法。
使用异步I/O。
传输压缩,打包和流控技术。
后记
这本书,提出的一些系统设计和开发原则,现在看来大部分已经在我接触过的的系统中大量的使用。可见系统的基本设计原则,经过快十年的发展也没有太大的变化。十年前的一些原则已经有很多成熟的技术实现了。大型系统的开发逐渐变得容易,系统的设计人员可以将更多的精力来组合各个成熟实现,快速搭建系统。推荐这本书给大家,感受大型系统构建的各个方面细节,开阔视野。