Skip to content
yuyuyu101 edited this page Apr 8, 2013 · 7 revisions

Wheatserver来自于构造一个开源的uWSGI轻量级的项目,但随着项目发展,可插拔式的工程构建使得发展为通用应用服务器,分离的模块使得极易构造出适合的应用环境。通过Wheatserver,我们构建出了一个极快的WSGI应用服务器和Redis集群管理应用,我们发现Wheatserver能极大的提高高性能服务器端软件的构建。

项目部署简介:http://yuyuyu101.github.com/wheatserver/

开发者文档:Wheatserver设计思想及开发文档

设计目标

  1. 具备一定强度的并发请求处理能力
  2. 具有多种工作模式,同步、异步或者多线程,协程,并且可以扩展
  3. 应用层协议和应用可以模块式开发,框架最少接口化和接口最少疑惑
  4. 具备强有力的内部反馈和自省能力,方便系统管理
  5. 最少的依赖和选项最少化
  6. 增强系统的自身调控,减少高级配置项
  7. 保持简洁

逻辑概览

wheatserver

可开发模块分为三种,工作者模块、应用层协议模块和应用模块。

工作者模块需要处理的事项是提供IO接口,另外需要支持的是收集各处的统计信息。

协议模块需要提供初始化和析构接口,提供协议发现(spot)接口来指定后端的应用,并且具有协议解析接口。

应用模块只需收到协议层提供的信息并且自身完成业务层逻辑后,向工作者模块提供的IO中写入回应即可。

实现概览

impl

工作者模块、协议模块和应用模块最小化偶合,采取固定的信息流转。所有提供基础工作的由Master模块负责。整个请求流从工作者模块流入,经过协议模块解析后流入应用模块,最后应用模块产生回应使用上层的协议模块API发送回应。

模块之间保持数据隐藏和最小耦合度,任一模块开发者只需要了解自己所需协议模块的API和工作者API即可完成应用模块的开发。

工作模式

Master进程:管理所有Worker进程,主要负责配置解析,监听管理端口,统计汇总工作者统计数据。

Worker进程:业务逻辑实现和主体运行者,由Master fork出。

Master会时刻接收到Worker进程发出的统计数据,当一定时间后没有接收到特定Worker的报告时,Master会Kill掉这个进程并且重新启动一个进程。如果Worker进程自己崩溃掉,Master进程也会通过信号发现死亡的子进程,重新Fork新进程。Master进程监听管理端口,不仅接收Worker发出的统计报告,还可以监听来自系统管理员发出的命令查询包并且回复自身的状态。

模块实现还需要注意的事项:

  1. 日志写入
  2. 配置项解析

######目前已完成模块实现:

工作者模块:

  1. 同步工作者:用于应用开发的调试
  2. 异步工作者:用于生产环境下使用

协议模块:

  1. Http协议:支持Http1.1和Http1.0协议,与Nginx媲美的Http协议处理能力
  2. Redis协议:支持The new unified request protocol,即Redis 1.2以后的版本的协议

应用模块:

  1. WSGI应用: 使用Python-C API编写的WSGI服务器,由于上层Http协议极快的解析能力,做到比Gevent实现的WSGI服务器更快
  2. 静态文件应用: 使用内核调用直接发送数据避免复制,与Nginx差不多的静态文件处理能力
  3. Redis集群管理应用: 零复制代理及集群分发应用

Wheatserver目前试用部署在Srchsale,运行情况良好。

性能

请参考Wheatserver与Gevent作为WSGI服务器的性能评测

TODO

近期需要支持的功能: Mail协议

工作者模块增加协程工作者