潜鱼在渊

Concentrating on Architectures.

posts - 77, comments - 309, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

分布式系统中的信息对象

Posted on 2005-12-21 22:58 非鱼 阅读(2817) 评论(5)  编辑  收藏 所属分类: 面向对象设计
    术语

    信息对象 - 表示会被持久化的实体对象,一般在信息视图中描述。下文也把信息对象简称为对象。这些对象本身不是分布式对象,但它们可能会被不同的节点访问。

    节点 - 分布式系统中的组成部分。由应用服务器和数据库及其他服务端组件组成。

    复制 - 指持久化的对象的复制,如数据库记录的复制。

    背景

    在MIS、ERP、CRM等分布式系统中,可能存在多个节点,每个节点都有自己的应用服务器和数据库系统。这些节点产生的信息对象可能被本地节点或异地节点所访问;在整个分布式系统中,也存在一些全局的信息对象,它们被分布式系统中的所有节点访问。

    需求问题

    从用户的角度,他们不关心具体的实现,但他们会要求某些信息对象可以在每个分布式节点都能被访问到。从需求一开始被提出时,他们可能并没有意识到这一点。需求分析人员要在这里做更多的工作,避免遗漏:

  1. 信息对象是在哪些节点产生的?
  2. 这些信息对象会被其他节点使用吗?
  3. 网络状况如何?
  4. 这些信息对象会从一个节点复制到另一个节点吗?
  5. 这些对象会从一个节点迁移到另一个节点吗?
    对象在本地节点产生,被异地节点访问

    如果一个信息对象会被其他节点使用,一般来说是要持久化的,在持久化时,必须保存其节点信息。持久化的方式有两种:独立存放(放在单独的字段中)或者把节 点信息存放在对象的识别域(一般是主键)中。独立存放节点信息比较灵活;把节点信息存放在识别域中可以获得有限的位置透明特性,但带来节点信息和其他识别 信息的混杂,且不利于信息对象的迁移。另外,用户方面可能原本定义了对象识别方法,并且这个方法可能和我们即将采取的行动冲突。

    当一个信息对象被其他节点使用时,一般存在两种方式:远程访问和本地副本。远程访问直接通过网络调用远程节点上的过程并返回其关心的信息对象。本地副本则 在本地保存其他节点的信息对象,在使用时直接在本地加载。远程访问适用于网络状况良好、需要事务控制的场合;本地副本一般在对信息实时性要求不高、或者网 络条件差,传输得不到保证的环境下。但在实际应用过程中,这两种方法经常联合使用。

    远程访问的优点和缺点:
  1. 获得的信息是最新的、实时的。
  2. 方便事务控制。
  3. 实现简单,整洁。
  4. 可管理性、可维护性好。
  5. 依赖于网络状况。
  6. 可靠性和可用性不够好。
    本地副本的优点和缺点:
  1. 高性能。
  2. 不受网络限制。
  3. 可靠性和可用性高。
  4. 不能实现全局事务。
  5. 一般需要额外的成本实现信息对象的复制。
  6. 在信息对象大量复制的情况下不易管理和维护。
    结合上述两种方式,并权衡系统的非功能需求和质量要求,可以设计出适合不同应用的方案。

    本地对象的迁移和委托

    本地对象的迁移指在本地节点产生的信息对象,因为某种原因需要迁移到另外一个节点。本地对象的委托指本地节点产生的信息对象委托另外的节点来管理,即主要 的操作在异地节点完成,本地只有少量操作甚至没有任何操作。这是两个相反的情况。

    一般情况下,我们通过建立信息对象的引用来处理这两种情况。在对象迁移时,我们把信息对象存储到新的节点上,并在原节点建立到新节点该对象的引用。在委托 时,正好相反,我们在新的节点建立对原对象的引用。同时,系统也应该建立处理信息对象引用的机制。

    值得注意的是,对象的迁移和委托可能会和异地节点访问信息对象的设计相冲突,这主要是指上文提到的本地副本的使用。可以考虑不使用本地副本机制或迁移、委托对象特别处理的方式解决这个问题。

    全局对象

    除了本地信息对象之外,分布式系统中往往也存在一些全局信息对象。这些全局信息对象在整个系统中的所有节点使用。

    部分全局信息对象在系统安装、初始化时刻就产生了;部分全局对象是在系统运行过程中产生的。保证全局信息对象的一致性,是设计过程中需要特别注意的。比如,应该极力避免全局信息对象的复杂存储设计。

    一般来说,可以考虑对全局信息对象进行集中存储和分布存储加集中/分布复制两种方案。这两种方案的优缺点和我们上文讲到的本地对象异地访问类似。但由于全局对象的往往访问频繁,一般采用第二种方式实现。

    数据中心

    对于一个一般性的全局查询,不可能通过遍历分布式系统中的所有节点来完成。所以,在分布式系统中建立一个全局集中的数据中心是必要的。数据中心可以满足大部分查询需求,并可以在其基础上建立高级应用,如数据分析、决策支持等等。

    在数据中心的问题上,应该尽量避免分布式系统本身对数据中心的依赖。数据中心是对分布式系统的有益补充,但它的主要目的并不是分布式系统本身。所以我们应该利用但尽可能不依赖它。

    工具

    一般信息对象的复制可以使用现成的产品,如Sybase Replication Server。当然对于一些特殊要求,可能需要自己实现。这不是做广告,算是对本文的一个补充吧。

    总结

    在大型分布式系统中,上述问题是基本的也是简单的。但这样说的前提是你考虑到了这个问题。如果你正在进行类似的工作,希望本文能够对你有所启发。

