前两天 搞通了 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
结果: