正 文

消息与.Net Remoting的分布式处理架构


www.7dspace.com  更新日期:2005-11-25 6:37:33  七度空间


  分布式处理在大型企业应用系统中,最大的优势是将负载分布。通过多台服务器处理多个任务,以优化整个系统的处理能力和运行效率。分布式处理的技术核心是完成服务与服务之间、服务端与客户端之间的通信。在.Net 1.1中,可以利用Web Service或者.Net Remoting来实现服务进程之间的通信。本文将介绍一种基于消息的分布式处理架构,利用了.Net Remoting技术,并参考了CORBA Naming Service的处理方式,且定义了一套消息体制,来实现分布式处理。

  一、消息的定义

      要实现进程间的通信,则通信内容的载体——消息,就必须在服务两端具有统一的消息标准定义。从通信的角度来看,消息可以分为两类:Request Messge和Reply Message。为简便起见,这两类消息可以采用同样的结构。

      消息的主体包括ID,Name和Body,我们可以定义如下的接口方法,来获得消息主体的相关属性:

    public interface IMessage:ICloneable
    ...{
        IMessageItemSequence GetMessageBody();
        string GetMessageID();
        string GetMessageName();

        void SetMessageBody(IMessageItemSequence aMessageBody);
        void SetMessageID(string aID);
        void SetMessageName(string aName);
    }

  消息主体类Message实现了IMessage接口。在该类中,消息体Body为IMessageItemSequence类型。这个类型用于Get和Set消息的内容:Value和Item:

    public interface IMessageItemSequence:ICloneable
    ...{
        IMessageItem GetItem(string aName);
        void SetItem(string aName,IMessageItem aMessageItem);

        string GetValue(string aName);
        void SetValue(string aName,string aValue);
    }

  Value为string类型,并利用HashTable来存储Key和Value的键值对。而Item则为IMessageItem类型,同样的在IMessageItemSequence的实现类中,利用HashTable存储了Key和Item的键值对。

      IMessageItem支持了消息体的嵌套。它包含了两部分:SubValue和SubItem。实现的方式和IMessageItemSequence相似。定义这样的嵌套结构,使得消息的扩展成为可能。一般的结构如下:

      IMessage——Name
                     ——ID
                     ——Body(IMessageItemSequence)
                            ——Value
                            ——Item(IMessageItem)
                                   ——SubValue
                                   ——SubItem(IMessageItem)
                                          ——……

      各个消息对象之间的关系如下:

      在实现服务进程通信之前,我们必须定义好各个服务或各个业务的消息格式。通过消息体的方法在服务的一端设置消息的值,然后发送,并在服务的另一端获得这些值。例如发送消息端定义如下的消息体:

  IMessageFactory factory = new MessageFactory();
   IMessageItemSequence body = factory.CreateMessageItemSequence();
   body.SetValue("name1","value1");
   body.SetValue("name2","value2");

   IMessageItem item = factory.CreateMessageItem();
   item.SetSubValue("subname1","subvalue1");
   item.SetSubValue("subname2","subvalue2");
   IMessageItem subItem1 = factory.CreateMessageItem();
    subItem1.SetSubValue("subsubname11","subsubvalue11");
    subItem1.SetSubValue("subsubname12","subsubvalue12");
    IMessageItem subItem2 = factory.CreateMessageItem();
    subItem1.SetSubValue("subsubname21","subsubvalue21");
    subItem1.SetSubValue("subsubname22","subsubvalue22");

    item.SetSubItem("subitem1",subItem1);
    item.SetSubItem("subitem2",subItem2);

    body.SetItem("item",item);

    //Send Request Message
    MyServiceClient service = new MyServiceClient("Client");
   IMessageItemSequence reply = service.SendRequest("TestService","Test1",body);

      在接收消息端就可以通过获得body的消息体内容,进行相关业务的处理。

3页,页码:[1] [2] [3] 

上一篇:用QQ互动状态 通过临时会话与陌生人聊天
下一篇:巧妙解决Windows异常关机后的磁盘故障
作者:wayfarer  来源:博客堂 ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