服务器端的高性能实现(一)——策划

24 篇文章 0 订阅
13 篇文章 1 订阅
这么快就过完新年了,又得上班了。新年了,干些什么呢?

想做一个服务器端的服务,提供一个高效处理客户端响应的解决方案,锻炼和加强一下以前的技术。

这个服务器端有如下需求:
1、能支持多个客户端(似乎是废话);
2、占用资源尽量低;
3、效率尽量高;
4、功能扩展方便

其他需求:
1、使用TCP协议
2、在windows下用.net实现一套,同时在linux下用c++实现一套,两个平台都练习一下。
3、如果还有精力,在mac下也实现一套,呵呵

今天做第一件事情——策划。

这样的东东网上很多,做起来似乎很容易。但是真的等到自己上手去做了,才发现其实问题很多。

首先,每个客户端与服务器端通信的时候,肯定会有一个socket的,这个socket,是两端都有的。对于客户端来说,这没什么,因为它就有一个,处理起来很方便。可是服务器端就不一样了,有多少客户端,它就得有多少个socket,于是问题就来了,如何管理这些socket呢?

举个例子来说吧:
服务器端要等待客户端的消息,就要调用socket的receive方法。那么如果有100个socket呢?怎么办?

第一个方法是建立一个socket队列,然后轮循,对每个socket调用receive方法。但是这里有个问题,就是时效性太差。假如发消息的那个socket正好排在最后面,那么不好意思,你必须等前面的99个都receive一遍才可以。所以这个思路不行,被枪毙掉。

第二个方法是对每个socket都起一个线程,这样就能保证时效性了。可是,起100多个线程,呵呵,似乎很不好看啊,而且老板给我电脑性能就那样,这么做程序,肯定也不行。

那怎么办呢?

我的思路是这样的:
采用异步socket,这样在receive之后就会立刻返回。然后在它的回调函数里面,将收到的信息打包成一个任务,加入到任务处理队列里面。

同时,启动一个任务处理的线程(池),它监视任务处理队列,一旦里面有任务,就进行处理,做我们想要做的事情。处理完成之后,将这个socket标记为已经处理完成,运行它再次进行receive,也就是把它放到receive队列里面。

到这里,再启动一个线程,用来为receive队列里面的socket调用receive方法。它监视这个队列,一旦队列里面有socket,就为其调用receive方法。

至此,基本的思路就有了。

接下来就是具体的实现了。不过我还不打算一下就实现上面的结果。毕竟是本着学习和研究的目的嘛,多走些弯路不是坏事情。

我的计划如下:
1、对每个socket,起一个线程去处理,目的是考察这种方法的上限。
2、在1的基础上,引入线程池,统一对消息的处理。
3、在2的基础上,该用异步socket,通过高性能的方式实现消息处理。
4、对比两种方式的效率差异。

下一次,我先在windows上面进行部分功能的实现,毕竟我对windows更熟悉一些哈。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值