在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. C语言编程入门题目--No.10

    题目:打印楼梯,同时在楼梯上方打印两个笑脸. 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数. 2.程序源代码: #include "stdio.h" ...

  2. C++获取当前系统时间并格式化输出

    C++中与系统时间相关的函数定义在头文件中. 一.time(time_t * )函数 函数定义如下: time_t time (time_t* timer); 获取系统当前日历时间 UTC 1970- ...

  3. poj1679 The Unique MST(最小生成树唯一性)

    最小生成树的唯一性,部分参考了oi-wiki 如果一条不在最小生成树边集内的边,它可以替换一条在最小生成树边集内,且权值相等的边,那么最小生成树不是唯一的 同过kruskal来判断 考虑权值相等的边, ...

  4. python(类多态)

    一.多态 (以封装和继承为前提)不同的子类调用相同的方法,产生不同的结果 class Dog(): def __init__(self,name): self.name = name def game ...

  5. RF(IF 判断)

    1.关键字 Run Keyword If,格式如下: ELSE   必须大写 ELSE   前面需要加 "..." 表示缩进 Run Keyword If a == b log T ...

  6. 慎用ToLower和ToUpper,小心把你的系统给拖垮了

    不知道何时开始,很多程序员喜欢用ToLower,ToUpper去实现忽略大小写模式的字符串相等性比较,有可能这个习惯是从别的语言引进的,大胆猜测下是JS,为了不引起争论,我指的JS是技师的意思~ 一: ...

  7. P2774 方格取数问题 网络流

    题目: P2774 方格取数问题 题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

  8. .NET Core+QQ第三方授权登录

    安装包 dotnet add package AspNet.Security.OAuth.QQ 接上文GitHub第三方授权登录 申请过程不介绍了,申请者资料,个人也是可以申请成功的. 这时候有二个参 ...

  9. Unity 游戏框架搭建 2019 (四十六) 简易消息机制 & 集成到 MonoBehaviourSimplify 里

    在上一篇,我们接触了单例,使用单例解决了我们脚本之间访问的问题. 脚本之间访问其实有更好的方式. 我们先分下脚本访问脚本的几种形式. 第一种,A GameObject 是 B GameObject 的 ...

  10. Spring Batch 读 10 万条记录,写到 MongoDB

    实践内容 从 MariaDB 一张表内读 10 万条记录,经处理后写到 MongoDB . 具体实现 1.新建 Spring Boot 应用,依赖如下: <!-- Web 应用 --> & ...