服务器开发架构模式

看到一篇很好的服务器架构总结,原文地址:http://hi.baidu.com/ah__fu/item/3f1ade2ed15eaad00e37f996

另还有一篇Nginx解决“惊群”方法的解读:http://blog.csdn.net/russell_tao/article/details/7204260

————以下正文————

1.读写分离模式

如果是DB,可以从slave读,写到master上。两台数据库可以针对读写的不同需求而进行优化,性能加倍。缺点是,数据同步可能有延迟。

对于进程:比如业务需求是从cache读写数据,则可以分为读写进程。

1.1 .职责的分离,读进程和写进程各自的业务逻辑变得很简单,足够小足够清晰,性能高,不容易出BUG。缺点是可能代码量比合在一起高一些;

1.2 针对读写的业务特点和请求量,可做不同的部署量,读多写少,或者写多读少。对于本身无状态的服务,还可以部署到多个机器上,扩展性更好。

2. 异步写与写合并模式

对于写量较大的服务器,如果每次IO都落到磁盘上,则IOPS只有400-500的机械式磁盘根本无法满足需求。

这时就可以考虑写合并模式:把要写的数据先写在内存中组织起来,写到一定量后再一次性写到磁盘。业务线程如果要处理一次性写入的工作,可能会带来服务抖动,某个时间段内的响应延迟会增加,这就需要异步写。利用操作系统提供的API,或者另起线程(进程)来完成写入。

写合并可能会因为掉电丢失数据,可以在写入的同时写入流水日志,掉电重启后立即从流水日志中恢复数据。

3. 消息总线模式

假设系统中有多个子系统,某信息写入A系统后,同时也要同步给B系统,简单的做法是A系统中调用B系统的接口。随着业务的增加,又有C系统,D系统都需要A系统的消息。开发A系统的程序员就会觉得很坑爹,有完没完啊?

于是,系统中引入消息总线。当A系统写入信息后,朝消息总线中写入一个消息。其余的子系统挂接到消息总线上,异步收取消息。

这样,利用消息总线,原本耦合的系统就被解耦开了。

缺点就是,可能存在消息丢失的可能。

4. 通知loader模式

假设业务逻辑是这样的,用户读请求的时候,先从cache取,取不到再从DB取,再更新CACHE,再返回数据给用户。

假设CACHE的命中率很低,或者CACHE服务器挂掉一部分。这个时候就会对DB产生大量的读,从而产生雪崩。

通知loader模式来解决这个问题:当用户请求的内容不在CACH中的时候,读进程发出一个CACHE不命中的消息给消息总线。然后向用户返回稍后再试的消息。

另启动一个loader进程,从消息总线读取通知消息,收到消息后从DB读取数据,更新到CACHE。同时,loader这层是有最大访问量的限制的,避免DB发生雪崩。

这个模式的缺点是:以牺牲用户的可用性为代价。

5. 两阶段提交模式

两阶段提交的概念可以看这里:http://blog.csdn.net/junli0310/article/details/1781736

作为穷矮搓的屌丝一枚,用不起牛叉的数据库,就自己用两阶段提交解决分布式事物的问题吧。

6. SOA模式

这里的描述和模式1有些类似。

在此我并不按经典的SOA的理论来说明:在后台服务中,如果在一个服务进程中处理所有的业务逻辑,则这是非常不明智的。业务的扩展会带来新的BUG,服务进程不稳定,则会影响到所有的服务。

因此,保障每个服务尽量的小且功能单一。这样:每个服务都会非常的清晰并易于维护,精简的代码也会搞来高效率和低BUG率。然后通过额外的胶合层来整个多个服务的数据。一个完整的服务,是由一大堆功能单一的小服务集成起来的。

在业务告诉增长的情况下,SOA能把业务整合的痛苦降到最低。

7. 多读/多写模式

这个思想源自于Amazon的Dynamo:写的时候,写多份到不同的服务器上,读的时候,读出多份,取版本最新的一份。

