本期的架构周报主要关注软件架构分解技巧、LinkedIn 日志系统和 GWT 对 HTML5 storage 的支持和实现。
软件架构分解
对复杂的大规模软件系统,软件架构分解是架构设计中必不可少的关键步骤。通过分解识别架构元素,同时也是解决非功能需求的重要手段之一。好易科技 CTO 王国波在“软件架构分解”一文中从架构的定义出发,对架构形而上的本质给出了自己独特的理解。在架构设计上提出了架构分解过程模型和多维度多层次分解模型。他总结的架构分解原则包括:
- 低耦合、高内聚:莱布尼兹指出:“分解的主要难点在于怎么分。分解策略之一是按容易求解的方式来分,之二是在弱耦合处下手,切断联系”。在弱耦合处下手,切断联系。太精辟了!高内聚、低耦合也是软件设计的基本原则,软件设计中的很多设计原则其实都可以认为它的派生或具体化,如单一职责原则、依赖倒置原则、模块化封装原则,这些原则在架构分解中也是适用的。
- 层次性:分解通常是先业务后技术,循序渐进,先逻辑后物理,从上到下逐级进行分解展开:系统-> 子系统-> 模块-> 组件 -> 类。
- 正交原则:和物理学中的正交分解类似,架构分解出的架构元素应是相互独立的,在职责上没有重叠。
- 抽象原则:架构元素识别,在较大程度上是架构师抽象思维的结果,架构师应该具备在抽象概念层面进行架构构思和架构分解的能力。
- 稳定性原则:将稳定部分和易变部分分解为不同的架构元素,稳定部分不应依赖易变部分。根据稳定性原则,将通用部分和专用部分分解为不同的元素;将动态部分和静态部分分解为不同的元素;将机制和策略分离为不同的元素;将应用和服务分离。
- 复用性原则:就是对知识的重用. 重用类似系统已有的架构设计、设计经验、成熟的架构模式或参考模型、设计模式、领域模型、架构思想等,因为它们已经在不同的层次上分解识别出了许多架构元素,或者指出了一些分解方向,对我们的架构分解具有借鉴和指导作用。例如 IBM SOA 解决方案参考模型对 SOA 服务化具有重要的指导意义,我们可以参照它对系统进行初步的架构分解。
LinkedIn 日志系统
Jay Kreps 是 LinkedIn 公司的高级工程师,他撰文详细分析了 LinkedIn 公司中日志系统的发展历史、实现细节和经验。这里所说的“日志”不仅仅是程序员普通意义上的应用程序日志,还包括数据库日志、分布式系统日志,Jay 认为:
日志是一种简单的不能再简单的存储抽象。它是一个只能增加的,完全按照时间排序的一系列记录。日志记录的排序是由“时间”来确定的,这是因为位于左边的日志记录比位于右边的要早些。日志记录编号可以看作是这条日志记录的“时间戳”。在一开始就把这种排序说成是按时间排序显得有点多余 ,不过 ,与任何一个具体的物理时钟相比,时间属性是非常便于使用的属性。在我们运行多个分布式系统的时候,这个属性就显得非常重要。
日志并不是完全不同于文件或者数据表的。文件是由一系列字节组成,表是由一系列记录组成,而日志实际上只是按照时间顺序存储记录的 一种数据表或者文件。每个编程人员都熟悉另一种日志记录 - 应用使用 syslog 或者 log4j 可能写入到本地文件里的没有结构的错误信息或者追踪信息。为了区分开来,我们把这种情形的日志记录称为“应用日志记录”。应用日志记录是我在这儿所说的日志的一种低级的变种。最大的区别是:文本日志意味着主要用来方便人们阅读,而我所说明的“日志”或者“数据日志”的建立是方便程序访问。
有关 LinkedIn 日志系统的详情,读者可以查看 Jay 的原文。
GWT 对 HTML5 storage 的支持
GWT 是 Google Web Toolkit 的简写。它是 Google 公司发布的基于 Java 语言开发 Web2.0 应用的工具包。在使用 GWT 开发 Web 应用时,开发人员是通过编写 Java 代码来创建 Web 界面中的组件。这样对于 Web 开发人员可以提高开发效率,更方便的调试。软件工程师郑峰详细介绍了 GWT 对 HTML 5 storage 的支持。
最早的 Cookies 自然是大家都知道,问题主要就是太小,大概也就 4KB 。而且 IE6 只支持每个域名 20 个 Cookies,太少了。优势就是大家都支持,而且支持得还蛮好。很早以前那些禁用 cookies 的用户也都慢慢的不存在了,就好像以前禁用 Javascript 的用户不存在了一样。Web Storage 是 HTML5 API 提供一个新的重要的特性 ; 最新的 Web Storage 草案中提到,在 web 客户端可用 HTML API,以 Key-Value 形式来进行数据持久存储 ; 目前主要的浏览器已经支持该功能 ; 常见的 web 客户端数据存储比较: HTML5 Web Storage 非常易于 Web 开发者使用,它提供了非常简单的获取或设置 Key-Value 对的 API; 支持的数据大小。
HTML5 Storage 分为 Session Storage 和 Local Storage,Session Storage 是用于本地存储一个会话中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此 Session Storage 不是一种持久化的本地存储,仅仅是会话级别的存储。Local Storage:简单来说,它就是一种让网页可以把键值对存储在用户浏览器客户端的方法。像 Cookie 一样,这些数据不会因为您打开新网站,刷新页面,乃至关闭您的浏览器而消失。
GWT 在 2.3 版本后开始支持 HTML5 Storage,我们可以使用 GWT 提供的标准类库,并且在支持 HTML5 的浏览器上来使用 HTML5 Storage 的功能。
对架构领域感兴趣的读者可以关注即将于 2014 年 4 月 25~27 日在北京国际会议中心召开的QCon 北京 2014 大会,专题包括知名网站案例分析、扩展性、可用性与高性能、云计算服务探秘、大数据处理与大数据应用等,许多讲座都与架构相关。读者可点击大会主页查看详情。
欢迎读者朋友推荐或者投稿架构相关的文章,联系邮箱为 editors@cn.infoq.com ,标题请注明“架构专栏”。
评论