免费注册 查看新帖 |

Chinaunix

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

谈谈你接触的通讯程序的模型 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2011-01-10 22:59 |只看该作者
回复 40# maclaurin


    是的。对于处理UDP,目前我们没有好的处理方案对于通讯与业务分离的架构。在实际生产环境中,我们采用的是TCP的方式。

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
42 [报告]
发表于 2011-01-10 23:21 |只看该作者
本帖最后由 一介村夫 于 2011-01-10 23:24 编辑

多线程模型就像人弹,有人要死,却拉上一大堆垫背的。

我再说一遍:多进程模型是用于每个进程干自己的事,互相不影响;多线程模型是用于所有线程协调干一件事,每个线程负责一个部分。

多线程模型中的线程,彼此的工作内容应该是不同的,同时又是互补的,大家完成的是同一件事的不同部分。基于这样的理解进行设计,就不存在“人弹”的可能性。

所以在一般通讯服务程序的场合,绝对应该使用多进程模型。

进程与线程,看着相似,实际的出发点和作用是不同的,所以不能乱用,要根据应用模型进行选择。再说得浅显点就是:在一个多线程模型中,任何两个线程都不应该使用同一个函数作为入口点!

评分

参与人数 1可用积分 +5 收起 理由
duanjigang + 5 精彩点评!

查看全部评分

论坛徽章:
0
43 [报告]
发表于 2011-01-11 09:05 |只看该作者
回复 42# 一介村夫


嗯。有一定道理嗯。
但是也存在多个线程干一类事情,但是相互独立的事情。

论坛徽章:
0
44 [报告]
发表于 2011-01-11 09:53 |只看该作者
第一:你们的通讯程序独立于应用程序吗???
独立,一个前置通讯网关对应多个应用服务器。

第二 ...
maclaurin 发表于 2011-01-10 22:00



    恩,大致明白了。有个问题喔,通讯程序相当于做成了一个独立的中间件了。这样的话,应用程序其实不必再关注通讯程序使用到的协议了吧?
如果你们的通讯已经独立于应用了,我想应该是这样吧?那么,这时是不是都应该用TCP来实现?为了可靠起见。谢谢

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
45 [报告]
发表于 2011-01-11 10:00 |只看该作者
回复  一介村夫


嗯。有一定道理嗯。
但是也存在多个线程干一类事情,但是相互独立的事情。
jiang1013nan 发表于 2011-01-11 09:05



    一个进程崩溃,毁掉的是一大批事情,而不仅仅是出问题的那一个,这不合理。
而且在这种模型中,你无法中断一个已经出现问题的独立事情。

进程和线程在系统开销上的那点差别,远远小于你应用程序写得好与不好的差别,不同的人为同一个事情写程序,开销差别都很大,何必在乎进程和线程开销间的这一点差别呢?真在乎系统开销,就先认真写好自己的应用程序吧。

所以,一定要选择适合的模型做适合的事情。

论坛徽章:
0
46 [报告]
发表于 2011-01-11 10:17 |只看该作者
多线程模型就像人弹,有人要死,却拉上一大堆垫背的。

我再说一遍:多进程模型是用于每个进程干自己的事 ...
一介村夫 发表于 2011-01-10 23:21



    阿村说的很精辟,应该是多年的经验感言!
但是有些人出于节省代码量的想法还是违背这些原则了,比如为了使用公共的全局变量,节省代码量,把通讯的server端和client端做成了两个线程。
呵呵,我就这么搞过
关于数据处理部分,现在完全做成了独立的进程,每个消息处理插件一个子进程,也是充分考虑到“人弹”这个因素了。
看样子通讯程序本身,还应该再分离出来。这样才合理。

论坛徽章:
0
47 [报告]
发表于 2011-01-11 10:23 |只看该作者
当然:连接和数据发送在一个进程中用多线程,这是合理的。
但是连接和数据发送线程所属的进程和数据接收部分,应该独立开,是两个进程

论坛徽章:
0
48 [报告]
发表于 2011-01-11 12:02 |只看该作者
回复  duanjigang

在实际生产环境中达到了8K人左右额。
jiang1013nan 发表于 2011-01-10 20:51



    关于这个数据,是在怎么样的情况下获得的?
不知单台服务器是怎样的配置情况:操作系统、CPU位数、CPU个数x单个CPU核数、内存大小,网卡/网络带宽限制、非业务相关压力负载情况(比如在同一台机器上,是否有web服务器正在提供非被测业务的服务?)。每秒发包数、平均包大小。因为在我以前的性能测试经验中,这些对最终性能数据影响很大。如果没有全部说明的话,则对比性就不强了。

论坛徽章:
0
49 [报告]
发表于 2011-01-11 12:42 |只看该作者
我一直都用的阻塞, 但是对于非阻塞 我个人认为和阻塞差不多.  对端主动关闭, RECV返回0, 对端异常关闭 非close() shutdown的 RECV返回-1, 如果没有数据来 RECV也返回-1, 根据errno来区分是哪中情况. 心跳包 是用来检测路由的, 比如A->switch->B , switch那里网线掉了, A和 B一般情况是检测不到的, 除非那个交换机有这个功能或者SOCKET设置了那个TCP自测的选项.如果A->B直连的话, 只要网线中间不断开, 有没有心跳包 效果一样....

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
50 [报告]
发表于 2011-01-11 14:48 |只看该作者
有个问题想请教ls各位大拿
采用第一种模型
while(1)
{
accept()
pthread_create()
}
是否存在一些弊端,对于高并发的请求的情况下,服务器容易当掉,只能采取没有办法的办法在pthread_create()
后睡眠几微秒,可以一定程度的缓解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP