1 Libraries层 boost::asio是一个异步IO库,提供了一个通用的异步框架,并提供了基本的socket的异步接口,它的主要功能是响应程序的异步IO请求,在操作完成以后,将其加入到一个完成队列之中, 在这个完成队列上有一些工作线程在等着,这些工作线程从完成队列上取出已经完成的操作,调用上层应用提供的一个完成函数--completaion handler。asio库是通过学实现Proactor模式来完成这些工作的,在Windows是直接基于I/O completion port,而在类Unix系统中,是基于epool等函数使用Reactor模式来模拟的。 libpq是开源数据库postgresql提供的客户端接口库。这里选用postgresql是因为postgresql的跨平台性以及其稳定性和高性能,另一方面是由于我对这个数据库比较地熟悉。Libpq也对数据库的连接、查询、更新等提供了异步实现。可以和boost::asio结合在一起提供统一地异步操作接口。
boost::thread库是用C++实现的一个跨平台的线程库, 在C++11中,它已经被纳入到了标准库中。这个库在这里主要用来实现一个线程池,作为boost::asio的工作线程。主要是由Core层的AsyncService来维护。代码的其他地方不直接启动线程。但是在异步操作的完成函数中,对那些共享数据需要加锁保护。 protobuf库是Google发布的一个开源的用来序列化对象的高性能的库,它支持多种语言,比如C++,Java,flash 等等。同时还将字节序等琐碎的东西封装起来了,方便上层应用。 2 Core层 核心层由4个Service: AsyncService、TCPServerService、TimerService、DatabaseService组成。下面是关于它们的基本描述. AttemptService是Core内部使用的,它封装了boost::asio和ThreadPool的功能,提供给其他几个Service使用。从名字上可以看出,他的主要功能是给其他几个Service提供异步调度,这是通过boost::asio提供的功能来实现的,而ThreadPool是提供给boost::asio作为工作线程的。 TCPServerService有一个连接池,管理着客户端来的连接。内部通过AsyncService将socket读写完成消息,通过应用层注册进来的TCPServiceObserver通知到调到应用层去。它和Applications的交互包括: 1) Applications 调用 SetObserver注册用来接收网络读写完成消息; 2) Applications 调用 SendData 发送数据; 3) Core在accept, recv完成后调用 Applications注册的Observer。 TimerService提供了定时器的功能,Applications层可以直接使用它来创建定时器,取消定时器。设定时间到来时,TimerService会调用创建定时器时指定的一个回调函数。
DatabaseService封装了libpq,提供数据库的基本操作。主要管理数据库连接,执行查询操作,执行存储过程等。它的实现中有一个连接池。和socket操作一样,它提供的数据库操作都是异步执行的,所以Applications层需要实现DBServiceObserver来监听操作结果。
|