文章目录

  • 服务器设计目的
  • C/S结构
  • 一个典型的服务器架构
  • 服务器四大性能杀手

服务器设计目的


高性能:能够处理大量请求同时到来,及时的给予响应;
高可用:服务器7×24小时不间断运行,即使主机故障,也有备用主机可以使用;
伸缩性:服务器可以进行扩展,良好的分层设计,业务分离,并且可以灵活部署;


C/S结构


任何服务器模型都可以抽象C/S结构,一个充当客户段,一个充当服务端,客户端请求服务器资源;
而服务器和服务器之间通信可以看成C/S结构,因为一个请求的服务器,可以抽象为是客户端,而响应的服务器可以认为是服务端;


并且我们常见的B/S模型,也就是浏览器和服务器模型,本质也是C/S结构,只不过是浏览器充当客户端,服务器充当服务端,浏览器一般都是HTTP请求,而服务器就是HTTP服务器;


一个典型的服务器架构


在Linux中,使用高性能的epoll来充当网络I/0模型;
通常来说,服务器性能瓶颈都会发生在数据库中
当大量请求服务器时候,假设这些请求都要访问数据库,而数据库的并发量又不高,如何能够及时的响应数据给客户端呢?
解决办法:1.搞一个队列+连接池


解决办法:搞一个队列,接受未处理的请求到来,使其排队,并且为了减少链接数据库的时间,可以提前创建好一批链接数据库的链接,也就是所谓的连接池,让请求一但到来就可以直接访问数据库,而不用再链接数据库了;
根据服务器的设计原则:伸缩性可知,我们的DAL(数据库访问层)可以部署在任何地方,可以和我们的服务器部署在同一台机器,也可以作为单独机器使用;


数据库还有一个请求超出响应事件的问题:最简单的是假如我的服务器处理请求响应时间为5秒,处理1000个请求1秒,而你请求连接到来有10000个在请求队列排队,也就是说,按理论处理也要花10秒,而我们系统时间只有5秒,并发能力也就是5000,并没有达到10000个连接到来都能够及时处理;
如何减少我们数据库的压力呢?

解决办法 1将请求的数据主业务逻辑在服务器中进行处理;而我们数据库做的只是简单的辅助业务逻辑处理,因为服务器的计算能力是比数据库计算能力好的,所以这种方式是可行;但是这也仅仅很有限的出来罢了;
解决办法 2:增加一个新的缓存层,把从用户读取的数据,作为响应返回给客户端同时也缓存一部分到我们的缓存层中;那么下次客户端请求时候,不用去访问数据库,而直接访问缓存层的数据即可;但是也会导致一个问题,缓存同步和更新的问题,到底在什么时候?
一种办法就是,给缓存设置一个超时时间,但是这种方式实时性不高;
另一种办法就是,一但我们改写数据,直接访问数据库的数据,对其进行更新,然后在缓存更新后的数据到数据库,这种方式实时性比较高;
**假如我们的缓存内存不足如何解决?**使用缓存换页技术,将不活跃的数据换出到磁盘即可;如常见的LRU算法;


一般来说,缓存层,不需要自己实现,使用我们的NoSQL,非关系数据库,如Redis来帮助我们完成;当然服务器的伸缩性告诉我们,该缓冲层是可以灵活部署在任何主机上的;


即使上面使用那么多方式来对我们的数据库进行优化,但是还存在不足;
假如有海量的请求连接都来访问数据库,那么此时数据库依旧会出现性能瓶颈;
对于写操作来说,每次写的请求都要进行上锁,而导致后续读的请求无法被处理,只能阻塞;
所以基于以上原因:我们提供的方式就是读写分离数据库;分析我们的数据库访问请求是读的多还是写的多;设置只用于读的数据库,和只用于写的数据库当我们有访问数据库的请求连接到来,给我们的连接池进行负载均衡式的选择哪台数据库进行操作;
一但有写的请求发生,在写的数据库进行修改后也要同步的更新到读的数据库操作;
***
自此,数据库的并发能力大大的提升并且解决;


现在我们要解决的问题是:如何增加服务器的并发能力;

  1. 很明显我们的服务器很灵活,可以部署多台服务器,以增加及其来增加并发能力;
  2. 于此同时,每台服务仅仅处理某一个或者几个APP的业务逻辑,这样也可能增加并发能力;
  3. 再着我们可以搞一个任务服务器,可以负载均衡式选择我们的业务逻辑服务器进行处理,并检测我们业务逻辑的负载情况,他们直接通信可以采用简单的HTTP进行通信即可;
  4. 与此同时,业务逻辑的服务器,也可以主动的向任务服务器发起请求获取任务,当业务逻辑服务器空闲就主动发起请求获取,但是这也有确定,增加了任务服务器的实现难度;
  5. 任务服务器也需要有故障转移的,也就是说即使奔溃了,也可以转移到其他任务服务器继续提供服务;

