线程是一个非常重要的概念,尤其是现在多核服务器的发展。当然,提到了线程自然应该说到线程之间的互斥。这也是服务器开发者们在开发最初最容易出现的问题。体现在一个资源或者多个资源在多个线程中共享使用如何避免出现脏数据的问题。
线程池,池,顾名思义,是一个存储容器,一个浅显的比方,我们把水事先存放在水池里面,当我们需要的时候,就去里面取,用完了就还给池(其实这里并不是非常合适的例子,毕竟我们用完了水是丢掉)。这是一个由多个线程组成的一个队列,当有事情发生时候,我们把当前的空闲的线程丢给他,为他服务。当下一个事件发生的时候,我们又从池里面取一个空闲的线程丢给他,为他服务。当服务完毕,把线程丢回池中。起到反复利用的目的。
内存池,同样也是一个池。这个概念的产生是为了避免服务器频繁的分配内存,而采取预先分配一定数目的对象,并将对象们放到队列中,当需要的时候,从该队列中取出,当用完,就返回池中。比如我们的Server可能会存在10000个连接,我们预先开辟10000个Client对象,存储在list pFreeClientsList中,当需要的时候,从队列中pop一个出来,当使用完毕就丢回pFreeClientsList。这种机制很好的起到了避免频繁开辟内存对象的目的,可以很好的提高系统的性能。
数据库连接池,同上面一致的道理,在服务器中,数据库访问也是一个很大的瓶颈,所以同样采取上面的道理,使用连接池的概念。当然在数据库连接方面也有一个特殊的问题存在。就是数据库的连接不宜过多,所以传统的来一个处理,就开一个连接是不合理的,必须采用控制适当的连接次数。
内存数据库。硬盘的访问速度和内存的访问速度不是一个数量级的,而且随着内存的硬件价格越来越低,内存数据库的可行性也越来越高,尤其是实时性要求高的系统,完全可以采用内存数据库和物理数据库想结合的方法来处理。
l Broker启动,完成自身的初始化,之后进入事件循环,等待消息到来。
l Server启动,首先执行自身的初始化,然后注册自己到Broker。
l Broker接收Server的注册请求,将其加入到可使用服务的列表,并回应Ack给Server。
l Server接收Ack,进入事件监听循环,等待消息到来。
l Client调用远程服务对象的方法,Client_Proxy封装消息请其发送给Broker。
l Broker查询可使用的Server,将请求转发给Server。
l Server_Proxy解析消息,分离出参数和控制信息,并调用特定的Server实现接口。Server处理完的结果通过Server_proxy封装成消息转发到Server。
l Broker将相应消息转发给正确的Client_Proxy,Client受到响应继续其他逻辑。
由于Server是注册到Broker上的,所以Server可以动态的增加、删除、改变。