日期:2014-05-16  浏览次数:20895 次

关于网络通信的疑问
大家好

我现在正在做一个网络通信的服务端.

客户端发送数据到服务端,服务端通过不同的数据来甄别所需要做的处理数据库的操作,返回处理后的数据库的数据

现在本人很头疼的是:

1 处理接受到的数据,要创建一个线程来做任务的分流吗?

2 还有关于返回数据占用的内存,这个有什么好的建议吗?可能会频繁的开辟,用内存池.....

能说下,大概要用到什么样的技术吗,或者给个链接,此类的也好.

先谢谢大家了
网络 通信 数据库

------解决方案--------------------
1、你这里涉及到IO的操作,比较耗时,如果不开辟线程去处理的话,后续的业务会阻塞。建议采用线程池,recv完数据后,从线程池中获取空闲线程处理业务。

2、频繁地开辟,释放内存,建议使用内存池,一次开辟,多次使用,并且防止内存碎片。
------解决方案--------------------
用现成的select或者epoll来处理网络连接的问题。。
            关于返回的数据的内存你知道频繁使用那当然是内存池好啊,然后怎么联系起来、你可以用epoll的事件回调来实现、或者通过select吧数据写入到一个队列中去、然后多线程去读这个队列进行操作异步通信
------解决方案--------------------
1 处理接受到的数据,要创建一个线程来做任务的分流吗?
一般高并发的情况用线程池+epoll,看你的客户端并发程度高不高了;

2 还有关于返回数据占用的内存,这个有什么好的建议吗?可能会频繁的开辟,用内存池.....
这个最好使用内存池,可以提高分配和释放的效率,减少内存碎片,减少频繁malloc而提高效率,而且在释放的时候不用像链表那样循环遍历、判断、释放,直接free申请那块内存就行了;
------解决方案--------------------
按你说的,我理解是客户端发送类似增删改查的语句到服务器端,服务器端执行操作后将结果返回给客户端;

可以来一个客户端数据,启一个线程,返回数据时使用内存池,加上同步机制。但如果客户端很多、来的很快,线程启的太多会导致各种效率、同步等问题,这种方式就不太好了;

这种情况下可以使用生产者消费者模型,一个生产者:通过epoll将客户端的数据放到内存池中(这里把处理数据看成是一个任务,把任务放入任务队列中,当然得使用同步机制,多线程);多个消费者:启动n个线程,n个线程完成任务队列里的所有任务(一个线程完成一个任务后继续处理下一个任务,直到任务队列为空,这个又可以使用线程池了。。);返回数据这里有点麻烦了,要是数据量不大,直接栈上的内存就可以搞定,要大,那再用一个内存池。。。

呃,说多了,也不知道理解对不。。。。
------解决方案--------------------
ulimit -s可以看到堆栈大小,一般栈上存一些简单的数字,小型字符串数组等吧;查询返回的数据量有可能比较大;

按你说的场景,也只能想到你那种方法了:
epoll处理描述符,多线程接收语句、执行、发送结果;
这里好像也就只有查询麻烦一些,需要返回查询结果的数据量较大,这根据情况可以使用内存池,也可以考虑静态内存,同步机制是难免的;
------解决方案--------------------
1,做基于coroutine的插件架构。
2,做half-sync-half-async。
3,做leader-follower。

任何一种都可以解决你的问题,参考EPOLLONESHOT。
------解决方案--------------------
至于楼上扯的那些内存池等等,楼主不需要担心,使用tmalloc直接hook掉标准库的malloc/free即可,不需要自己实现,你只需要关注设计上的合理性。