免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: joepayne
打印 上一主题 下一主题

[C++] Boost asio 连接池问题 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
21 [报告]
发表于 2017-11-16 18:28 |只看该作者
本帖最后由 yulihua49 于 2017-11-16 18:31 编辑
sxcong 发表于 2017-11-16 13:38
同步和异步可能没和你说明白:
客户要求同步,也就是说等你发成功再返回。
但网络层一定是异步的,否则效 ...

可以通过协程,把底层的异步操作包装成上层的同步操作。
可以问问WINDOZE版主。

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
22 [报告]
发表于 2017-11-16 21:34 |只看该作者
回复 21# yulihua49

协程的概念好像听说过,有人用过asio + coroutine

论坛徽章:
0
23 [报告]
发表于 2017-11-17 09:03 |只看该作者
楼主这个需求压力不大,用不到协程的。其实服务器端用个最简单的epoll就够了。windows下可以用IOCP,个人感觉,poco库的那个serversocket最好用。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
24 [报告]
发表于 2017-11-17 10:54 |只看该作者
本帖最后由 yulihua49 于 2017-11-17 11:15 编辑
sxcong 发表于 2017-11-17 09:03
楼主这个需求压力不大,用不到协程的。其实服务器端用个最简单的epoll就够了。windows下可以用IOCP,个人感 ...

不是因为压力大小,而是为了解决IO的异步操作和应用的同步需求的。
就是应用以同步方式调用IO。而IO以异步方式实现。
如果压力不大,可采用单线程协程,实现简单些。多线程协程实现起来比较困难,但是大压力系统必须如此。

如果应用以异步方式调用IO,那程序将比较复杂,凌乱而难于维护。而且应用程序员不仅需要熟悉业务逻辑,还要了解IO过程,机制。要求高了点。所以需要系统程序员提供IO框架.


比如我们提供了:
int RecvNet(sock,buf,size,timeout);
int SendNet(sock,buf,size,MTU);
一个调用就完成了IO,使用了epoll机制,在IO未完成时yield,线程放弃了这个任务干别的去了,等返回时,已经是resume了,有可能返回时是另一个线程。
这一切应用程序员都不用管。

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
25 [报告]
发表于 2017-11-17 12:25 |只看该作者
本帖最后由 joepayne 于 2017-11-17 12:26 编辑

回复 24# yulihua49

我也是期望能够做到线性scale强一些,毕竟业务的发展肯定是越来越繁琐,对性能的要求肯定也是越来越高,不可能重复重构这些底层的架构,尽量只是处理一些上层的东西或者硬件配置什么的,不知道华哥关于协程处理这种需求的有没有一些经验可以借鉴一下,或者可供参考学习的资料。

论坛徽章:
3
亥猪
日期:2013-08-28 12:50:23白羊座
日期:2013-11-25 12:55:50酉鸡
日期:2014-02-12 10:46:13
26 [报告]
发表于 2017-11-17 12:32 |只看该作者
回复 16# linux_c_py_php

大哥服务端写得相当健壮啊,客户端是并发异步请求,每个线程一个连接一个请求。不知道如果客户端是并发同步的,每个线程可能有多个请求,应该咋整?如果想复用这些连接呢?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
27 [报告]
发表于 2017-11-17 13:16 |只看该作者
本帖最后由 yulihua49 于 2017-11-17 13:19 编辑
joepayne 发表于 2017-11-17 12:32
回复 16# linux_c_py_php

大哥服务端写得相当健壮啊,客户端是并发异步请求,每个线程一个连接一个请求 ...

每个连接一个线程,低并发的还可以,高并发不可以。而且也不抗DOS攻击,几千个连接下来你就死翘翘了。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
28 [报告]
发表于 2017-11-17 13:24 |只看该作者
本帖最后由 yulihua49 于 2017-11-17 13:39 编辑
joepayne 发表于 2017-11-17 12:32
回复 16# linux_c_py_php

大哥服务端写得相当健壮啊,客户端是并发异步请求,每个线程一个连接一个请求 ...

使用线程池,有限的线程处理大量连接。
每个连接一个CONTEXT,包含这个连接的相关资源描述。这些CONTEXT在epoll里等待。一旦呼入,就由线程池中的一个线程捕获进行处理。线程按照这个context的资源和状态进行处理。
系统由有限个CONTEXT组成,如10000个或65535个。
一般情况,每次accept,从空闲CONTEXT中取出一个,与这个socket绑定,随后把这个CONTEXT丢到epoll等待它发消息。

CONTEXT的具体内容你自己设计,总之是要表达任务的资源、状态。前边说的有关协程操作也是基于这个CONTEXT的,里边会有一个ucontext结构,你可以man一下。

连接断开,任务终止,归还CONTEXT。

论坛徽章:
0
29 [报告]
发表于 2017-11-17 20:49 |只看该作者
首先要确定你有多少连接,epoll,asio这些都是IO复用技术,也就是有大量连接才能体现对性能提升的好处。只有两三个socket的情况,这些快不到那去。

一个合理的架构,单个异步连接,就足够将带宽跑满。

所以先考虑清楚你的线程模型、消息处理机制。参考下apache的三种MPM模型。

如果连接数量不多,从原来的同步改成异步的话,个人觉得并没明显好处,复杂度还提升了N倍。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
30 [报告]
发表于 2017-11-17 22:47 |只看该作者
本帖最后由 yulihua49 于 2017-11-17 23:19 编辑
Fixend 发表于 2017-11-17 20:49
首先要确定你有多少连接,epoll,asio这些都是IO复用技术,也就是有大量连接才能体现对性能提升的好处。只 ...

一个合理的架构,单个异步连接,就足够将带宽跑满。

----------------------------------------------------------
你这仅仅是测试。实际不可能发生这样的事。
实际上都是大量客户端接入,不可能共享连接,流量都是大量连接形成的。异步架构就是要解决大量连接处理的无缝转换,及时处理防止阻塞。所以才有了C10K问题,就是10000个客户端并行问题,这是20~30年前的课题,现在这个根本不是问题,就是靠连接池、线程池、异步操作,协程等等技术实现的。


如果单个连接就形成饱和流量,就不需要任何复杂架构,开一个连接通讯就是了,犹如FTP。
这个就是1:1类型,最简单,同步处理。
而后,M:1类型,M个连接1个线程处理,需要异步处理;M:M类型,M个连接有M个进程或线程处理,可以同步处理。M:N,M个连接N个线程(进程)处理(M很大,N比较小),需要异步处理,对于应用来说有点复杂,因此需要引入协程,提供同步调用接口,如23楼那样的函数。
对于楼主的问题,如果并发数小,可采用M:1或M:M方式。M:1也可能需要协程包装。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP