如何打造高效的多任务、高并发的网络服务器系统?

同一个功能的软件,不同的团队,不同工程师去实现,肯定是千差万别,甚至从根本上完全不同。所以软件开发在未来很长时间内仍然是一项工匠的手工劳动,尤其像多任务,高并发,偏底层这种对实现技巧比较高的系统,这种系统对开发者来说仍然充满挑战,考验工程师对产品的理解,经验的积累,技术方案的取舍,以及各种因素的权衡。总之,平庸的软件系统,很多人都可以做,但在这个领域内的标杆产品,只有功力深厚的工程师才能驾驭。

对应用服务器业务类型的深入理解
开发一个产品,肯定要先对产品的业务和功能必须有深入的理解,脱离业务去谈产品的技术实现,那无异于空中楼阁,没有根基,产品是为解决业务需求,业务痛点而存在的。首先架构师将一个大的解决方案进行模块切分,然后对每个软件业务模块进行需求定义,接下来技术专家对实现方案进行技术论证决策和开发任务提炼,最后开发工程师负责开发任务的实现。作为各个环节的参与者,我们首先要深入理解需求定义,探明软件日常的工作场景,然后才能有针对性的进行相关的构建和设计。
我们一般大体上将服务器软件类型分为“IO密集型”和“计算密集型”。IO密集型,顾名思义,就是说软件要处理高并发,大数据量的网络或者文件IO请求,这时我们要将CPU计算资源向IO倾斜,并审慎的选择高效的IO模型,IO模型的选择也包含了很多技术内容,同时也有很多的框架支撑,具体不在此赘述。计算密集型,就是说软件的主要业务是进行同步计算,这时我们的侧重点要考虑如何在多核CPU之间分配、同步这些计算任务,使之充分利用计算资源;IO层面如何做到精简,稳定,可靠。当然也存在着“IO和计算混合型”,那我们就要结合具体业务综合考虑技术方案。总之,兵无常势 水无常形,具体问题,具体分析,决策的依据都来源于我们日常的总结与积累。

计算任务的合理分配(多任务CPU资源的分配)
我们早已迈入多核CPU的时代,在服务器领域,尤其如此。服务端的软件系统要充分利用计算资源,那就必须适应多核CPU的并发特性。提到这里,很多人会想“不就是多搞几个线程就行了,有什么难的”,是啊,那搞几个线程?为什么要把这个任务放在这个线程里?深究起来,都不是简单的问题,我们在开发一个系统前,必须要有“并发性规划”,根据业务特点,进行进程,线程,线程池,同步/异步,阻塞/非阻塞的规划选择,任何选择都不是随意的,都是有考量和统筹的,甚至有模拟演算,这样的决策才是科学、有效的。

IO复用模型的合理选择
服务端系统要么要接收外界的数据流,要么要监听外界的指令。数据流和指令的接收处理方式,都要涉及到IO模型的选择,尤其对IO密集型的应用,IO模型的选择和开发实现,是产品成功与否的关键,这也是CamelProxy的核心技术。除了标准的socket标准,不同的操作系统平台也对IO复用模型有不同的技术支持,比如Linux平台的poll, epoll,Windows的重叠IO,完成端口等。同时也产生了很多第三方的跨平台的C++网络开发框架和库,同时支持同步的,异步的,反应式,前摄式的等操作方式,并且也提供了很多网络开发过程必不可少的组件,比如主动对象,线程池,消息队列,同步控制等。这方面的框架包括ACE, Libevent, Boost等,都是非常好的网络开发知识总结和实现。总之,没有差的技术,只有合不合适你当前场景的技术,合理的选择,将会事半功倍。