通过冗余写和冗余读来达到高可用性、分区扩展性和最终一致性,牛叉啊!

不过,成本很高。(我也一直怀疑,当业务量增长到某个阶段,内网流量会成为系统的瓶颈)

8.agent模式

假设系统使用fastcgi作为对外的HTTP服务框架,然后机器上会启动上千个fastcgi进程来进行服务,碰巧会有很多台fastcgi的机器,碰巧每个fastcgi进程会连接后端的某个服务器……那么,这个后端的服务器会被大量的TCP连接连上去,光处理连接就够呛了,别说处理业务了。

OK,如何解决连接过多的问题呢?agent模式是酱紫解决的:在fastcgi的机器上开辟一块(或者两块)共享内存,每个fastcgi进程挂载共享内存,把请求的信息写入共享内存。在fastcgi的机器上启动一个agent进程,agent进程从共享内存读取请求,然后agent与后端服务器建立长连接,把请求发给后端,收到响应后把结果写入共享内存。最后,fastcgi进程从共享内存中取出结果。

9.请求队列模式

假设有两台服务器提供某类服务,前端做了容灾处理,某个服务器停止后,会把请求发给另一个服务器。可是,假设每个服务器都处于满负载状态,某个服务器崩溃后,另一个服务器的请求量会猛涨一倍,它会受不了,结果也崩溃……

为了避免这种情况,就需要服务器自身有自我保护机制,请求量过大的时候,不至于崩溃。

具体的做法是内部设定一个请求队列,每收到一个请求,把当前的时间和请求内容塞到队列中;然后工作线程从请求队列获取请求进行处理。

这个模型会有两种情况:

a. 请求来得太多,工作线程处理得太慢,导致请求队列被塞满了。这个时候,丢弃塞不进队列的请求。

b. 工作线程处理得太慢,导致任务在队列中等了很久才被处理到,而处理的时候前端请求已经超时。于是恶性循环,所有的请求都超时。这个时候,工作线程取出请求时,把当前时间和存入队列的时间进行比较,发现已经超过一定时间,直接丢弃请求,处理更新的。(工作线程说:抱歉,我只吃最新鲜的!)

时间: 2024-08-03 10:06:54

服务器开发架构模式的相关文章

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验. 1.说一说Servlet生命周期(非常重要) Servlet生命周期包括三部分: 初始化:Web容器加载servlet,调用init()方法 只执行一次 处理请求:当请求到达时,运行其service()方法.service()自动调用与请求相对应的doXXX

CRM项目开发流程:采用《三层架构模式》

采用<三层架构模式> 1.根据顾客的需求设计数据表格,明确表之间的关联,建好约束 2.实体Bean的设计(一个表对应一个实体) 3.业务层设计(一个实体类一个业务接口,一次提交一个业务方法) 4.持久层设计(一个实体类一个持久接口,一次数据操作一个持久方法) 一.数据库表的建立: 建表时要注意表与表之间的联系,明确哪些是主键,哪些是外键,建立好约束. 要求数据添加合理,添加记录数量也要适当的多点,不然直接会影响后期持久层和业务层方法的调试,从而影响整个项目的开发. 表的列名要求命名规范,便于理

软件开发架构分析和架构模式一

架构分析: 架构分析工作主要从宏观上考虑一个软件系统应该如何组织.通常,在架构分析工作中,我们需要确定一些策略性的设计方针,原则和基本模式.在它们的指导下,我们可以高屋建瓴地分析软件系统的宏观结构,认识软件系统由哪些组件构成,了解组件之间的接口和协作关系.架构分析的结果对于后续的面向对象设计工作也是一种约束,有助于消除设计和实现过程中的随意性.因此,架构分析有时也被称为策略设计 组件指的是一组对象构成的,有固定接口的有机体,当设计者的观察视角不同,组件的规模不同或者组件内部的封装度程度不同时,这