服务器四大性能杀手

  1. 数据拷贝–内核拷贝数据到用户,用户拷贝到内核–>解决办法,增加缓存机制;
  2. 环境切换–上下文切换,导致开销,是否使用多线程还是单线程做服务器处理请求;单核CPU–>不应该使用多线程,最好使用状态机编程,一个线程执行一定的时间,即使没处理完,就标记为另一个状态,使得其他进程可以执行;类似内核的进程切换,每个进程都有一定的时间片,这个方式处理的思想;对于多核心CPU,使用多线程可以最大程度的发挥性能,提升效率,但是线程切换也是问题,所以创建线程数量应该根据场景设定;
  3. 内存分配—>减少平凡的像OS申请内存,可以搞内存池的方式;
  4. 锁竞争–>减少锁的使用;

【大并发服务器开发】简要谈谈分布式服务器的设计方案思路推变过程相关推荐

  1. 小程序资源服务器,开发小程序没有服务器资源

    开发小程序没有服务器资源 内容精选 换一换 在性能优化时,需要遵循一定的原则,主要有以下几个方面:对性能进行分析时,要多方面分析系统的资源瓶颈所在,如CPU利用率达到100%时,也可能是内存容量限制, ...

  2. leaf游戏服务器开发系列,Leaf游戏服务器简析(一)之模块生命周期

    Module(模块)的生命周期 使用leaf开发游戏服务器由多个模块组成,模块的定义如下: // leaf/module.go type Module interface{ OnInit() OnDe ...

  3. 【八】http服务器开发--实现一个http服务器

    文章目录 一.整体概述 二.接收http请求 三.响应http请求 四.完整代码即效果 4.1 完整代码: 4.2 实现过程 附(stat函数) 一.整体概述 本节主要实现一个http服务器的示例:该 ...

  4. 服务器开发27:log4c充当服务器跨平台日志库(cmake跨平台编译,配置介绍及代码封装)

    文章目录 一.跨平台编译 1)编译准备 (1)expat编译 2)原生linux编译.安装 3)cmake跨平台编译 二.log4c配置笔记 1)与log4cpp\log4cxx的比较 2)log4c ...

  5. Linux/c++服务器开发方向的重点

    作者:NULL 链接:https://www.zhihu.com/question/37247264/answer/2352680534 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  6. 应届生怎么走Linux下C++后台服务器开发路线,工作3-5年的知识体系

    1. 前言 给最近正在准备秋招的同学或者是想转行,目标岗位是C++后端开发工程师,这个岗位对开发者的要求也比较高,需要的基础知识非常多,刚刚开始准备的时候,感觉也是不知从何入手,现在经过了一段时间的学 ...

  7. 用java搭建一个分布式服务器(一)

    本专栏主要介绍如何用java实现一个小型分布式(单机多进程模式)服务器,希望能给刚开始学分布式的朋友一些帮助.讲得不对的地方欢迎在评论区指出. 用到的主要技术栈: netty 网络传输框架 sprin ...

  8. 如何实现高容量大并发数据库服务 | 数据库分布式架构设计

    袋鼠学院和优云.阿里云联合举办的沙龙结束之后,总是有小伙伴们来问PPT内容,想要进一步了解Topic内容.(哦,对了对了,竟然还有小伙伴专门冲着袋鼠云去听沙龙,感动cry~~) 千呼万唤,忙成狗的袋鼠 ...

  9. HTTP服务器开发教程

    <![CDATA[ 概述 最近因为项目需要,必须自己实现一个HTTP服务器的部分功能. 需求大概是这样的,winform里使用webrowser控件显示一个本地的html页面,同时winform ...

最新文章

  1. LaneATT调试笔记
  2. 软件著作权登记证书申请攻略
  3. LeetCode-35. Search Insert Position
  4. Python语言学习之字符串那些事:python和字符串的使用方法之详细攻略
  5. ATG中的定时Job处理
  6. sql server 修改IDENTITY 字段 的统计当前值
  7. LeetCode 434. Number of Segments in a String
  8. SLAM 论文阅读和分类整理
  9. Oracle里面的用户user无法登录 LOCKED(TIMED)
  10. dmv io读写高的sql_使用内置的动态管理视图(DMV)发现更多SQL Server信息
  11. ArcGIS加载Excel数据连接到数据库失败的解决办法
  12. Freescale mx27 DDR 初始化代码分析
  13. java汉字转拼音区别多音字_Java中汉字转拼音pinyin4j用法实例分析
  14. java freepascal_Free Pascal
  15. bootcamp opencore_黑苹果(Hackintosh)BootCamp 使用教程
  16. Excel表格的时间设置
  17. esxi - with nvidia geforce 10 titan xp card
  18. 使用vue简单实现音乐播放器
  19. Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)
  20. linux aufs,Linux文件系统之aufs

热门文章

  1. 组件-Element---Input(输入框)
  2. You have divergent branches and need to specify how to reconcile the
  3. EPICS caputRecorder模块
  4. 【Golang】IrIs框架 Hosts
  5. Linux的使用以及常用的命令
  6. python爬虫爬取小姐姐图片(5762张)
  7. MATLAB转C语言的步骤与解决方案
  8. 同城跑腿小程序开源版开发
  9. 公司文档数据如何才能做到防泄密
  10. 西门子200smart型PLC通过485modbus通讯控制台达VDF—M型变频器程序