服务器端软件的一种设计
来源:互联网 发布:ubuntu输入中文 编辑:程序博客网 时间:2024/06/10 18:35
服务器端软件的复杂度相对比较高。30000多行代码的中间件软件的主线程程序又是怎样的呢?
小鸡射手在实际工作中设计的网络服务的主线程代码如下:
IContext& context = ContextManager::GetContext();
IEventHandler& handler = EventHandlerManager::GetEventHandler();
while(!IsStopped())
...{
IEvent* event = context.eventQueue.GetEvent(context.configSetting.eventQueueTimeout);
if(event==0) continue;
...{
const auto_ptr<IEvent> pEvent(event);
try
...{
event->Handle(handler, context);
}
catch(const exception& ex)
...{
context.logger.Error("Dispatcher中发现异常:[%s]。", ex.what());
}
catch(...)
...{
context.logger.Error("Dispatcher中发现未知异常。EventID is [%s]", event->GetInfo());
}
}
}
IEventHandler& handler = EventHandlerManager::GetEventHandler();
while(!IsStopped())
...{
IEvent* event = context.eventQueue.GetEvent(context.configSetting.eventQueueTimeout);
if(event==0) continue;
...{
const auto_ptr<IEvent> pEvent(event);
try
...{
event->Handle(handler, context);
}
catch(const exception& ex)
...{
context.logger.Error("Dispatcher中发现异常:[%s]。", ex.what());
}
catch(...)
...{
context.logger.Error("Dispatcher中发现未知异常。EventID is [%s]", event->GetInfo());
}
}
}
这段代码应该还是比较好理解的,eventQueue采用stl queue加上线程同步机制实现。其中涉及到的两个关键接口定义如下:
class IEvent ...{
public:
virtual ~IEvent() ...{}
virtual void Handle(IEventHandler& handler, IContext& context)=0;
virtual const char* GetInfo()=0;
};
class IEventHandler ...{
public:
virtual ~IEventHandler() ...{}
virtual void Handle(ThisEvent& event, IContext& context)...{}
virtual void Handle(ThatEvent& event, IContext& context)...{}
virtual void Handle(OtherEvent& event, IContext& context)...{}
}
public:
virtual ~IEvent() ...{}
virtual void Handle(IEventHandler& handler, IContext& context)=0;
virtual const char* GetInfo()=0;
};
class IEventHandler ...{
public:
virtual ~IEventHandler() ...{}
virtual void Handle(ThisEvent& event, IContext& context)...{}
virtual void Handle(ThatEvent& event, IContext& context)...{}
virtual void Handle(OtherEvent& event, IContext& context)...{}
}
设计的灵感来自于:
- Windows的消息机制。早期的Windows开发主程序就是GetMessage和switch循环,所以以上程序只是对此思想的Object Oriented版本;
- Think in Java对垃圾分类的讨论,垃圾分类问题可以通过Visitor模式解决。下面就是采用该模式实现的具体event类的Handle方法。应用逻辑则是在IEventHandler的子类中实现。
void ThisEvent::Handle(IEventHandler& handler, IContext& context)
...{
handler.Handle(*this, context);
}
...{
handler.Handle(*this, context);
}
该设计的优点是:
- 尽管服务器端的软件往往是多线程的,需要线程间同步。但是由于该设计的处理均在主线程上完成,故eventHandler中不需要(或者减少了大量)同步;
- 软件扩展容易,只要加event和对应的eventhandler;
- code on interface,代码接口和实现分离,易于维护。
当然,该设计也有需要注意的地方:
- eventHandler中的操作不允许blocking,所以类似写日志这样的操作实际上是放到后台线程完成的。 其中的原因和界面处理程序中长时间操作会导致界面没有反应一样;
- 理论上,该设计在多CPU的机器上,可能不能完全发挥硬件的潜力。
总之,这还是不错的设计。小鸡射手已经成功将它运用到公司的两大产品中。
- 服务器端软件的一种设计
- 服务器端软件的一种设计
- 一种.NET软件加壳技术的设计与实现
- 桌面软件底层日志的一种改进设计
- 服务器端执行的浏览器软件
- Windows服务器端软件的安装
- MMORPG游戏服务器端的设计
- MMORPG游戏服务器端的设计
- MMORPG游戏服务器端的设计
- 软件开发的一种方式
- 一种简单的报表软件
- 一种简单的软件延时
- 设计模式是软件的灵魂, 开发语言是多种实现的一种
- 一种服务器端名片识别
- 一种新的思路设计远控去改造小白虎远程控制软件
- cwRsync 客户端服务器端同步的软件
- ftp服务器端软件的中文乱码问题
- 网站服务器端的软件优化方案
- 如何使用Microsoft的Support站点
- 会话目录及使用终端服务器的负载平衡
- IE6与IE7两个常用设置导致的页面显示问题
- Oracle Tips
- 服务器端软件的一种设计
- 服务器端软件的一种设计
- 6 Different Version of Windows Vista
- Windows XP操作系统自带工具应用
- 有关VPN连接的15项故障诊断提示
- Java知识集锦
- 路由和远程访问服务(RRAS)的事件ID列表
- 几个新东东的下载,很不错的说
- DataColumn类有关属性难点释疑
- Windows进程系列(3) -- Windows 2000 Server进程