在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. vue 比 js的强大

    //js写留言板 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...

  2. shell之路 shell核心语法【第三篇】运算

    Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符. 原生bash不支持简单的数学运算,默认都是字符串操作,但是可以通过其他命令来实现 算数运算 expr. ...

  3. 使用python实现模拟掷骰子数据分析

    Data:2020/4/8 主题:模拟实现掷骰子数据分析 编译环境:pycharm 库:pygal 说明: code 1:创建一个掷骰子类对象,类方法获得掷骰子随机数1-6,默认6个面,模拟20次将结 ...

  4. 线段树 区间加 gcd 差分 小阳的贝壳

    小阳的贝壳 如果线段树要维护区间gcd 这个很简单,但是如果有了区间加,维护gcd 就比较麻烦了. 这个首先可以证明的是 gcd(x,y,z)=gcd(x,y-x,z-y)   这个可以推到 n 个 ...

  5. Uncaught DOMException: Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string.

    今天上传图片遇到这个报错 百度了下,网上说是input标签type=file所以导致的问题,可是我的type=hidden 解决办法: 把上面的代码改成如下问题就解决了

  6. ASP.NET Core Blazor 初探之 Blazor WebAssembly

    最近Blazor热度很高,传说马上就要发布正式版了,做为微软脑残粉,赶紧也来凑个热闹,学习一下. Blazor Blazor是微软在ASP.NET Core框架下开发的一种全新的Web开发框架.Bla ...

  7. NDK clang编译器的一个bug

    NDK clang编译器的一个bug 问题代码 float32_t Sum_float(float32_t *data, const int count) { float32x4_t res = vd ...

  8. Badboy录制脚本时,提示脚本错误的解决方法

    如下,录制时发生错误:

  9. python 基础应用1

    1.使用while循环输入1 2 3 4 5 6 8 9 10 n = 0 while n < 11: n = n + 1 if n == 7: continue print(n) n = 0 ...

  10. vue 在main.js里使用vue实例

    可以用 Vue.prototype 比如 Vue.prototype.$indicator.close(); 关闭正在加载的动画