创建高效执行企业关键功能的可伸缩分布式系统无疑是一件相当艰巨的工作,微软公司开发的COM+可以为此提供帮助。COM+是为COM构件提供的一个非常复杂的运行时环境,其设计目的是简化可伸缩系统的开发,并作为更高层次的框架(如BizTalk)和站点服务器商业版的基础。不过,在不清楚COM+的工作原理的情况下,是无法发挥其强大功能的。
本书阐述了COM+的工作原理,向读者展示了如何使用其开发可伸缩应用程序。具体内容包括:可伸缩性的特性,传统面向对象方法不适用于可伸缩系统的原因,以及事务的重要性。书中解释了如何通过描述表和因果关系体实现COM+运行时服务;介绍了套间、组织,以及它们在COM+进程的并发控制中的作用;此外,还说明了事务流及其在整合对象和事务中的工作过程。作者在书中展示了即时激活和对象池化是如何协同工作的;揭示了HTTP和MSMQ作为明显优于DCOM的通信协议的重要性;更重要的是,他还解释了以上所有元素对基于COM+的可伸缩系统的设计的整体影响。
本书的实用型介绍方式,使其既包括了对技术基本原理的介绍,还包括了对使用COM+创建可伸缩应用程序的实现细节的具体指导。TimEwald是Develop Mentor(业界领先的开发人员服务公司)的首席科学家。他的研究和开发工作集中在应用COM和Java等构件技术来设计和实现可伸缩系统上。他是Develop Mentor公司的几个课程的作者和合作者,包括MTS和COM+课程。此外,他还是Effective COM(Addison-Wesley)的合作者,DOC和Application Strategies的前任专栏作家,并常常在各种会议中发表演讲。在加入Develop Mentor之前,Tim是专门研究COM以及相关技术的独立顾问。
序言
前言
第1章 可伸缩性
1.1 可伸缩性基础
1.2 一致性
1.3 COM中的一致性
1.4 共享一致性
1.5 对一致性的回顾
1.6 对象/客户模型
1.7 事务
1.8 把对象与事务结合起来
1.9 一个复杂的问题
1.10 小结
第2章 原子
2.1 连接程序交换的历史
2.2 从控制台到描述表
2.3 作为对象的描述表
2.4 描述表来自哪里
2.5 描述表流
2.6 因果关系
2.7 作为对象的因果关系
2.8 小结
第3章 机制
3.1 描述表的相关性
3.2 描述表的耗费
3.3 有限制的描述表
3.4 其他
3.5 小结
第4章 线程
4.1 套间
4.2 跨套间调用
4.3 套间规则
4.4 活动集(Activity)
4.5 分配STA对象到套间
4.6 串行化调用(Serializing Call)
4.7 活动集规则
4.8 小结
第5章 对象
5.1 对象池管理
5.2 实现池内类
5.3 对象池管理准则
5.4 口时激活
5.5 JITA规则
5.6 谎言.该死的谎言, 还有统计
5.7 小结
第6章 事务
6.1 本地事务(Local Transaction)
6.2 分布式事务(Distributed Transaction)
6.3 分布式事务的复杂性
6.4 说明性事务(Declarative Transaction)
6.5 事务规则
6.6 小结
第7章 隔离性(Isolation)
7.1 正确和性能相对
7.2 指定隔离等级
7.3 死锁
7.4 应用程序等级的隔离
7.5 小结
第8章 协议
8.1 HTTP
8.2 IIS
8.3 ASP
8.4 HTTP+XML=RPC
8.5 消息序列
8.6 小结
第9章 设计
9.1 机器.进程和协议
9.2 处理器和助手
9.3 事务和数据访问
9.4 中间层状态
9.5 最后的建议
附录A 关于.NET
附录B 建立一个理想的连接池例子
附录C 调试
附录D 目录管理器属性和组件服务浏览器属性页
D.1 应用程序属性页
D.2 类属性页
D.3 接口属性页
D.4 方法属性页
在我刚开始接触到MTS(Microsoft Transaction Server, 微软事务服务器), 也就是COM+的前身时, 我就知道作为一个COM开发者, 我的生活已经由此而永远改变了. 很快我便发现, 过去习惯使用的传统COM对象模型在MTS环境下并不能有效地工作. 这个问题既让我苦恼又让我着迷, 因此我开始着手了解个中的原因. 一开始我很盲目地认为是MTS小组出现了某些问题——它的创建者根本不理解分布式对象. 然而, 随着时间的推移, 我逐渐明白了MTS为什么会以这样的方式工作. 很简单, 答案就是可伸缩性.
MTS被设计成用于简化可伸缩的分布式应用程序的开发过程, 它所做的每一件事都是为了达到这个目的. 根据这个观点, MTS对对象所做的处理(例如, 不在客户之间共享对象, 以及在对象的事务终止时释放它们)对我来说就有意义了. 正因为如此, 我才花费了很多时间来编写以及教授关于MTS的课程. 我遇到过很多开发人员, 他们正朝着和我一样的目标而努力奋斗, 而且他们需要帮助. 像我一样, 他们希望了解MTS是如何工作的, 以及它为什么以这样的方式工作. 最为重要的是, 他们想了解如何设计使用MTS的系统. 因此我编写了这本书.
编写这本书花费了很长的时间, 以致于这本书根本不是关于MTS的, 而是关于它的后代COM+的.
COM+是什么?
COM+是一个运行时的环境, 当类声明了它们所需要使用的服务后, COM+就会为类的实例提供这些服务. 例如, 如果一个类声明了它需要基于因果关系的调用同步, 那么COM+运行时就会确保每次只有一个逻辑的线程动作调用一个实例的方法. 或者, 当一个类声明了它需要一个分布式事务时, COM+运行时就会确保有一个这样的事务可用. 现在, 基于COM+的系统能用C++. Visual Basic6或者用其他COM友好的语言来编写:而在将来, 这些系统能用C#. Visual Basic7或者其他通用语言运行时(Common Language Runtime)友好的语言编写. (详情请参阅附录A, “关于. NET”. )COM+运行时是许多高级技术的基础, 其中包括Internet lnformation Server(IIS). Active Server Pages(ASP). Site Server.
Application Center 2000以及Biztalk Server 2000.
对于一种被设计用于在Windows平台上开发大规模分布式应用的技术而言, COM+是这种技术框架的基础. 这个框架的当前版本被称为WindowsDNA, 下一个版本则被称为. NET. 这两个版本有着类似的总体结构, 而且都是以如下与可伸缩系统需求有关的三个假设为基础的:
1. 它们必须能被内部网络和因特网上的多个用户访问, 运行基于浏览器以及自定义的客户应用程序.
2. 它们必须使用多台服务器机器来并行处理大量的客户请求.
3. 在发生故障的时候, 它们必须是健壮的.
根据这些假设, 从这两种框架引申出三条基本原则:
1. 系统逻辑是统一在服务器而不是在客户或后端数据库上的. 服务器能共享资源(例如数据库连接), 封装数据库模式和数据访问技术, 并提供一个受到严密控制的安全环境.
2. 事务位于程序设计模型的中心地位. 在遇到并行访问或系统故障的时候, 它们提供一个标准模型以保护分布式的系统状态. 多数系统状态都必须处于事务的控制之下(例如在一个数据库中).
3. 一个系统中的组件之间使用一系列协议来进行通信. 一般情况下, 客户使用HTTP并越来越多地使用简单对象访问协议(SOAP)来和服务器进行通信, 有时也会使用DCOM和微软信息队列(MSMQ)进行通信. 服务器则通常使用DCOM. MSMQ和特定的数据库访问协议来互相通信, 但有时也使用HTTP和SOAP.
COM+被开发来简化遵循这些原则的系统的开发工作. 其目标首先在WindowsDNA框架中得到了确定, 并将在. NET中继续保持下去.
本书的内容
本书系统所要研究的是COM+如何工作. 为什么能这样工作以及如何构建基于COM+的应用. 除非理解了一个问题的基本特性. 一般解决方案和你所要使用的技术的完整细节, 否则你就不能编写出能够解决该问题的软件. 概括地说, 本书是关于可伸缩系统设计的. 具体来说, 它讨论了COM+运行时的机制, 其中包括了对进程. 描述表. 因果关系. 线程. 对象. 事务和通信协议的使用.
值得期待的内容
下面是对本书每一章的简单描述:
第1章“可伸缩性”描述了可伸缩性的基础问题, 解释了为什么可伸缩系统要使用事务以及它们为什么不使用传统的对象模型. 它发展了在基于COM+的系统中使用的基本对象模型.
第2章“原子”描述了描述表和因果关系, 所有的COM+运行时服务都建立在这两个基础的构成部分之上. 它解释了这两个构成部分如何与对象相关联以及对象是如何跟它们互相作用的.
第3章“机制”详细介绍了描述表和对象之间的关系, 其中包括了接口指针的描述表相关性和描述表表示在时间和空间上的系统开销.
第4章“线程”介绍了套间以及活动集, COM+分别用这两个高级的构成部分来控制管理一个对象的线程相似性和同步的程度.
第5章“对象”把注意力集中于对象库和即时激活(JITA)以及这些服务是怎样改变一个对象的生存周期以更有效地使用资源的. 这一章特别说明了JITA所提供的可伸缩性优点.
第6章“事务”探讨了本地和分布式事务的结构并介绍了事务流, 事务流是COM+用来把对象和分布式事务关联起来的高级构成部分.
第7章“隔离性”讨论了数据库用来终止互相干涉的事务并同时把并发性和吞吐量最大化的基础技术. 本章也讨论了跨事务应用程序级加锁方案.
第8章‘协议”阐述了Internet lnformation Server和COM+之间的集成, 其中包括ISAPI DLLs和ASP页是如何与描述表. 套间. 活动集和事务流相关的. 此外, 本章也讨论了SOAP和MSMQ.
第9章“设计”提供了对基于COM+的系统设计的一般建议. 其中的主题包括:使用一个或多个事务来实现客户任务, 高效率的数据访问, 中间层, 共享状态. 每客户会话状态管理, 以及在伸缩性和重用性之间的固有矛盾.
此外, 本书还有四个附录. 附录A“关于. NET”讨论了向. NET的转变并解释了CLR类是怎样利用COM+的. 附录B“构建一个理想的连接池”演示了如何使用对象池来构建一个数据库连接池, 这个连接池比OLEDB提供(并由ADO使用)的连接池具有更好的适应性. 附录C“调试”提供了有用的信息, 这些信息令调试COM+代码变得更加容易. 附录D“目录管理器属性和组件服务浏览器属性页”包含了一些图表, 这些图表在组件服务资源管理器属性页上把目录管理器属性映射成用户接口元素.
不应期待的内容
本书是为那些正在设计和实现基于COM+的系统开发人员服务的. 它假定你知道如何实现COM类并知道如何编写简单的ASP页. 同时, 假定你知道如何使用COM+和IIS管理工具. 组件服务资源管理器(CSE)以及因特网服务管理器.
有三个关于COM+的主题我在本书中没有介绍. 首先, 当这本书在几个相关的地方叙述性地提到基于COM+角色的安全性时, 并不会包含关于这个主题的完整的处理方法, 这是因为在Keith Brown的优秀著作《Programming Windows Security》中对此已经有详细的讨论了.
其次, 我忽略了以下两个辅助的COM+服务[QC(排队组件)和LCE(松散耦合事件)]因为这两种机制有着明显的局限性, 而这些局限性又会在大多数情况下使它们失去作用. 特别地, 尽管QC能被用来给一个COM+服务器进程异步地发送信息, 但是它们不能被用来给其他进程发送信息, 也就是说, 回到了一个客户进程. 虽然LCE可以使出版商将一个事件发送给多个订户而无须知道他们是谁, 但这种默认的发送机制是一种同步的. 分块的方法调用. 通过和QC一起使用, 可以使LCE变成异步的. 但这样的话, 事件就只能被发送到COM+服务器进程中了. 这些问题使得这两种服务从根本上对于双向的客户—服务器通信是无用的(在某些情况下, 它们可能会对服务器—服务器通信有用). 一般而言, 我还是推荐使用微软信息队列(Microsoft Message Queue)而摒弃QC和LCE, 这能使我们不受这些局限性的限制, 从而容易地建立起等价的功能集.
最后, 我并没有对补偿资源管理器(CRM)进行介绍, 因为缺乏必要的时间和篇幅.
规则
这不是一本COM+大全. 不过, 我尽了自己最大的努力, 提供尽量具体的建议来帮助读者理解如何设计和实现基于COM+的系统. 有些特殊的建议在书中标识为“规则”, 并采用如下突出的形式: