Celery,Tornado,Supervisor构建和谐的分布式系统
Celery 分布式的任务队列
与rabbitmq消息队列的区别与联系:
- rabbitmq 调度的是消息,而Celery调度的是任务.
- Celery调度任务时,需要传递参数信息,传输载体可以选择rabbitmq.
- 利用rabbitmq的持久化和ack特性,Celery可以保证任务的可靠性.
优点:
- 轻松构建分布式的Service Provider。
- 高可扩展性,增加worker也就是增加了队列的consumer。
- 可靠性,利用消息队列的durable和ack,可以尽可能降低消息丢失的概率,当worker崩溃后,未处理的消息会重新进入消费队列。
- 用户友好,利用flower提供的管理工具可以轻松的管理worker。
flower - 使用tornado-celery,结合tornado异步非阻塞结构,可以提高吞吐量,轻松创建分布式服务框架。
- 学习成本低,可快速入门
快速入门
定义一个celery实例main.py:
1 |
from celery import Celery |
include指的是需要celery扫描是否有任务定义的模块路径。例如add_task 就是扫描add_task.py中的任务
celery的配置文件可以从文件、模块中读取,这里是从模块中读取,celeryconfig.py为:
1 |
from multiprocessing import cpu_count from celery import platforms |
这里面是一些celery的配置参数。
在上面include的add_task.py定义如下:
1 |
#encoding:utf8 from main import app @app.task |
启动celerycelery -A main worker -l info -Ofair
- -A 后面是包含celery定义的模块,我们在main.py中定义了
app = Celery...
测试celery: - -l 日志打印的级别,这里是info
- -Ofair 这个参数可以让Celery更好的调度任务
1 |
# encoding:utf8 |
输出是
1 |
<class 'celery.result.AsyncResult'> |
当调用result.get()时,如果还没有返回结果,将会阻塞直到结果返回。这里需要注意的是,如果需要返回worker执行的结果,必须在之前的config中配置CELERY_RESULT_BACKEND这个参数,一般推荐使用Redis来保存执行结果,如果不关心worker执行结果,设置CELERY_IGNORE_RESULT=True就可以了,关闭缓存结果可以提高程序的执行速度。
在上面的测试程序中,如果修改为:
1 |
# encoding:utf8 |
输出结果为:
1 |
<type 'int'> |
相当于直接本地调用了add方法,并没有走Celery的调度。
通过flower的dashbord可以方便的监控任务的执行情况:
task list
task detail
还可以对worker进行重启,关闭之类的操作
taks_op
使用Celery将一个集中式的系统拆分为分布式的系统大概步骤就是:
- 根据功能将耗时的模块拆分出来,通过注解的形式让Celery管理
- 为拆分的模块设置独立的消息队列
- 调用者导入需要的模块或方法,使用apply_async进行异步的调用并根据需求关注结果。
- 根据性能需要可以添加机器或增加worker数量,方便弹性管理。
需要注意的是:
- 尽量为不同的task分配不同的queue,避免多个功能的请求堆积在同一个queue中。
celery -A main worker -l info -Ofair -Q add_queue启动Celery时,可以通过参数Q加queue_name来指定该worker只接受指定queue中的tasks.这样可以使不同的worker各司其职。CELERY_ACKS_LATE可以让你的Celery更加可靠,只有当worker执行完任务后,才会告诉MQ,消息被消费。CELERY_DISABLE_RATE_LIMITSCelery可以对任务消费的速率进行限制,如果你没有这个需求,就关闭掉它吧,有益于会加速你的程序。
tornado-celery
tornado应该是python中最有名的异步非阻塞模型的web框架,它使用的是单进程轮询的方式处理用户请求,通过epoll来关注文件状态的改变,只扫描文件状态符发生变化的FD(文件描述符)。
由于tornado是单进程轮询模型,那么就不适合在接口请求后进行长时间的耗时操作,而是应该接收到请求后,将请求交给背后的worker去干,干完活儿后在通过修改FD告诉tornado我干完了,结果拿走吧。很明显,Celery与tornado很般配,而tornado-celery是celery官方推荐的结合两者的一个模块。
整合两者很容易,首先需要安装:
- tornado-celery
- tornado-redis
tornado代码如下:
1 |
# encoding:utf8 |
在浏览器输入:http://127.0.0.1:8889/add?x=1&y=2
结果为:
通过tornado+Celery可以显著的提高系统的吞吐量。
Benchmark
使用Jmeter进行压测,60个进程不间断地的访问服务器:
接口单独访问响应时间一般在200~400ms
- uwsgi + Flask方案:
uwsgi关键配置:1
2processes = 10
threads = 3
Flask负责接受并处理请求,压测结果:
qps是46,吞吐量大概是2700/min
uwsgi+Flask
- tornado+Celery方案:
Celery配置:CELERYD_CONCURRENCY = 10也就是10个worker(进程),压测结果:
qps是139,吞吐量大概是8300/min
tornado+Celery
从吞吐量和接口相应时间各方面来看,使用tornado+Celery都能带来更好的性能。
Supervisor
- 什么是supervisor
supervisor俗称Linux后台进程管理器 - 适合场景
– 需要长期运行程序,除了nohup,我们有更好的supervisor
– 程序意外挂掉,需要重启,让supervisor来帮忙
– 远程管理程序,不想登陆服务器,来来来,supervisor提供了高大上(屁~)的操作界面.
之前启动Celery命令是celery -A main worker -l info -Ofair -Q common_check,当你有10台机器的时候,每次更新代码后,都需要登陆服务器,然后更新代码,最后再杀掉Celery进程重启,恶不恶心,简直恶心死了。
让supervisor来,首先需要安装:pip install supervisor
配置文件示例:
1 |
[unix_http_server] |
示例文件很长,不要怕,只需要复制下来,改改就可以
比较关键的几个地方是:
1 |
[inet_http_server] |
这个可以让你通过访问http://yourhost:2345 ,验证输入admin/admin的方式远程管理supervisor,效果如下:
remote supervisor[program:flower]这里就是你要托管给supervisor的程序的一些配置,其中autorestart=true可以在程序崩溃时自动重启进程,不信你用kill试试看。
剩下的部分就是一些日志位置的设置,当前工作目录设置等,so esay~
supervisor优点:
- 管理进程简单,再也不用nohup & kill了。
- 再也不用担心程序挂掉了
- web管理很方便
缺点:
- web管理虽然方便,但是每个页面只能管理本机的supervisor,如果我有一百台机器,那就需要打开100个管理页面,很麻烦.
怎么办~
supervisor-easy闪亮登场
通过rpc调用获取配置中的每一个supervisor程序的状态并进行管理,可以分组,分机器进行批量/单个的管理。方便的不要不要的。来两张截图:
- 分组管理:
group - 分机器管理:
server
通过简单的配置,可以方便的进行管理。
Celery,Tornado,Supervisor构建和谐的分布式系统的更多相关文章
- celery和supervisor配合使用,实现supervisor管理celery进程
在这里我选择redis作为celery异步任务的中间人,系统选择CentOS6.5 64位.redis.celery和supervisor的安装参见官方文档. 安装完毕后: 1, 创建celery的实 ...
- centos7 使用nginx + tornado + supervisor搭建服务
如何在Linux下部署一个简单的基于Nginx+Tornado+Supervisor的Python web服务. Tornado:官方介绍,是使用Python编写出来的一个极轻量级.高可伸缩性和非阻塞 ...
- Nginx + tornado + supervisor部署
参考链接:supervisor + Tornado + Nginx 使用详解, 用tornado ,Supervisord ,nginx架网站, tornado官方文档 项目文档树: . ├── ch ...
- tornado + supervisor + nginx + linux 亲身体验
先说说思路 一.安装这些东西,tornado, supervisor( sudo pip install supervisor 在linux 系统上), 安装 nginx (sudo apt-ge ...
- 部署项目Nginx+Tornado+Supervisor
http://www.jianshu.com/p/9bebb99368ea Tornado Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻 ...
- ubuntu下python+tornado+supervisor+nginx部署
由于项目需要,老师让我写一个小web系统,之前都是用java写web,想到自己最近学机器学习要用python,所以用python来写一下,此外,因为想用点新东西,也介于程序比较小,所以考虑用mongo ...
- tornado + supervisor + nginx 的一点记录
看了比较多的blog基本都是这个架构: supervisor ------------ app1 |-------app2 |-------.... |-------appn |-------ngin ...
- erl_0020 《面对软件错误构建可靠的分布式系统》读书笔记001 “面向并发COPL”
在现实世界中,顺序化的(sequential)活动非常罕见.当我们走在大街上的时候,如果只看到一件事情发生的话我们一定会感到不可思议,我们期望碰到许多同时进行的活动. 如果我们不能对同时发生的众多事件 ...
- supervisor 启动 celery 及启动中的问题
一.前言 本教程重点在于supervisor的配置过程,celery的安装配置请参考其他教程 二.安装supervisor 1.安装命令 pip install supervisor # superv ...
随机推荐
- ural 1338. Automobiles
1338. Automobiles Time limit: 3.0 secondMemory limit: 64 MB Everyone knows what traffic congestion i ...
- IO中同步、异步与阻塞、非阻塞的区别
一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...
- doPost方法与doGet方法
例子我们发现forward跳转访问Servlet说不定的感觉,其实我们要想弄明白这个问题,就要从forward本身来研究了. 我们都知道 forward跳转是转发请求,不转发地址的,简单点说,forw ...
- NOI模拟赛Day2
深深的感受到了自己的水 ---------------------------------------------------------------------------------------- ...
- dubbo源码学习(一)之ExtensionLoader
[转载请注明作者和原文链接,欢迎讨论,相互学习.] 一.前言 ExtensionLoader类,主要是根据扩展点名称来对扩展点接口实现进行的一系列操作,如果获取扩展点接口实现实例.适配类实例.更新实现 ...
- C#中WinForm程序退出方法技巧总结(转)
本文实例总结了C#中WinForm程序退出方法技巧.分享给大家供大家参考.具体分析如下: 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit ...
- Node.js 手册查询-2-MongoDB数据库方法
MongoDb 标签(空格分隔): 数据库 MongoDb 安装 当前版本 2.X 解压至任意目录,最好不要是c盘. 在根目录下建立一个文件夹用来存储工程 我的例子: 安装至: d:\mongodb ...
- javascrit2.0完全参考手册(第二版) 第2章第3节 变量
变量存储数据.每个变量都有一个名字,叫做标识符.在js中声明变量使用var关键字,var为新的数据分配存储空间,或者指示一直标识符正在使用.声明变量非常简单: var x; 这个语句告诉解释器一个新的 ...
- validation插件
1.项目下载地址:http://plugins.jquery.com/validation/ 2.引入 <script type="text/javascript" src= ...
- ID3算法
转自:http://blog.sina.com.cn/s/blog_6e85bf420100ohma.html 信息熵就是一组数据包含的信息,概率的度量.一组数据越有序信息熵也就越低,极端时如果一组数 ...