20250413-作
题目
特定领域软件架构DSSA(Domain Specific Software Architecture)就是在一个特定应用领域中为一组应用提供组织结构参考的标准软件体系结构。对DSSA 研究的角度、关心的问题不同导致了对DSSA 的不同定义。DSSA 的必备特征如下。
一个严格定义的问题域和问题解域。
具有普遍性,使其可以用于领域中某个特定应用的开发。
对整个领域的构件组织模型的恰当抽象。
具备该领域固定的、典型的在开发过程中可重用元素。
请围绕“特定领域软件架构”论题,依次从以下三个方面进行论述。
1 概要叙述你所参与管理或开发的软件项目,以及你在其中所承担的主要工作。
2 说明DSSA 包括哪几个阶段的活动以及参与人员有哪些。
3 结合②详细说明你所参与的特定领域软件开发项目是如何进行架构设计的,给出每个阶段具体的实践过程。
摘要
某省预约挂号系统简称预约挂号系统,是我司自主研发的医疗产品,该系统集众多功能于一体,旨为提高医疗服务质量和患者体验,随着用户量的逐年攀升,系统面临着性能和可用性的挑战,严重阻碍了服务质量的进一步提升。我司决定于2023年3月对预约挂号系统进行全面升级工作,计划一年,投资800万,我担任系统架构设计师,主要工作就是系统架构的整体设计。因系统涉及领域较多,我们采用了DSSA的架构设计方法,通过定义领域范围、定义领域特定元素、定义领域特定设计和实现需求约束、定义领域模型和体系结构、产生搜集可重用的产品单元等5个阶段,完成了预约挂号系统升级工作,轻松应对了系统高并发时期要求的性能和可用性,得到了高层领导和组员的高度认可。
背景
随着信息化时代的到来,各大医院纷纷拥抱线上系统,我司顺应时代潮流开发了一款集预约挂号、体检预约、报告查询和名医抢号等功能于一体的预约挂号系统,旨为提高医疗服务质量和患者体验,但随着用户量的逐年攀升,系统面临着性能瓶颈和可用性的严峻挑战,严重制约了服务质量的进一步提升,为了让预约挂号系统持续稳定的提供服务,我司毅然决定2023年3月对预约挂号系统进行全面升级工作,计划一年时间,投资800万,我担任系统架构设计师,主要工作涵盖了系统架构的整体设计、技术栈的精准选型和各个阶段的评审工作。考虑到预约挂号系统涉及业务领域众多,我们采用了DSSA的架构设计方法来指导系统的升级工作,我们经过定义领域范围、定义领域特定元素、定义领域特定设计和实现需求约束、定义领域模型和体系结构、产生搜集可重用的产品单元等5个阶段的循环迭代,成功对预约挂号系统的每个业务领域进行了设计和实施,完成了系统的全面升级工作。
理论
DSSA总共包括了3个活动,每个活动中都有不同领域的人员参与,且对参与的领域人员的领域经验要求极高,下面介绍3个活动。
1.领域分析阶段。该阶段主要是对系统的业务领域进行分析,目标是产生领域模型,参与人员有领域专家和领域分析师。找出系统中的用户需求、企业需求、可行性研究和业务目标等等领域的所有需求。然后整理这些需求,找出领域需求的共通点。再然后对需求分析,产生各个领域的模型,整理成需求规格说明书,指导后续的工作,同时也提供参考依据。
2.领域设计阶段。该阶段主要是对提出的问题领域找出领域的解决方案,目标是生成领域架构,参与人员有领域架构设计师。领域专家和领域分析师可能需要参与指导。首先查看分析阶段提出的问题,整理归类。然后再提出解决方案,组织评审排除风险,生成领域的体系结构模型,另外,由于领域需求有变化性,所以产生的领域体系结构也要有变化性。整理成设计文档,为实现阶段提供参考和依据。
3.领域实现阶段。该阶段主要是对领域的体系结构进行编码、测试和运行维护阶段,参与人员有领域实现人员。参考领域设计阶段产生的体系结构模型、设计模型和需求约束文档等材料。
实践
预约挂号系统运行多年,已经产生了机构领域、消费者领域、统计领域和支付领域等众多的业务领域,所以我们采用了DSSA的设计方法,获得特定领域体系结构的阶段有五个,接下来我通过对机构领域的设计为例,描述这几个阶段。
1.定义领域范围。首先由领域分析师分析,机构领域涉及的范围有医院、科室、医生等模块。a)医院承载科室和医生,医生与科室之间是多对多关系但是都属于一个医院。b)科室主要用来区分疾病。c)医生与发放号源、挂号和就诊等功能紧密结合。老系统中的医院、科室和医生的功能都比较有局限性,都是对接三方医院管理系统,此次升级涉及了模式的改造,改为由医院直接使用预约挂号系统录入医院、科室和医生的信息,所以需要具有代表性医院的领域专家参与设计。
2.定义领域特定元素。在领域专家的参与和指导下,我们对机构领域有了新的认识,了解到:a)医生元素,医生坐诊分为普通号、专家号,号源与医生不强绑定关系,普通号可以是所有医生,专家号只对应一个医生。b)医院元素,首次从领域专家处听到了机构名词,众多医院可以使用机构代表,这也影响了我们后续对医院服务的称呼,我们改为了机构服务。c)科室元素,对疾病的分类,与医生之间是多对多的关系。领域分析人员与领域专家一起定义了机构领域词典,为后续的设计工作奠定了基础。
3.定义领域特定设计和实现需求约束。我对机构领域中相关的信息有了初步的认识。首先,从领域分析人员处得到了需求规格说明书,以及分析的模型,我根据分析模型,设计了有医院、科室和医生等实体组成的领域类图。其次,结合老系统目前的运行状态材料,设计领域架构时我发现目前预约挂号系统,在检索医院、科室和医生的时候,有检索速度慢、无法查询附近的医院等问题,我提出了使用流行的NoSQL数据来代替关系型数据的存储以提高性能,但这会造成项目接入多个数据库,对数据的一致性和安全性有不小的影响。然后,我组织了讨论会,邀请了领域相关的专家、分析和设计人员参与了会议,决定使用ES(Elastic Search)中间件来存储机构相关的详细信息,在信息存储上服务直接与ES进行交互,采用异步增量的方式同步到关系型数据中作为后续大数据分析的离线数据,允许离线数据有一段时间的不一致。
4.定义领域模型和体系结构。a)该阶段我细化了机构领域类图,并将类图打包成了包图来表示机构领域的体系结构。b)又通过活动图、顺序图描述了医生等实体的行为,c)通过通信图描述了医院、科室和医生等实例之间的交互关系。d)设计了部署图,来描述系统各个服务如何部署和部署的参数等等。
5.产生搜集领域中可重用的产品元素。为了提高开发的效率,我又在老系统中通过系统复用整理了可重用的功能模块。首先,我把系统中所需要数据库构件、构件和代码等都描述进了复用文档中。其次,对于构件库中ES、Nacos等这些中间件,从安全性方面考量,检查漏洞和版本。然后,将有缺陷的组件更新成最稳定的版本。
通过设计阶段整理的文档,领域开发人员通过面相服务的开发方法,使用Spring、mybatis等工具开发了预约挂号系统的各个组件,通过单元、集成、系统和验收测试,完成了系统的开发。
结尾
得益于DSSA的使用,我们在2024年3月份顺利完成了预约挂号系统的开发并上线,又经过了一个月的精心推广,又吸引了大批的用户,目前用户量已经突破千万,又对接了11个地市的500多家医院,在支持名医抢号时表现突出,轻松应对万级的用户请求,极大的提高了系统性能和可用性,得到了项目组成员的赞誉和高层领导的高度认可。但在项目开发初期,有部分组员对DSSA的开发方法理解有误,一度阻碍了项目进度的按时推进,针对此问题我们快速反应,经过了项目组间人员的灵活调配,完美解决了这一短板,也给了我深刻的教训。下一步,我们准备对预约挂号系统的数据进行迁移工作,经过了此次项目的成功实施,我们对数据迁移工作充满信息,并将以更高的要求和标准对待迁移任务。此次DSSA方法的实施是个不可多得的机会,通过这次经历,我的知识和经验都得到了显著的提高。
总结经验:
1.分段可以,但不能处处分段。
2.分小标题可以,但不能处处小标题。要说明你有几步,否则使用:首先-其次-然后。
3.实践部分,要尽可能的拿 功能 举例子。