物联网软件架构设计与实现
上QQ阅读APP看书,第一时间看更新

1.6
框架设计特点

框架最重要的特点包括稳定性、扩展性和性能。

1.稳定性

对于一个实时数据交互框架来说,最重要的就是稳定性,这是保障系统正常运行的前提,不能出现软件无故退出、关闭软件后进程无法退出、无法响应数据、无法处理数据等现象。

基于可能存在的问题,我们要考虑容错机制、模块无缝对接、记录日志等功能的实现。容错机制是所有软件都有的一种机制,核心功能是对异常状态的处理。对于操作的一般性功能,如果出现异常状态,我们可能不需要过多地干预,只需要记录日志,再次操作同样的功能可以验证异常状态的可重复性,根据日志信息有针对性地解决问题;对于事务性任务,对异常状态的处理会有多种选择,既可以简单地记录异常信息,也可以销毁当前资源,重新启动任务,直到启动任务成功并恢复到出现异常状态的时间节点。不同应用场景,选择的处理方式也不一样。

模块无缝对接要求对接口、抽象类及类的模块划分、设计粒度有很好的把握,更多体现在经验方面。模块之间是一种契约关系,如何履行契约涉及很多设计模式的选择,所以说对设计模块的把握程度会直接影响软件框架的成熟度。就好比两个人对话,如果说话方式、语意都不能相互理解,就有可能话不投机半句多。

记录日志是所有软件必须要有的功能,这为我们排查错误提供了很大的方便。日志记录有很多开源的项目可以拿来直接使用,如常用的Log4Net。

2.扩展性

用户可能比设计者更关心软件框架的稳定性,但是用户不仅仅满足于稳定性,还会提出各种新需求,这些需求更多体现在功能方面。如果框架的扩展性不好,对于开发者来说就是万丈深渊。

可扩展是软件框架最显著的特征之一,它意味着软件框架的功能具有扩展能力。没有扩展能力的软件框架毫无价值,因为框架本身就是为了提供统一的上下文环境给二次开发的应用使用。软件框架的可扩展性使我们能够基于一个平台实现不同的功能,满足不同的应用需求。

框架的可扩展性主要通过继承和聚合两种方式实现。继承方式是指通过派生类继承基类或接口,通过重用基类的功能及定义新功能的方式实现软件框架的功能扩展;聚合方式是指调用不同的类型组合为一个新类型而扩展出全新的功能。研究Framework框架源代码,能够更直观地了解继承和聚合的作用。

除扩展性外,我们还要考虑模块化、可重用性、可维护性等。不是把每个功能都编译成一个DLL程序集就可以称为模块化,一个程序集内部也可以模块化。模块化是从软件框架层面在逻辑上横向、纵向对模块和层次进行划分,以降低模块之间的耦合度,不会因为一个模块的变化而影响其他模块。划分模块时要保证模块之间输入、输出的一致性。

可重用性也可以称为可复用性,是衡量代码质量的重要标准之一。软件框架设计的目的之一是提高二次开发的效率,减少没有必要的重复劳作,降低成本。一般来说,软件框架可重用性可以是离散存在的函数,也可以是封装好的类库,以方便我们使用。

可维护性是根据业务需求变化,能够方便地进行改变的能力,也是扩展性的落脚点,让我们能尽量少地修改代码,从而达到满足需求而又不影响软件的整体运行的目的。

3.性能

性能是衡量软件运行效率的重要指标,是对软件运行极限的考验。例如,不管挂载多少设备驱动,用户要求1秒钟要读取一次所有设备的数据,如果实现不了,用户就不会签合同。

互联网行业对性能的要求更高、更全面,有很多指标性的参数,如响应时间、延迟时间、吞吐量、并发量、资源利用率等,一般需要对软件、服务进行压力测试。传统行业应用场景不妨使用先进的框架或第三方组件,如消息队列框架(kafka、ActiveMq、RabbitMq、ZeroMq、EQueue)、响应式消息框架(Akka.net)、作业调度框架(Quartz.net)等,这些框架或组件有助于提高软件、系统的效率和性能。

当然,对于性能来讲,软件只是一个方面,网络结构、服务器部署等也是影响性能的重要因素。