客户端与服务器通信端并发通信有哪些方法

扫扫二维码,随身浏览文档

手机或平板扫扫即可继续访问

基于JavaSocket多客户端并发通信聊天程序的设计与实现

来源:网络


前言
曾几何时我们还在寻求网络编程中C10K问题(有关C10K问题请见文章《The C10K problem(英文在线阅读、英文PDF版下载、中文译文)》)的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。

我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用户基数的互联网公司,往往面临的并发连接数是百万、千万、甚至腾讯的上亿(注:QQ默认用的UDP协议,具体请见讨论贴《为什么QQ用的是UDP协议而不是TCP协议?》)。

虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。

那么到底一台服务器能够支持多少TCP并发连接呢?这就是本文要讨论的问题。


C10K问题系列文章
本文是C10K问题系列文章中的第1篇,总目录如下:

《高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少》(本文) 《高性能网络编程(二):上一个10年,著名的C10K并发连接问题》 《高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了》 《高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索》 《高性能网络编程经典:《The C10K problem(英文)》[附件下载]》


常识一:文件句柄限制
在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。

这时你需要明白操作系统对可以打开的最大文件数的限制。


执行 ulimit -n 输出 1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。临时修改:ulimit -n 1000000,但是这种临时修改只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。

本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:zixun-group@ 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

关键词: 数据库连接池 包)和NIO(/huangyanlong),否则作者保留追究版权法律责任。 ...

第一步:手机上下载***BES10客户端程序。 Android BES10客户端下载: 建议使用第一安卓手机市场。 首先android手机去 ,工作人员会在5个工作日内回复。

03:06 浏览: 来源:浚网科技

最近在高并发、较大数据的上有一些心得和体会,所以特写此文做一下总结,这块的高手就可以直接跳到文尾了哈,费话就不多说,直接进正文。

1.了解你的网站和项目到底有多大的流量和并发?

当项目的用户量达到一定规模以后,网站往往会经常出现502 bad gateway(Nginx),连接超时(Apache),MYSQL拒绝连接等问题。这个时候,一般的理解就是网站的访问量比较大,请求数比较高,所以服务器不堪重负,开小差去了。这个时候最快的解决办法一般就是重启apache,nginx或mysql,当然这个不能解决根源,只是临时解决一下而已。

那么,首先你应该清楚你的网站的流量到底有多大?每秒的流量到底有多高?CPU占用峰值是多少?对于这个问题,首当其冲方案的肯定使用是监控软件了,这类的监控软件比较多,有cacti(完全图形化的流量监控工具),zabbix(支持各种数据的监控且可自己扩展监控模块并集成报警功能,非常强大!)所以第一步你就一定要先在所有服务器上***监控客户端,如cacti的snmp,zabbix的zabbix_client,然后搭建自己的监控服务端。然后静默收集数据一段时间,可以是几天也可以是一周。然后了解服务器的峰值是多少,平均值是多少,CPU占用,内存占用。这样你能先做到对服务器的状态心里有底。

如果服务器一直运行得比较正常,但突然一段时间经常出现502,超时,超高CPU时,排除流量的超大幅度增长以外的原因,那么原因就有可能是程序卡死了或服务器硬件故障。如果排除硬件故障以后这个时候最好第一步查询MYSQL、PHP、Nginx、Apache的错误日志,慢日志,定位根源文件及代码块,往往新功能如果没有经过完整的测试就上线,就非常容易引起这类的问题。

比如我们的一台线上服务器有段时间曾经上线了一个新功能,就是要求在某代码模块中将MYSQL服务器地址更改为其它机房的MYSQL服务器,由于代码没有经过严格的测试,而直接使用了MYSQL_CONNECT重新连接。在这个功能上线以后,服务器经常出现502,超时,CPU90%。后来排查时才看到这里,由于其它机房的网络问题引起MYSQL_CONNECT超慢,所以大量的MYSQL_CONNECT卡死在这里引起了阻塞。另外一个统计模块的file_get_contents也是同样的问题,所以我们在后面的开发中要求一定要禁止使用file_get_contents,另外MYSQL_CONNECT也要限制超时的时间。

如果程序上没有问题,那就要从数据库或队列上去查找原因了。数据库上的问题会非常多,比如一条没有经常优化的SQL语句引起表的锁死啊,MYSQL并发量达到预设峰值,表崩溃啊,等待进程过多啊等等。

经验告诉我们,队列和缓存绝对是解决高并发的非常有效的办法。比如邮件发送,这类功能其实客户端并不需要等待完成,所以我们在前端只需要一直把要发送的邮件地址,内容等一并放到队列里,后台程序慢慢从队列里面去取就OK。对于队列的解决方案有许多,比如memcache,redis等。

关于memcache,前段时间尝试自己用memcache来写了一个队列,平台windows。最终效果非常不理想,在循环的get或set时,memcache会显得非常缓慢,并且最终的命中率一点都不高。在windows平台上的redis会由于pull的不支持造成在高并发时经常redis server gone away的情况。在*inux平台上,redis表现了非常棒的性能和稳定性,目前公司线上产品在使用redis后,已经非常稳定,所以redis绝对是值得使用的神器。

这是一个非常严重的问题。HTTP上的阻塞,MYSQL的阻塞,阻塞的结果将是服务器不能正常响应请求,CPU居高不下,并且很难发现问题。这要求我们在开发阶段,对于容易引起阻塞的地方一定要特别注意,如果某段代码执行的时间会非常长,就一定要交给子进程来做这个事情。对于这个情况,node.js是一个非常好的解决方案,因为node.js正是为非阻塞而生的。并且这几年node.js发展迅速,各类模块越来越多,也越来越稳定,框架的出现也大大的提升了代码编写的速度,像express和eventproxy这类的,新手可以非常快的开发一个node.js未阻塞应用。

在高并发和大数据量的情况下,分表分库是一定要的,并且尽量按模块分。不要相信分区,分区这货非常容易引起表崩溃,特别是MYISAM引擎下,分区不仅会在一个文件夹下产生一堆的文件,还非常有可能因为打开的文件句柄过多而出现各种MYSQL错误。

根据情况选择不同的引擎或数据库软件,MYISAM,INNODB等引擎要在不同的情况下使用,MYSIAM适用于查询多,插入少;INNODB适用于写入多,查询少和事务支持。noSQL也是非常值得尝试的产品,PHP对mongdb的支持还行,操作也挺方便的。

M/S在高并发下存在延迟问题,临时解决方案是可以用缓存。

6.静态资源与动态分离

带宽是非常珍贵和昂贵的。有条件一定要使用CDN,在速度上提升会非常明显,同时也能保证动态程序服务器的稳定。

好了,以上就是近期总结的一些经验。

参考资料

 

随机推荐