Celery Rabbitmq(Docker) Redis(Docker) Flask quick start

前两天 搞通了 Celery 和RabbitMQ ,但是由于项目需要,需要加上Redis 来存储结果。

所以项目结构变成了RabbitMQ 当做broker, Redis 当做 backend.

关于Celery 和RabbitMQ 的安装与配置请参考celery+rabbitmq(Docker) quick start

配置Redis

Dockerfile
FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

redis.conf

#绑定的主机地址
#bind 0.0.0.0  
#指定Redis监听端口,默认端口为6379
port 6379  
  
  
tcp-backlog 511  
timeout 70  
tcp-keepalive 300  
  
#Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize yes  

#当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /root/redis/redis.pid  
  
 # 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose 
loglevel notice  
#日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile "/root/redis/redis.log"  
  
#设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id  
databases 16  
  
  
 #指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
 # save <seconds> <changes>
 #Redis默认配置文件中提供了三个条件:
#分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
save 900 1  
save 300 10  
save 60 10000  
  
  
stop-writes-on-bgsave-error yes 
#指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大 
rdbcompression yes  

rdbchecksum yes  
  
  #指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb  
#指定本地数据库存放目录
dir /root/redis  
  
  
slave-serve-stale-data yes  
slave-read-only yes  
  
  
repl-diskless-sync no  
repl-diskless-sync-delay 5  
  
  
repl-disable-tcp-nodelay no  
slave-priority 100  
  
 #指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory 32mb  
maxmemory-policy noeviction  
  
 #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no 
appendonly yes  
appendfilename "appendonly.aof"  
  
  
#指定更新日志条件,共有3个可选值: 
#    no:表示等操作系统进行数据缓存同步到磁盘(快) 
 #   always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 
 #   everysec:表示每秒同步一次(折衷,默认值)
  #  appendfsync everysec
appendfsync everysec  
no-appendfsync-on-rewrite no  
  
  
auto-aof-rewrite-percentage 100  
auto-aof-rewrite-min-size 64mb  
  
  
aof-load-truncated yes  
lua-time-limit 5000  
cluster-enabled no  
cluster-config-file nodes.conf  
cluster-node-timeout 15000  
  
  
slowlog-log-slower-than 10000  
slowlog-max-len 128  
  
  
latency-monitor-threshold 0  
notify-keyspace-events ""  
hash-max-ziplist-entries 512  
hash-max-ziplist-value 64  
  
  
set-max-intset-entries 512  
zset-max-ziplist-entries 128  
zset-max-ziplist-value 64  
hll-sparse-max-bytes 3000  
activerehashing yes  
  
  
client-output-buffer-limit normal 0 0 0  
client-output-buffer-limit slave 256mb 64mb 60  
client-output-buffer-limit pubsub 32mb 8mb 60  
  
  
hz 10  
aof-rewrite-incremental-fsync yes


Build docker image 

进入Dockerfile 和redis.conf 所在目录

docker build -t myredis .

然后启动docker容器

 docker run -itd -v /你本机目录:/data -p 6379:6379 e95af6c47c4a redis-server

以上redis 配置完成

---------------

与celery 联动

tasks.py

from celery import Celery  
from flask import Flask, request  
  
Celeryapp = Celery('tasks', backend='redis://0.0.0.0:6379',  
             broker='amqp://guest:guest@0.0.0.0:5672//')  
#app = Celery('tasks', broker='amqp://guest:guest@0.0.0.0:5672//')  
  
Flaskapp = Flask(__name__)  
 
@Flaskapp.route('/addtask')  
def add2():  
    x = request.args.get('x')  
    y = request.args.get('y')  
    add.delay(int(x), int(y))  
    return "finish"  
 
@Celeryapp.task  
def add(x,y):  
    return x + y  
  
if __name__ == '__main__':  
    Flaskapp.run('0.0.0.0')


基于前一篇的Celery与RabbitMQ的配置,这片博文加上了Redis 和python 的Flask 框架。

运行方法:
在tasks.py文件所在目录运行 (添加 worker)
celery -A tasks worker --loglevel=info  

output

(py3env) hostname:test$ celery -A tasks worker --loglevel=info  
  
 -------------- celery@hostname.local v4.1.0 (latentcall)  
---- **** -----  
--- * ***  * -- Darwin-17.5.0-x86_64-i386-64bit 2018-05-02 17:56:20  
-- * - **** ---  
- ** ---------- [config]  
- ** ---------- .> app:         tasks:0x1024b0f28  
- ** ---------- .> transport:   amqp://guest:**@127.0.0.1:5672//  
- ** ---------- .> results:     disabled://  
- *** --- * --- .> concurrency: 8 (prefork)  
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)  
--- ***** -----  
 -------------- [queues]  
                .> celery           exchange=celery(direct) key=celery  
  
  
[tasks]  
  . tasks.add  
  
[2018-05-02 17:56:21,248: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//  
[2018-05-02 17:56:21,577: INFO/MainProcess] mingle: searching for neighbors  
[2018-05-02 17:56:23,798: INFO/MainProcess] mingle: all alone  
[2018-05-02 17:56:25,158: INFO/MainProcess] celery@hostname.local ready.  

运行flower
celery flower --broker=amqp://guest:guest@127.0.0.1:5672// 
添加任务

运行 tasks.py 文件

打开浏览器

http://0.0.0.0:5000/addtask?x=5&y=5


结果:



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值