内存资源的高效使用
作为一个服务器后台系统的开发者,我们都希望自己的系统高效,能够长时间稳定运行的,最好能连续几个月,不需要重启的。从我们的经验来看,要达到这个目标,必须对内存的调配使用要着重考量。内存的使用也是反应一个开发者在C, C++编程能力的重要指标,如果代码中临时对象,内存复制满天飞,起码就反映了开发者对语言的机制没有深入洞悉。在内存使用技巧上,要注意两个方面。首先,不要频繁的进行内存的动态分配,释放,避免内存碎片的累积。很多系统也没有内存泄漏,但随着运行时间的退役,内存占用量不断上升,最终到了一个临界点,然后系统就必须重启。内存最好在系统开始运行就分配好,再根据系统的负载的变化动态的调整预分配的内存,或者用内存池等技巧来优化;再者,编程实现时,注重指针,引用的使用,避免不必要的临时对象的产生,用不好指针的程序员,不是合格的C++开发者。总之,开发高效,稳定的系统,内存的编程实现技巧必不可少,考验的也是开发者的功力于思考。

多线程并发的有效控制
充分挖掘多核CPU的计算能力,就必须应用多线程,多执行路径的程序设计方式。多线程开发除了带来线程路径设计和执行任务分配的问题外,还有一个重要的问题就是线程间的协作和通信。这不仅包括了多线程对竞争资源的访问控制,也包含了线程的通知激活,优雅退出,以及衍生出来消息队列,流水线操作,都需要适当的场景选择合适的方案。

语言工具的选择
干什么活用什么样的工具,工具的选择会使过程和结果事半功倍。做高性能,大容量,高并发服务端后台服务软件系统,开发语言一定是C,C++, 因为该语言提供了足够的空间,让你充分运用各种技巧来优化程序的性能,这是其他高层语言所不能具备的,其他语言为了降低开发者所需掌握的难度与复杂性,做了太多的封装与抽象化,不适合做一些高性能的应用。
选择了对的工具,剩下的就是考验实现者对工具的运用的水平,也是系统实现的关键和核心,也体现了一个高水平开发者对软件的认识与思考,懂得如何有的放矢,充分解决问题,又不臃肿。正可谓“增一分则太长,减一分则太短”,取舍之间,大有乾坤。

这是在开发网络代理服务器CamelProxy系统-CamelProxy代理服务器过程中一点经验总结,如果您有更好的建议,欢迎批评指正。

转载于:https://blog.51cto.com/13535157/2093238

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)

题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过。(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得到这个节点所代表的子串出现在多少个模式串中。 建立广义后缀自动机。每次插入…

BigDecimal 加减乘除运算

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 java.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDeci…

主码 超码 候选码

码是数据系统中的基本概念。所谓码就是能唯一标识实体的属性,他是整个实体集的性质,而不是单个实体的性质。它包括超码,候选码,主码。   超码是一个或多个属性的集合,这些属性可以让我们在一个实体集中唯一地标识一…

学成在线--18.新增课程(课程分类查询)

文章目录一.需求分析二.课程分类查询介绍三.数据结构四.数据格式五.数据模型六.Api接口七.服务器端1.Dao1)定义mapper2)定义mapper映射文件2.Service3.Controller八.接口测试一.需求分析 用户操作流程如下: 1、用户进入“我的课程”页面&…

给程序员们的工资报价提醒

在薪水上讨价还价的方式有很多种,我要说的这一点也许并不是最好的。然而,如果使用的得当,会收到很好的效果。如果你正在跟一家公司接触(没有经过职业中介),而且事情看来很顺利,进度很快,你要保持这种面试的…

POI 方式-excle 表格导出实现-java-poi

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 效果&#xff1a; jsp 页面 用的Bootstrap &#xff1a; <li class"dropdown"> <a href"javascript:void(0)…

02-css的选择器

css的选择器&#xff1a;1.基本选择器 2.高级选择器 基本选择器包含&#xff1a; 1.标签选择器标签选择器可以选中所有的标签元素&#xff0c;比如div&#xff0c;ul&#xff0c;li &#xff0c;p等等&#xff0c;不管标签藏的多深&#xff0c;都能选中&#xff0c;选中的是所有…

iphoneX样式兼容

// 1.viewport meta 标签增加属性viewport-fitcover // 2.body元素增加样式 body { padding-bottom: constant(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom); } // 3.如有fixed底部的元素&#xff0c;也增加上面样式 xxx { padding-bottom: constant…

