我使用 Docker 部署 Celery 遇到的问题
问题1 - Sending due task
本机测试时没有问题的,但是在线上 docker 中,任务一直显示 “Sending due task”。超时的任务是 Django ORM update 操作。
猜测 - 是否与其他 Celery 公用了 redis db?
其他 Celery 也使用了这个 redis db 作为 broker,有很多其他 Celery 的任务在队列中,轮不到我的任务。于是我将 redis db 设置为 13,但没有修复这个问题。
使用队列
那么我是否能够定义一个自己的专有队列,然后让我的 worker 执行自定义队列中的任务呢?这样就不需要挑别人未使用的 redis db 了。
根据 http://docs.celeryproject.org/en/latest/userguide/routing.html#basics 以及 http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html 我将我的任务放在队列中,然后报错
ImproperlyConfigured:
Cannot mix new setting names with old setting names, please
rename the following settings to use the old format:task_routes -> CELERY_ROUTES
这是因为 Celery 有两种命名规范。
New lowercase settings
Version 4.0 introduced new lower case settings and setting organization.The major difference between previous versions, apart from the lower case names, are the renaming of some prefixes, like celerybeat_ to beat_, celeryd_ to worker_, and most of the top level celery_ settings have been moved into a new task_ prefix.
Celery will still be able to read old configuration files, so there’s no rush in moving to the new settings format. - From http://docs.celeryproject.org/en/latest/userguide/configuration.html#example-configuration-file
在设置队列后,还是没有解决这个问题。
问题2 - 多个 docker 重复执行 Celery 任务
使用 docker 部署一次会创建三个容器,一个用作备份,两外两个用于生产。现在 Celery 会每小时向微信服务器申请 access token,然后就会被微信服务器封掉 ip,因为请求太频繁了。
由于只要在本地的 access token 过期前申请新的 access token 就可以,所以不一定要在整点执行。于是我将申请 access token 的定时任务设置为随机分钟数,然后执行前检查 redis,如果其他 docker 中的 Celery 已经执行过来,则不再执行。
问题3 - Not JSON serializable
错误信息:
kombu.exceptions.EncodeError: <function get_file_info at 0x1115c7bf8> is not JSON serializable
这是从 celery3.1.23 升级成 celery4.0.2 之后发生的,在我重新安装 celery3.1.23 后就不会报错。我搜索 kombu.exceptions.EncodeError not JSON serializable
、celery not JSON serializable
都没有找到答案。
没办法之后,就问同事,刚开始他也没思路,后来我强调 celery3.1.23 可以序列化而 celery4.0.2 会报错,他突然想起:“celery4.0.2 默认使用 JSON 作为 serializer ,而 celery==3.1.23 默认使用 pickle。”。然后搜索 Add Celery serializer
,在 celeryconfig.py 中增加如下配置:
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_ACCEPT_CONTENT = ['pickle', 'json']
Celery 依赖问题
Celery 的依赖包不应该放进 requirements.txt 里面。因为当更换 Celery 版本的时候会导致依赖出问题。所以,不要将包的依赖放进 requirements.txt 中。
反思一下,存在以下问题:
- 升级之前没有思考到库的变化对代码的影响,尤其是不兼容的版本版本升级(有 3.1.23 到 4.0.2)。
- 问人要提早问,不要不好意思。之前是问的太多了,现在是问的太少了。有些问题可能要花很多时间去找答案,但他人可能了解相关的知识,只要你提问足够具体。
我使用 Docker 部署 Celery 遇到的问题的更多相关文章
- 我使用celery以及docker部署遇到的问题
首先我本机测试时没有问题的,但是在线上docker中,任务一直显示 "Sending due task".超时的任务是 django orm update 操作,本地不会出现这样的 ...
- ASP.NET Core开发-Docker部署运行
ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...
- Docker部署Hadoop集群
Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...
- 程序开发使用docker部署
我们公司自己研发了一套 grand-line 系统,使用 docker 来部署项目. 我是第一批小白鼠,一开始网络差,build 一次要半个小时,连接进入 web shell 也很慢,部署一个微信项目 ...
- Docker部署SDN环境
2014-12-03 by muzi Docker image = Java class Docker container = Java object 前言 5月份的时候,当我还是一个大学生的时候,有 ...
- 在生产环境使用Docker部署应用
导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...
- Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈
版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98 来源:腾云阁 https://www.qclou ...
- NET Core Docker部署
NET Core Docker部署 前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行 ...
- Docker部署Elasticsearch集群
http://blog.sina.com.cn/s/blog_8ea8e9d50102wwik.html Docker部署Elasticsearch集群 参考文档: https://hub.docke ...
随机推荐
- 工作随笔——ember框架去除url上的#号
因为工作原因,接触到了一套非常好的前端框架--ember. ember框架高度封装,学习曲线比较陡峭. ember对于url更新的配置在config/environment.js >> l ...
- MySQL的存储引擎与日志说明
1.1 存储引擎的介绍 1.1.1 文件系统存储 文件系统:操作系统组织和存取数据的一种机制.文件系统是一种软件. 类型:ext2 3 4 ,xfs 数据. 不管使用什么文件系统,数据内容不会变化, ...
- 【python】input、int、if-else、注释、while、module(random.randint())语法示例
import random luckyNum=random.randint(2,9) i=1 while i<=3: guessNum=input("请你猜猜我的幸运号码:" ...
- 简单介绍什么是协程及其在ES6中的实现方式
协程,英文名coroutine,是一种执行过程可以被暂停和恢复的方法.各个协程之间相互协作完成一个任务. 让我们来看一个关于发挥协程作用的例子.假定我们有一个生产者和消费者的关系,生产者创建物品并将物 ...
- iOS XIB等比例适配
选择两个视图使其等宽高,再去约束里面就可以设置乘数因子. 简单的一个例子: 要求:设置白色视图的宽度为蓝色视图的一半 1.点击白色视图连线到父视图,选择 Equal Widths 2.选择右边 ...
- 封装数据库配置文件App配置文件
<connectionStrings> <add name="strCon" connectionString="Data Source=.;Ini ...
- Struts2-整理笔记(四)Action生命周期、如何获取参数(3种)、集合类型参数封装
一.Action生命周期 每次请求到来时,都会创建一个新的Action实例 Action是线程安全的,可以使用成员变量接收参数 二.获取参数的方式(3种) 1.属性驱动获得参数 每次请求Action时 ...
- Git详解之六:Git工具
Git 工具 现在,你已经学习了管理或者维护 Git 仓库,实现代码控制所需的大多数日常命令和工作流程.你已经完成了跟踪和提交文件的基本任务,并且发挥了暂存区和轻量级的特性分支及合并的威力.(伯乐在线 ...
- C# 真正能发邮件的源码
在网上找了很多例子都试邮件发送都失败,今天无意有试了一下居然行了 public static void ErrorMessageMail(string _subject, string _body) ...
- 二维码utils希望对大家有帮助
package cn.itcast.utils; import java.io.File; import java.nio.file.Path; import java.util.HashMap; ...