主程的晋升攻略(7):服务器模型谈

在上一篇《主程的晋升攻略(6):CGI和FastCGI》中,讲到Web服务器和CGI/FastCGI能动态输出内容,从而提供更强大的业务处理能力。Web服务器这种架构,我称之为Web模式,与之相对的是Svr模式。Web模式和Svr模式是互联网项目的后台最常见的两种模式。先介绍几个概念。

同步通讯 vs 异步通讯

同步通讯是指在一个连接中,一个请求的应答没回来前,不能发送下一个请求,整个通讯过程是请求1-应答1-请求2-应答2……这种。异步通讯与同步通讯相反,在一个连接中,可以随意发送请求,而且收到应答的顺序可能与发送请求的顺序不一致。

从描述上就能理解,同步通讯的通讯性能比异步低,但好处是简单,不用考虑乱序应答的复杂情况。

同步逻辑 vs 异步逻辑

同步逻辑是指在代码中遇到需要等待的调用时(例如向数据库查询数据),阻塞着,一直等待调用完成。异步逻辑则是不阻塞,继续执行后续代码。

我们常见的文件IO接口read/write,网络IO接口send/recv默认都是同步的,需要执行特别的设置API才能变成非阻塞的。同步逻辑符合人脑的思维模式,写异步逻辑需要处理各种非阻塞和异常情况,极其挑战智力,就算采用有限状态机,也是件很具挑战的工作。

无状态 vs 有状态

CGI/FastCGI每次执行时,会从数据层(db或数据cache)获得数据,修改后再写回到数据层,也就是说CGI/FastCGI并不会缓存数据。这就是无状态。

无状态的架构中,请求是这台Web服务器处理,还是那台处理,都没有区别,因为数据都是从别处获得的。这种架构的扩容非常方便,但需注意,要防范一个请求同时多并发时,可能出现的数据不一致的漏洞,即要做防并发处理。后续会就防并发单独写个文章来展开说。

有状态是与无状态相对的概念,是指服务器中缓存了数据。这种架构中,因为不需要反复的从数据层取数据,性能会高很多,但因为服务器缓存了数据,为了保持数据一致性,只能把该数据的请求都分发到这台服务器来处理。对于游戏来说,每个区的用户数据是独立的,对交互的实时性要求高,采用有状态的架构正好合适。

Web模式 vs Svr模式

最早的网页游戏大多是用html+js做的客户端,如果要实现聊天功能,需要浏览器定时请求服务器获取聊天信息。Web服务器无法主动给客户端推送消息,我总结了下,Web模式的后台有这么些特点:

1、通讯是请求-应答式,即先客户端请求,才会有服务器应答,服务器无法主动推送消息到客户端;

2、是同步通讯,一个连接里,只有收到应答后才能发下一个请求;

3、是同步逻辑,Web模式很少很少采用异步逻辑;

4、是无状态架构,CGI/FastCGI每次从数据层获取数据,修改后再写回到数据层。

Svr模式就是与之相对的,客户端和服务器之间采用长连接,客户端的请求不一定会有应答,服务器还可以主动推送消息到客户端,通讯也不限定是同步的,客户端可以不断的发送请求,服务器的应答甚至可能与请求的顺序不一致。

Svr模式相对Web模式来说,通讯性能更强,因为采用了长连接和异步通讯,还能主动推送消息,这是优势。但也因为采用了长连接和异步通讯,对客户端开发的要求就更高些,需要处理好断线重连和支持响应乱序。

Web模式因为模式简单,Web服务器自己实现了HTTP协议处理和FastCGI进程管理等通用操作,FastCGI这些外部程序只需要处理业务逻辑就行,降低了很多门槛。而且因为是无状态的,扩容非常方便,直接加进程、加机器就能搞定,这个平滑扩容的优势在Web时代的作用非常大——搞性能优化、架构优化的时间成本比较大,而且不可控,如果能加硬件就能快速抗住,那么就是个优秀的架构。

-------- 分割线 ---------

主程的晋升攻略(2):技术篇概要

主程的晋升攻略(3):IP、DNS和CDN

主程的晋升攻略(4):TCP、消息分包和协议设计

主程的晋升攻略(5):HTTP协议和二进制协议的对比

主程的晋升攻略(6):CGI和FastCGI

推荐wecode程序员云笔记──为程序员而生的开源、简洁高效的云笔记软件,使用有道云做云端存储。

★ 【语法高亮】目前支持 C/C++、C#、Pascal、Java、VB.Net、XML、HTML、Python、SQL等多种方。

★ 【云端存储】除了本地笔记本外,还增加了云存储功能,目前使用有道云笔记做为云存储。

★ 【文档加密】提供了文档加密功能,确保敏感文档的安全性。

★ 【多个本地笔记本】支持多个本地笔记本,你能够新建本地笔记本、打开、压缩和备份本地笔记本。

