Python web世界观——web架构概览(适合传统程序员)

传统web server面临的问题

我们知道传统的web server,一个进程打开socket,监听,来了请求生成新的进程(或线程、或阻塞)进行响应,本身还在继续监听。这是看过unix网络编程的大部分人所接触到的网络模型。然而,unix实在太老,网络需求在近些年发生了巨大的变化,最重要的就是对并发性的要求。

并发性的要求的提高,让本机的web server的架构也发生了变化,并且对本机这个词语也发生了不同的需求。因为server的请求可能不是一台机器处理的来的,那么又需要解决的一个问题是多个server机器的协作同步问题了。

现代web server的要求

首先是本机的变化。本机的变化有两个:并发性增加和快速开发的需求增加。我们的例子都以python作为例子。因为由于对快速开发迭代的的要求,C++等虽然性能好,但是变化速度慢,因此目前大部分网络系统后端都是用python做的,等到稳定后再切到高性能的C++或C或go后台。可惜的是互联网一直不太稳定。。。

单机提高并发性

传统的web server的模型上面说过了,如果来上百万的访问,岂不是要生成上百万个进程?(linux下线程也是进程,占用pid),并且进程管理着实耗费系统资源,这就导致了:无论硬件再怎么强大,也迟早会被并发的损耗耗尽。为了解决这个问题,应用了纤程(协程)的概念。进程本身是操作系统为用户提供的调度实体,具体的调度由操作系统完成。而协程是应用程序自己在自己的单个进程中实现的伪进程,多个协程就是多个代码的执行路径,协程的调度由应用程序自己完成(目前的一般做法是各个协程本身自己让出执行权,例如使用yield关键字)。如此就在一个操作系统的进程内模拟出了多个独立的并行的执行单位,并且协程之间的通信又特别简单(因为本来是一个进程,协程在进程看来就相当于进程内部的函数跳动和调用)。这个机制可以极大的解决单机的并发性需求。

python语言中提供了实现协程的关键字:yield。但是这不是协程的完整实现,然而pytho的好处是缺什么可以用模块实现来补充。利用yield关键字,python实现了两个比较出名的协程模块greenlet和stackless,两个的主要区别是stackless是自动的进行协程间调度,而greenlet需要各个协程手动的让出执行权利。各有优势,但是显然在精细化控制上greenlet的简单设计与python的yield关键字不谋而合,给用户提供了更高的权利(但是也需要付出更多的代码)。

又有人在greenlet之上封装实现了gevent。是基于协程的网络库。由于是基于协程的,所以这个网络库的最大特点就是高度并发。什么是网络库呢?无非就是封装了socket使用和进程线程模型。例如你可以动态的开多个进程(线程),每个都跑greenlet协程,也可以直接做个线程池。greenlet定义了协程和切换的方法,但是没有规定怎么切换,在socket下,很容易阻塞,gevent就预定了切换的情况。也就是说,在协程使用上,greenlet是方法,gevent实现了策略。

加快web开发迭代速度

上面说过,为了开发速度,产业界逐渐切换到了python,每个人都期望有朝一日能切换回去更高效的语言,但是进度表永远不给你机会,所以你会发现,目前的大型网站很多都是直接使用python在工作的。

但python语言本身确实可以提高开发速度。但是在网络应用上,python通过将网络开发标准化进一步提高开发速度。他提出的框架叫做WSGI,这是一个web框架定义标准,这个标准定义了应用端、服务端和中间件接口。大部分的对这个标准的实现都是实现的中间件,在这些实现的后面是服务端。我们所理解的web server不就是一个打开socket监听,然后处理吗?为什么要有中间件这一层呢?因为,打开socket,解析http包(https),维护和跟踪session、cookie等这些操作对所有http server来说都是通用的,python 的wsgi标准就是把这些通用的操作独立出来,定义好接口。所有的后端服务器都直接使用WSGI定义(中间件暴漏)的接口进行编程,可以让服务器编程和服务器程序本身变得非常的简单。

