• django celery的分布式异步之路(二) 高并发


    当你跑通了前面一个demo,博客地址:http://www.cnblogs.com/kangoroo/p/7299920.html,那么你的分布式异步之旅已经起步了。

    性能和稳定性是web服务的核心评价指标。下面我们来说,怎么样部署服务,实现web服务的高并发和高可用。

    我们将通过一些工具和部署,提升web服务的性能。

    这篇文章我们先讲高并发

    部署方式:nginx+gunicorn+wsgi

    1、django和python的缺陷分析

    django作为一个python实现的web服务器,它的性能其实是没有多大保证的。这是因为python的线程是不能共享机器资源的(因为万恶的GIL),线程们只是通过频繁切换控制权,来分享一个core上的时间片,让你看起来是并发在跑,但是其实同一个时间只有一个线程在跑。那python是不是在自欺欺人?不是的。看你程序的类型:

    1)IO密集型

    IO密集型程序的耗时基本都在打开文件/打开句柄进行读写,也就是消耗在IO上。这种类型的程序,当线程阻塞在IO上时,交出线程控制权,给其他线程运行,当IO完成后再获得控制权继续跑,这样的话,可以在IO的时候跑其他的线程,其实是可以提高代码运行效率的。

    2)计算密集型

    你的程序基本就没有IO,而是在跑一个算法。那么对不起,这种类型的程序,你通过python多线程编程无法提升效率,甚至会再频繁切换线程控制权时,损失效率。

    3)协线程greenlet

    python的这种类型的线程(我们姑且叫他线程),只在IO阻塞的情况下进行线程控制权的切换。而gevent就是协线程的一个实现。

    2、gunicorn部署

     1)安装gunicorn,并安装协线程的支持

    $ pip install gunicorn
    $ pip install greenlet  # Required for both
    $ pip install eventlet  # For eventlet workers
    $ pip install gevent    # For gevent workers

    2)改造你的django工程,让他变成一个wsgi应用

    在工程的settings.py中INSTALLED_APPS中加入gunicorn

    INSTALLED_APPS = (
       ...'djcelery',
        'kombu.transport.django',
        'gunicorn',
    )

    然后你就可以这样启动了

    nohup gunicorn --worker-class=gevent dmonitor.wsgi:application -b 0.0.0.0:8009 -w 4 &

    打印如下,你使用了gevent的异步方式绑定本机8009端口启动了4个进程(其实是5个,后面再说)

    [2017-08-28 17:05:16 +0000] [24913] [INFO] Starting gunicorn 19.7.1
    [2017-08-28 17:05:16 +0000] [24913] [INFO] Listening at: http://0.0.0.0:8009 (24913)
    [2017-08-28 17:05:16 +0000] [24913] [INFO] Using worker: gevent
    [2017-08-28 17:05:16 +0000] [24939] [INFO] Booting worker with pid: 24939
    [2017-08-28 17:05:16 +0000] [24940] [INFO] Booting worker with pid: 24940
    [2017-08-28 17:05:16 +0000] [24941] [INFO] Booting worker with pid: 24941
    [2017-08-28 17:05:16 +0000] [24942] [INFO] Booting worker with pid: 24942

    先简单说明一下:

    --worker-class:指定了异步方式,使用的是gevent方式实现的异步,也就是每个worker(进程)中线程之前切换使用的是协线程切换。

    dmonitor.wsgi:application:dmonitor是django工程的名称,你的django工程中要有wsgi.py文件。

    -b:你的进程服务绑定哪个ip和端口

    -w:启动几个worker

    其实这样你就部署完了!

    介绍一下gunicorn

    1)主从结构

    gunicorn其实是个pre-fork的主从结构:一个master进程管理着多个worker进程,之前我们起了4个进程,但是实际上有5个就是因为有一个是master进程。

    master进程不对外提供api,只是进行集群的管理,核心就是探活,一旦发现有worker进程挂掉了,那么master会把它拉起来。

    2)worker数量的选择

    官方给出的公式是worker_num = (2 $num_cores) 1,num_cores是机器核数。

    官方又说了,一般配置的数量是4-12个,就能够支持上万QPS。当然前提是你的web服务能处理的过来。

    3)配置说明

    懒得翻译了,请看这里

    4、nginx部署

    在说nginx部署之前,先说一些废话。

    可能大家有个疑问,gunicorn和nginx有啥区别?或者说我使用了gunicorn已经启动了多个实例,并且进行了负载均衡,我为什么要需要nginx呢?

    一般来说是需要nginx的,原因有这几点:

    1)你的服务有没有静态文件?

    2)你需不需要做灰度,需不需要拦截功能等等等?

    3)你能保证你的服务能抗的住高峰压力?

    nginx的强大能让你拥有上述的能力。当然nginx作为一个已经在无数生产环境中验证过的web容器,还是很省心的。

    回到这个系列,我们是想解决高并发异步场景,那么对高并发使用nginx有什么好处呢?

    nginx可以做为一个缓冲器,nginx在接收完request之后,才开始转发,如果nginx后面的服务疲于相应,nginx就会缓存request,等待空闲来到再进行转发。这样提高了系统的弹性。

    部署nginx其实并没有什么区别,因为通过gunicorn启动的服务对外也只有一个ip:port

    注意:我们这里是把静态文件直接通过nginx进行转发的,而不是通过web服务的模板引擎。这充分利用了nginx的高性能。

    nginx配置文件

    upstream dmonitor {
            server 10.93.84.53:8009;
    }
    server {
            listen   8080;
    
            server_name 10.93.84.53;
            access_log  /var/log/nginx/dmonitor.log;
    
            location / {
                    proxy_pass http://dmonitor;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
            location /static/ {
                    #静态文件目录
                    root /home/.../static; 
            }            

    热加载配置文件你只需要执行如下命令

    ./nginx -s reload
  • 相关阅读:
    C语言在32位和64位机器下数字数据类型的字节数取决于编译器和平台, 主要由编译器决定。
    [MySQL]表创建外键失败:ERROR 1005 (HY000): Can't create table (errno: 150)
    将Windows下磁盘出现黑色为分配区域变成绿色区域
    [git更新中]版本控制工具git初步使用
    [Python]python CGI脚本在apache服务器上运行时出现“Premature end of script headers”错误
    [MySQL]修改mysql数据库的root密码的方法
    网页表单中的汉字存储到数据库, 再从数据库中提取并显示到网页时碰到的乱码问题。
    将chrome浏览器的默认背景颜色修改为浅绿色,以减缓长时间看电脑的眼睛不舒服的问题
    获取百度音乐盒里歌曲的外部链接。
    [Apache]架设Apache服务器
  • 原文地址:https://www.cnblogs.com/kangoroo/p/7300433.html
Copyright © 2020-2023  润新知