1.1. 内核
NJUST Open Judge的体系结构类似于微内核操作系统,通过轻量的微内核组织内核扩展以实现业务功能,在内核之上为表示层,用于给最终用户交互。系统的体系结构如图 1 1所示。这一体系结构允许各种粒度的扩展,在目前可以支持很方便地添加内核扩展、添加新的策略、发布新的开放平台API等。
相比传统的数据层、业务层、表示层三层架构,以及服务器经常使用的请求处理模型而言,基于微内核的体系结构在消息传递上会有更大的开销,但在另一方面,这一体系结构提供了很大的可扩展性,这一扩展性并不仅仅体现在对于功能的扩展上,而是更进一步地,允许各个内核扩展组件拥有最大程度的独立性,从而支持更有针对性的性能优化,如应用内核扩展的分布式部署来提升负载能力等。文献综述
微内核通过MEF框架负责内核拓展(下面简称KEXT)的发现,发现之后根据接口调用每个KEXT的初始化方法,这样可以初始化每一个KEXT。
KEXT相互通信,也可以相互服务。在KEXT开发之前,先声明好KEXT的服务接口以及事件。KEXT加载后,可以通过微内核获得指定类型的KEXT,然后根据约定的接口调用其服务;也可以订阅KEXT约定的事件。
系统原有的KEXT包括:
Problem KEXT:负责题库的管理
Code KEXT:负责代码的存储以及版本控制
User KEXT:负责账户的管理
Judge KEXT:负责提供判题的功能
Online Judge KEXT:负责管理所有Online Judge的提供商(Provider)
Contest KEXT:负责管理ACM/ICPC竞赛
1.2. 表示层
表示层使用ASP.NET MVC 3技术,该技术把一次HTTP请求分为模型、视图、控制器进行分工处理,最终渲染出用户所需要的结果。