实现这个WSGI标准的有很多python库,例如gunicorn。作为这个标准定义的服务端也有很多python库实现:bottle、django、flask、tornado等。所以,按照WSGI的逻辑,一般一台机器都要同时启动gunicorn作为中间件,某个server(例如bottle)作为实际的后端,后端的用户程序开发都是使用bottle这些库提供的接口实现的。这是一种什么样的编程体验呢?

  1. @route(‘/helloworld/:yourwords‘, methods=[‘GET‘, ‘POST‘])                     #url接口,注意参数书写格式,前面有个冒号表示是参数
  2. def hello(yourwords):
  3. return ‘hello world. ‘ + yourwords

短短几行代码,就定义了如果是什么样的url就执行什么样的逻辑代码并返回(不全)。比起传统的网络后端cgi编程,是不是觉得非常清爽?完全干净的只处理业务。这就是WSGI标准带给我们的。

这里的gunicorn可以独立的启动,但是并行性不好,所以就可以用上了我们上面说的gevent高度并行的网络库。对于这两个来说gevent是方法,gunicorn又是策略了。我们可以看到,通过这一层层的封装和调用,让各个组件可以在不同场景下选择不同的实现方式,从而达到不同的目的。这种类似搭积木的灵活性,是传统web开发所没有的。

跨机器的并发:云后台

在一台机器上增加并发,提供和实现标准,虽然显著提高了单机的作战能力,但对于现代的网络要求还是不够。这就需要多台机器一起对外提供服务。使用多台机器就有了传统的云需求:什么样的请求在什么时候选择哪台PC来提供服务?这里面就有了负载均衡、网络代理、可用性、一致性等实现要求。

现有很多软件同时能满足多种服务,例如nginx可以在网络代理也可以做负载均衡。而做负载均衡还有F5、LVS等专用的软件或硬件。keepalive软件等负责可用性、例如raid等很多方案又可以提供一致性。这些在逻辑上是分离的,但是在实现上很可能有兼容并包的软件。目前流行的软件,在某一刻可能就过时了。但是这个需求是不会变的。这也就构成了现代的web服务器的后端像防火墙一样的标配了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 10-16

Python web世界观——web架构概览(适合传统程序员)的相关文章

百度开放云首席架构师徐串:架构师必须理解程序员的痛

在2016中国云计算技术大会(CCTC 2016,专题报道)上,百度开放云首席架构师徐串发表了题为<企业IT基础架构在云端如何变革>的主题演讲,并接受CSDN记者专访,深入分享了他对架构及设计的认识,对架构师工作和技能的理解,以及百度开放云架构满足大数据和人工智能等不同应用需求的实践经验. 徐串表示,云计算环境下的架构,除了高吞吐.可扩展性.稳定性的需求,灵活性的实现也很重要.架构师的工作就是在各种矛盾之间坚持或妥协,如高吞吐和低延迟的矛盾,优雅架构和紧迫需求的矛盾.保证业务的需求,是设计架构

你适合做程序员吗

不是每个人都适合做程序员. 从小学到高中,我们接受的都是应试教育,而缺对少养学生的兴趣进行培养.当我们要进入大学选择专业的时候 我们茫然了,大部分同学都不知道自己喜欢什么专业,也不知道这个专业以后是做什么的!这样就会导致很多同学只 能按照自己父母的意志选择专业或者看目前社会上热门专业来选择,根本没有根据爱好.兴趣考虑过自己是否喜欢这 个专业,随大流的选择.没有上大学之前,高中老师都会说好好学习到了大学你们就解放了!果不其然,到了大学同学们压抑已久的荷尔蒙都得到了释放,各种玩可以说整个大学在一个"

什么样的人不适合当程序员