区块链应用开发技术架构模式介绍

区块链应用开发技术架构模式介绍区块链应用场景多样,从数字货币金融到去中心化互联网.大多数用例都可以归纳为几种模式.源中瑞ruiecjo给大家讲解基于区块链的去中心化应用的常见的4种架构模式.1.IAM的架构模式背景信息: IAM环境包括许多用户和服务提供商.IAM系统为每个用户提供一个帐户和一组功能,使用户可以前往服务提供商,展示其帐户所有权,然后根据其功能接收服务.力量:需要实现一个分散的IAM环境,在该环境中,一个恶意用户或几个用户不会对系统造成重大影响.解决方案:建议的模式候选者以以下方式

手游服务器开发技术详解

从事游戏服务器开发差不多两年时间,两年间参与了不少项目,学到了很多游戏服务器开发技术,参与过几个不同架构的服务器开发,就随便聊聊游戏服务器开发需要的技术.(以下所指游戏服务器更偏向于手游,因为我对端游和页游开发接触并不多) 一.聊聊服务器开发有哪些东西要考虑. 1.开发语言的选择: 工欲善其事,必先利其器,选择一门适合的开发语法对后期开发有着事半功倍的作用. 业界主要的是c/c++ + Python/lua模式做游戏服务器.c/c++做网络通讯数据传输,python/lua做业务逻辑.这样既保持

分层与架构模式

1 企业应用计算的演变 这个我们应该是在学HTML的时候就已经学习了一部分了,现在再来回忆一些理论知识! •主机/哑终端的集中计算模式 大型主机管理和控制应用程序的所有方面,包括业务处理.数据管理和屏幕显示.使用者一般通过只有一个屏幕.一个键盘和一根主机连接线的“哑终端”与主机的应用程序进行交互. 缺点: 一台计算机中进行全部的处理. 应用程序非常难于维护. 专用特性使得它们非常难于集成其他平台上的其他应用程序 •客户机/服务器计算模式 –分布式客户/服务器 (Client/Server,简称C

《大型网站技术架构》读书笔记二:大型网站架构模式

一.分层 最常见的架构模式,将系统在横向维度上切分成几个部分,每个部分单一职责.网站一般分为三个层次:应用层.服务层和数据层,其具体结构如下图所示: 通过分层,一个庞大系统切分成不同部分,便于分工合作和维护. 但是,分层架构也有一些挑战:①必须合理规划层次边界和接口:②禁止跨层次的调用及逆向调用. 二.分割 分割是在纵向方面对软件进行切分->将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,有助于软件开发和维护,还便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力. 三.分布

网站架构模式

为了使网站在高访问量.处理海量数据时可以稳定并以高效率运行,需要对网站架构进行系统的设计,从而实现网站高性能.易伸缩.可扩展.安全等各种技术目标.网站的架构模式是大型网站在小型网站演变时期总结的一些对于相同问题的解决办法.称之为架构模式. 下方主要是概念性的理解,具体操作在对各技术详细解释文档中. (总共9点) 1.软件结构分层 概念:将系统在横向维度上切分为几个部分,每个部分负责一部分相对单一的职责,然后通过上层对下层的调用构成一个完整的系统. 具体: 1.应用层:负责具体业务和视图展示,如:

mvp架构模式

今天是国庆节,祝大家节日快乐,愿祖国越发繁荣昌盛.假期程序员也不能偷懒,更新一些博文吧. 看到封面图片喜欢NBA的人可能很容易就想到了最有价值球员.但是此mvp非彼MVP,此mvp指的是现在Android开发中比较常见的一种软件架构模式.mvp架构模式是Google官方推荐的架构模式,特别是近年来的新项目,mvp+retrofit+rxjava+dragger2配合使用已经在引领程序界的潮流了,在github上可以轻易的搜到一大堆这样的开源项目.前端时间笔者也在公司的一个sdk上进行了尝试,在此