★ 【文章附件】能够为每个文章添加多个附件,并能够在临时目录中打开附件、导出附件。有道云的附件也存储在云端。

时间: 2024-11-29 09:34:23

主程的晋升攻略(7):服务器模型谈的相关文章

主程的晋升攻略(8):数据层的演进(上)

我们用一个做手游的故事来聊聊数据层不断优化提升的演进过程. 10:简单设计 有一天,老板突然说做个山寨版的糖果传奇手游,你接到任务后,分析出游戏的交互频率不大,都是点查询,用mysql能简单搞定.对游戏来说,你非常少有机会用orcale这样的上流货.mysql是物美价廉的选择.建个表,设好主键和索引.你轻松搞定数据库设计,满意的泡了杯茶边喝边写程序. 这里说的"点查询",是指基于指定主键的查询,比如查询指定用户的信息,由于是基于指定主键.查询结果有限且较少.点查询的效率很高. 还有一种

主程的晋升攻略(9):数据层的演进(下)

缓存为什么能提高性能? 为什么memcached的性能比mysql高? 首要因素是memcached的数据都是位于内存中,mysql的数据可能是位于磁盘里.从IO速度来说,内存IO比磁盘IO会快几个数量级,memcached也就比mysql性能更高.架构和性能优化做到后面,会发现最终限制性能的是硬件瓶颈.例如nginx做静态webserver时,出口流量往往能达到网卡的最大值或出口带宽的最大值.mysql是个性能还不错的db,但它的数据持久化在磁盘上,自然就受限于磁盘IO速度. mysql也是有

Python面试攻略(嗨谈篇)

选出了其中出现频率最高的十个题目,附上答案供各位小伙伴参考! 1.*args和**kwargs是什么意思? 答:*args表示可变参数(variadic arguments),它允许你传入0个或任意个无名参数,这些参数在函数调用时自动组装为一个tuple: **kwargs表示关键字参数(keyword arguments),它允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict.同时使用*args和**kwargs的时候,必须保证*args在**kwargs之前

【携程攻略】千岛湖骑行-其他

[携程攻略]千岛湖骑行-其他 ? 千岛湖绿道骑行,千岛湖沿湖建有骑行车道,可以边骑行边欣赏千岛湖美景.骑行俱乐部20元一小时.千岛湖镇上就近安排车辆.咨询电话13777367764.微信号:yujian20060222

深度学习在携程攻略社区的应用

编者:本文来自携程攻略社区开发总监李健在携程技术中心主办的深度学习Meetup中的主题演讲,介绍了深度学习在攻略社区领域的主要应用.关注携程技术微信公号ctriptech,可获知更多技术分享信息. 携程攻略社区是携程旗下的旅游攻略类社区,致力于为旅行者提供出行指南和资讯服务.依托携程2.5亿用户总量,社区日活跃用户超过500万,并汇集3000万条真实用户的旅行和酒店点评,并有40万篇旅行游记,2000位知名旅行达人.面对数据库中浩如烟海的信息,我们如何能去其糟粕,留其精华? 攻略社区的主要需求

Windows Socket五种I/O模型——代码全攻略(转)

Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操作时,Winsock函数会返回并交出控制权.这种模式使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回 WSAEWOULDBLOCK错误.但功能强大.为了解决这个问题,提出了进行I/O操作的一些I/O模型,下面介绍最常见的三种: Windows Socket五种I/O模型——代码全攻

【黄山-宏村攻略】

眼看着就要大四各自出去实习了,之后一宿舍聚在一起的机会就少之又少了,然后就趁着五一,拼一下假期,五天游玩 黄山 ,自己做的攻略发出来跟网友分享下. 因为还是在校学生,所以奔着  安全第一,节省第二,欢乐第三的原则.                                                                                                   103宿舍五一出行黄山攻略 福州北站2016.4.27下午16.14出发历史2.5小时抵

redis大型攻略!

redis大型攻略 一:redis的简介.下载和安装 二:redis主从 三:redis在线升级 四:redis多实例 五:redis常见的操作 六:reids配置详解 实验环境:CentOS-6.5-x86_64   redis-2.8.9.tar.gz 一:redis的简介.下载和安装 Redis是一个key-valu存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集

程序员神级跳槽攻略:什么时候该跳?做什么准备?到哪里找工作?

1.引言 每年的3.4月份都是求职高峰时期,目前已进入6.7月份了,你已经成功换工作了吗? 这次我们想聊的,就是程序员跳槽这件事儿,我打算从三个方面来说: 1)程序员什么时候该跳槽? 2)跳槽前你需要做的准备工作? 3)到哪里找跳槽机会? 学习交流: - 即时通讯开发交流3群:185926912[推荐] - 移动端IM开发入门文章:<新手入门一篇就够:从零开发移动端IM> (本文同步发布于:http://www.52im.net/thread-1755-1-1.html) 2.本文作者 安晓辉