软件蚕食一切.未来属于程序员.在郴州找工作的求职者有很多都想找程序员的工作呢.人人都想当程序员.但是并不是每个人都能当好程序员.在你做出决定前还是先看看自己能不能当好程序员吧.可是什么样的人不适合当程序员呢?不要喝鸡汤,我们看看Quora上面是如何回答的. 其实最重要的是态度: 我认为编程要想成功最重要的是态度.当然,最低水平的智力还是要的.以我这么久的经验来看,还没见过蠢到不会做的. 但是好坏程序员之间的差别几乎永远是态度. 耐心:对我来说这是最重要的一条.写代码和调试极其令人沮丧.要想做好,

腾讯首席架构师:Java程序员四个阶段成长路线,少走弯路

有这么一位Java大牛 他是前 Oracle 首席工程师,负责过北京Java核心类库.国际化.分发服务等技术团队的组建.大家都知道,Java 就是 Oracle 公司的,他对Java的理解会与众不同.他把Java程序员的成长路线划分为新手.高级新手.胜任者.精通者和专家,让大家少走弯路.创一个小群,供大家学习交流聊天如果有对学JAVA方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学JAVA能够持之以恒JAVA爱好群,如果你想要学好JAVA最好加入一个组织

计算机专业从事web前端是否有前景,老程序员谈市场

首先,前端开发领域的就业情况还是相对不错的,但是随着移动互联网和大数据的发展,前端开发领域也在产生着较大的变化,具体体现在以下几个方面: 第一:前端开发的边界在不断拓展.早期的前端开发以Web前端为主,知识结构集中在Html.CSS和JavaScript等几个领域(包括一些框架的使用),随着移动互联网.大数据的发展,目前前端开发逐渐拓展到了移动端,包括Android开发和iOS系统开发领域,另外还涉及到大型互联网平台推出的各种小程序开发.这些变化促使前端开发人员要想保持自身的岗位竞争力,就要不断

一名资深架构师规划Java程序员五年职业生涯指南

每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来.今天我给大家分享的是一篇来自阿里大牛对五年工作经验程序员的职业建议,希望对你们有启发. 第一阶段: Java程序员 Java初级程序员 第一阶段我认为对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本上的内容迈向真正的企业级开发. 第二阶段: Java中级程序员 企业标准程序员 第二阶段—又是

JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编程作为自己职业生涯的起点.如何学好编程?如何成为优秀的程序员?如何规划好程序员这个职业?是许多年轻人关注的问题.在Infoworld最近做的一次调查中,邀请到了JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Spring Framework创建者Rod

十二星座哪个更适合做程序员?

原文链接 程序猿是一种常年处在被黑-自黑状态中的生物,他们的大部分时候都贡献给了他们热爱的代码事业,虽然大家都是程序员,但即使是同一种语言,每个程序员各自写起代码来还是有很多的不一样的,这或许和他们的星座和性格有很大的关系~ 处女座向来是被大家黑的比较惨的星座,但是如果是写代码,"完(jiao)美(zhen)"的处女座却变成了无数大公司欢迎的CTO种子级别选手!真是十年被黑一朝翻身! 说到白羊座,怎么可能看到一整段白羊座程序员写的完整代码!他们的电脑里大概存了三万多个文档,都是极其美妙

女生到底适不适合做程序员?!

世界上第一个程序员是女性作为一个STM32的菜鸟级人物,我刚开始接触STM32时,其实和当年开始学习51单片机的心理是一样的.茫然,谁说不是呢?但是,正常的学习途径无非就是看书,然后敲代码,最后烧程序,有问题就check,然后再继续烧,我都怀疑我快成了火头工.因为在我的印象中,只有这类职业才和"烧"有着密不可分的联系.即使当一名敬业***的火头工是我毕生的梦想.OK,不侃了.我希望,通过写日志把我作为一个菜鸟在学习STM32中的问题记录下来,同时以我为鉴,规避那些没有必要的破事. 学习