在Linux服务器程序中,让系统能够提供以更少的资源提供更多的并发和响应效率决定了程序设计价值!怎样去实现这个目标,它其实是这么多年以来一直追逐的东西。最开始写代码时候,省去一个条件语句、用更好的算法使程序时间\空间复杂度降低;到后来为了让数据结构更简单方便的完成数据操作而无意中使用的数据库3范式。这一系列的小细节都有欣慰,今天我在这里的需求是:如何让一个单进程去并发完成多任务?
     单进程并发完成多任务?不能呀,我们并不能要求单进程同时完成不同的任务,因为单进程只能同时拥有一个core!
     我们把进程的任务分割成出来,让各个任务的子任务片逐个轮流在cpu里面执行,那么当子任务片足够细致的话,CPU每段时间都会处理很多子任务,进程又确实在处理很多个不同的任务。所以在这种情况下,总体感知上就能体会到进程在不停的处理多个任务。
     为何要把任务拆分?搞这么复杂又有什么好处,为何不能一个任务一个任务的接下去处理呢?
     回忆下大学时候的操作系统,CPU时间片、状态机、就绪队列、多任务系统这些名词,就会发现通常情况下程序运行过程中会存在一些开销比较大的片段,在这个时间里面如果CPU还继续出来这个程序,就会很多的浪费资源。所以,这个时候操作系统把那些阻塞的程序切换出内核,再把那些就绪状态的任务换入继续处理。
     实际上在大型的服务器系统中,一个单任务可能会经过接口转换、业务鉴权、数据更新等等多个步骤,也很可能经历读写文件、读写数据库、等待外部输入等多种耗时量非常大的工作。这些单任务的组织可以完全参照Linux系统对进程调度的理论来更好的实现,其关键就在于怎样实现对单任务的切割和任务调度。任务的切割和系统的业务绑定非常之紧密,一般会把设计文件操作、数据库操作、等待消息和外部驱动等操作的程序片切割出来。
     任务管理器则实现对任务调度管理工作,它主要根据任务的状态机来实现对任务的调度,提供虚拟接口来实现统一的调度窗口。
          任务单元:一个内存块class\struct,包含该任务的头部信息,如任务编号、当前状态、指向任务内存块的指针等等一系列公共信息。
          任务池:由任务单元数组,进程每个处理的任务都在任务池里面分配一个节点
          任务管理器:完成任务池的统一管理、实现快速索引,任务管理基于几个HashList实现。包括空闲任务队列、超时控制任务队列数组、已超时任务数组等。
     基于以上分析,那么新设计出来的系统就会变成一个这样的机器模型:一个不停接收外部处理,然后把任务切割成多个小块,分别释放到不同服务进程进行处理,最后把小任务处理结果进行归并的任务管理进程。这个是不是有点那啥的影子,其实现阶段系统最终演化出来都具体他们共同的一组特性,即:把系统拆分成数据接口、任务管理、业务提供这三类子系统。也许是自己所见太少,但是最少我接触到的系统都具有这种共同特性,而且它们所在的关键就在于怎么去更好的组织管理具体的任务,hadoop成功就在于此。
                                   
     上面就是我所涉及的一个数据系统,由于数据资料庞大,每张表的数据量要求达到亿级,查询流程需要非常高的性能保证,而更新需要保证数据准确性和一致性。我们在设计系统基础结构的时候,首先考虑采用的是分库及多点并发,但是这样就必须存在多个备份点而且需要高度的数据一致性,加上主机成本因数。最终采用的是PC机+多点备份的模型,通过增加总线控制模块来实现多点备份的数据一致性和高可用性,总线模块即基于上述任务管理器理念设计,它将一个数据更新拆分成多个小任务,分发到多个子业务节点处理,然后再根据各个节点处理结果进行合并,如果失败则进行数据回滚,如果成功则把其它备份节点一并发到备份的兄弟节点去。它将一个查询拆根据备份节点业务量负载到不同备份节点进行出来,以多节点同步处理的方式进行并发。