学成在线--19.新增课程(数据字典)

文章目录一.介绍二.数据模型三.数据模型类四.字典查询API接口五.服务器端1.Dao2.Service3.Controller一.介绍 在新增课程界面需要选择课程等级、课程状态等&#xff0c;这些信息统一采用数据字典管理的方式。 本项目对一些业务的分类配置信息&#xff0c;比如&#xff1a;课程…

范式简介

范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。范式的种类&#xff1a; 第一范式(1NF) 第二范式(2NF) 第三范式(3NF) BC范式(BCNF) 第四范式(4NF) 第五范式(5NF) 一个低一级范式的关系模式&#xff0c;通过模…

程序员的进化

对于很多同学来说&#xff0c;他们对程序员的职业生涯非常关注。而这本质上是一个进化的过程。我们将如何进化&#xff1f;在每个进化阶段我们应该如何提高自己&#xff1f;下面的文章根据我自己的切身经历和阅读过的书&#xff0c;为程序员每个阶段的进化提供了不同的学习思路…

【树形dp】vijos1144小胖守皇宫

细节很精妙 描述 huyichen世子事件后&#xff0c;xuzhenyi成了皇上特聘的御前一品侍卫。 皇宫以午门为起点&#xff0c;直到后宫嫔妃们的寝宫&#xff0c;呈一棵树的形状&#xff1b;某些宫殿间可以互相望见。大内保卫森严&#xff0c;三步一岗&#xff0c;五步一哨&#xff0c…

手机号码归属地及运营商查询

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;public class NewMobile {public stati…

redhat6.5手动配置网络

2、手动设置ip地址如果虚拟机不能自动获取IP&#xff0c;只能手动配置&#xff0c;配置方法如下&#xff1a;输入命令#vi /etc/sysconfig/network-scripts/ifcfg-eth0 [编辑网卡的配置文件]输入上述命令后回车&#xff0c;打开配置文件&#xff0c;使用方向键移动光标到最后一行…

学成在线--20.新增课程(最后完善)

文章目录一.效果展示二.服务端1.Api接口2.Dao3.Service4.Controller三.前端1.页面完善1&#xff09;创建course_add.vue页面2&#xff09;course_add.vue页面路由3&#xff09;course_list.vue中添加链接2.查询数据字典1&#xff09;视图中代码2&#xff09;定义Api方法3&#…

http协议工作流程

用户单机鼠标后所发生的事件过程如下&#xff1a; &#xff08;1&#xff09;浏览器分析链接所指向页面的URL。 &#xff08;2&#xff09;浏览器向DNS服务器请求解析URL的IP地址。 &#xff08;3&#xff09;域名系统DNS解析出URL对应的IP地址。 &#xff08;4&#xff09…

html里面表格问题

表格问题汇总&#xff1a; 现代网站中表格的用武之地已经很少了&#xff0c;但是一些框架&#xff0c;如bootstorp还是会用到的&#xff0c;所以还是需要了解掌握。本随笔只涉及开发过程中遇到的表格问题&#xff0c;不做其他拓展。 1、caption代表的是表格元素的标题。至于标题…

利用Underscore求数组的交集、并集和差集

1 数组交集函数——intersection 数组的交集是指包含多个数组中的共同元素的一个数组&#xff0c;求数组的交集就是找出给定数组中的共有元素。 下面实现一个求两个数组交集的函数。 判断数组是够包含指定值&#xff0c;使用Array.indexOf就可以。所以我们可以遍历第一个参数数…

RT-Thread简介

RT-Thread简介 RT-Thread是一款完全由国内团队开发维护的嵌入式实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有完全的自主知识产权。 经过16个年头的沉淀&#xff0c;伴随着物联网的兴起&#xff0c;它正演变成一个功能强大、组件丰富的物联网操作系统。 RT-Thre…

调用第三方API ,实现手机号码归属地及运营商查询

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 运行结果&#xff1a; 中国电信 西双版纳 西双版纳,中国电信 代码&#xff1a; import java.io.BufferedReader; import java.io.I…