评论

# re: 分布式系统中的信息对象  回复  更多评论   

2005-12-22 11:54 by weide
Sybase Replication Server能够复制的信息对象有哪些?

象电驴、BT这种算是大型分布式系统吗?

能否试举一例?比如银联,这个是否算是大型分布式了?

# re: 分布式系统中的信息对象  回复  更多评论   

2005-12-22 12:26 by 非鱼
@weide
Sybase Replication Server是用来复制数据库记录的。它可以把数据库记录从一个数据库复制到另一个数据库。可以用在Sybase, Oracle, DB2, SQL Server上,支持异种数据库之间的复制。

我说的分布式系统主要是指应用软件,如MIS,ERP,CRM等。银联是一个大型分布式系统,而且是关键任务型的。我写的这些对于银联的应用,可以有些参考作用吧(没有做过,仅猜测)。

EMULE、BT是个人使用的互联网应用软件。它不会因为P2P就成为“分布式系统”了,就象IE,FF,它们是分布式系统吗?

# re: 分布式系统中的信息对象  回复  更多评论   

2005-12-22 14:29 by weide
@非鱼

IE、FF不是:按照分布式系统“每个节点都有自己的应用服务器和数据库系统”,它们没有提供服务的功能

eMule和BT则不同,每个节点都有自己的应用服务器和数据库系统(虽然简单了点,确实提供了服务;数据库系统可以认为他们使用的是文件型数据库);

分布式系统未尝不可以采用emule和bt协议来进行信息的访问和复制吧?分布式系统是P2P的一种,或者P2P也是一种分布式系统?

# re: 分布式系统中的信息对象  回复  更多评论   

2005-12-22 20:25 by 非鱼
@weide

你又钻牛角尖了。

首先我这篇文章不是讲“什么是分布式系统”,所以我也没有给出一个定义。其主要内容是讲在某些分布式系统下的信息对象,开始没有界定清楚,现已更改。

eMule或BT本身不是分布式系统。eMule(BT)(>=2)+eMule(BT) Server才组成一个分布式系统。这是一个部分与整体的关系。下面是一个类比:

IE(FF) -> JavaAppServer ->DBMS
EMule(BT) -> Server ->Any Persistence System

我说的是上面的一种情况,且只关注多App Server:[AppSvr1, AppSvr2,...AppSvrn]这种特例。

在eMule(BT) Server Side, 同样由多服务器组成Matrix。它也有这个信息对象问题。即Resource(name, size, etc...)在一个eMule(BT) Server上,当你连接到Matrix中任一服务器时,你可以Search到其他服务器上的一个Resource。基于Internet的特性,和人们对P2P资源的要求,这个Matrix允许部分失效。这不会影响到客户端使用者(eMule(BT))。在其服务器之间的交互上,可能是采用非位置透明的方法,如管理员维护其他服务器列表。也可能使用位置透明的方法,这让我想到Jini的技术。

上述关于P2P系统,纯属猜测,请勿认真。

# re: 分布式系统中的信息对象  回复  更多评论   

2005-12-23 17:23 by weide
我说电驴和BT的时候,其实就是指的整个的系统而不是BT客户端。BT也算是一种网络传输协议了吧?

Bitcomet的DHT网络的引入应该降低了对数据中心的依赖;最新的exeem,则干脆不需要数据中心了,只是因此速度很慢,所以不再用了。

这是能够接触到分布式系统。商业环境中没用过:(

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问