Linux服务器程序--大数据量高并发系统设计的更多相关文章

  1. 大数据量高并发的数据库优化详解(MSSQL)

    转载自:http://www.jb51.net/article/71041.htm 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能. ...

  2. DB开发之大数据量高并发的数据库优化

    一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. ...

  3. 大数据量高并发的数据库优化,sql查询优化

    一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. ...

  4. 大数据量高并发访问SQL优化方法

    保证在实现功能的基础上,尽量减少对数据库的访问次数:通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担:能够分开的操作尽量分开处理,提高每次的响应速度:在数据窗口使用SQL时,尽量把 ...

  5. sql 数据量高并发的数据库优化(转)

    Mysql 大数据量高并发的数据库优化 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实 ...

  6. MySQL在大数据、高并发场景下的SQL语句优化和"最佳实践"

    本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”.“高并发”仅针对中小型应用而言,专业的数据库运维大神请无视.以下实践为个人在实际开发工作中,针对相对“大数据” ...

  7. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  8. Mysql 大数据量导入程序

    Mysql 大数据量导入程序<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  9. java大数据量调优

    从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案集中在这样几个环节:1.首先需要解决网络带宽和Web请求的高并发,需要合理的加大服务器和带宽的投入,并且需要 ...

随机推荐

  1. pycharm(py 文件中添加作者、时间)

    1.打开 Pycharm,点击 File,再找到 Settings... 2.选择 Editor ----> File and Code Templates ----> Python Sc ...

  2. python(安装)

    1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python3(建议自定义安装路径) 3.配置环境变量 [右键计算机]-->[属 ...

  3. 题目分享X

    题意:一张票有n位数,如果这张票的前一半数字的和等于后一半数字的和(n一定是偶数),就称这张票为快乐票.有些数被擦除了,标记为’?’(’?‘的个数也是偶数),现在Monocarp 和 Bicarp 进 ...

  4. JavaScript toFixed() 实现四舍五入保留两位小数

    const num = 18.186; let result; result = num.toFixed(2) console.log(result) // 18.19 注意,返回值为String类型

  5. 配置中心Apollo搭建全过程

    总体架构 用户在Portal操作配置发布 Portal调用Admin Service的接口操作发布 Admin Service发布配置后,发送ReleaseMessage给各个Config Servi ...

  6. spring学习笔记(八)webSocket

    知识储备 什么是stomp? 我们可以类比TCP与Http协议,我们知道Http协议是基于TCP协议的,Http协议解决了 web 浏览器发起请求以及 web 服务器响应请求的细节,我们在编码时候只要 ...

  7. node常用插件使用

    1.nodemon 用于热更新,随时监控文件的变化 安装npm i -g nodemon 使用nodemon index.js 2.nvm nvm用于nodejs版本管理,我们在开发过程中,不同的项目 ...

  8. 【x64软路由】OpenWrt(LEDE) 20200329编译 反追踪 抗污染 加速 PSW 无缝集成 UPnP NAS

    固件说明 基于Lede OpenWrt R2020.3.19版本(源码更新截止20200329)Lienol Feed及若干自行维护的软件包 结合家庭x86软路由场景需要定制 按照家庭应用场景对固件及 ...

  9. NLTK数据包下载频繁报错——解决方法

    问题描述:Nltk下载数据包,安装频繁报错. import nltk nltk.download() 运行上面的代码,下载nltk的数据包.但是在下载过程中因为各种问题导致网络传输失败,下载不成功. ...

  10. Linux从error while loading shared libraries: libxxx.so.x 错误的常规解决思路看程序与动态库的关系

    出现这类错误的原因通常是动态库无法被加载,本文介绍了常规的解决方案,适用多种情况: 创作不易,如果本文帮到了您: 如果本文帮到了您,请帮忙点个赞