go语言sort包 go语言strconv(12)


无状态的分布式处理使用多进程很方便 , 譬如处理http请求,我们就是在nginx后面挂载了200多个django server来处理http的,但这么多个进程自然导致整体机器负载偏高 。
但即使我们使用了多个django进程来处理http请求,对于一些超大量请求,python仍然处理不过来 。所以我们使用openresty,将高频次的http请求使用lua来实现 。可这样又导致使用两种开发语言,而且一些逻辑还得写两份不同的代码 。
同步网络模型
django的网络是同步阻塞的,也就是说,如果我们需要访问外部的一个服务,在等待结果返回这段时间 , django不能处理任何其go语言sort包他的逻辑(当然,多线程的除外) 。如果访问外部服务需要很长时间,那就意味着我们的整个服务几乎在很长一段时间完全不可用 。
为了解决这个问题 , 我们只能不断的多开django进程 , 同时需要保证所有服务都能快速的处理响应,但想想这其实是一件很不靠谱的事情 。
异步网络模型
tornado的网络模型是异步的 , 这意味着它不会出现django那样因为外部服务不可用导致这个服务无法响应的问题 。话说,比起django,我可是非常喜欢tornado的,小巧简单 , 以前还写过几篇深入剖析tornado的文章了 。
虽然tornado是异步的,但是python的mysql库都不支持异步,这也就意味着如果我们在tornado里面访问数据库,我们仍然可能面临因为数据库问题造成的整个服务不可用 。
其实异步模型最大的问题在于代码逻辑的割裂 , 因为是事件触发的,所以我们都是通过callback进行相关处理,于是代码里面就经常出现干一件事情,传一个callback,然后callback里面又传callback的情况 , 这样的结果就是整个代码逻辑非常混乱 。
python没有原生的协程支持,虽然可以通过gevent,greenlet这种的上patch方式来支持协程 , 但毕竟更改了python源码 。另外,python的yield也可以进行简单的协程模拟,但毕竟不能跨堆栈 , 局限性很大,不知道3.x的版本有没有改进 。
开发运维部署
当我第一次使用python开发项目,我是没成功安装上项目需要的包的,光安装成功mysql库就弄了很久 。后来 , 是一位同事将go语言sort包他整个python目录打包给我用,我才能正常的将项目跑起来 。话说,现在有了docker , 是多么让人幸福的一件事情 。
而部署python服务的时候,我们需要在服务器上面安装一堆的包,光是这一点就让人很麻烦,虽然可以通过puppet,salt这些自动化工具解决部署问题 , 但相比而言,静态编译语言只用扔一个二进制文件,可就方便太多了 。
代码失控
python非常灵活简单,写c几十行代码才能搞定的功能,python一行代码没准就能解决 。但是太简单,反而导致很多同学无法对代码进行深层次的思考,对整个架构进行细致的考量 。来了一个需求 , 啪啪啪 , 键盘敲完开速实现,结果就是代码越来越混乱,最终导致了整个项目代码失控 。
虽然这也有我们自身的原因,譬如没好的代码review机制,没有好的项目规范 , 但个人感觉,如果一个程序员没经过良好的编码训练,用python很容易就写出烂的代码,因为太自由了 。
当然,我这里并不是说用python无法进行大型项目的开发,豆瓣 , dropbox都是很好的例子,只是在我们项目中,我们的python代码失控了 。
上面提到的都是我们在实际项目中使用python遇到的问题,虽然最终都解决了,但是让我愈发的觉得,随着项目复杂度的增大 , 流量性能压力的增大 , python并不是一个很好的选择 。

推荐阅读