问题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 serializablecelery 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 遇到的问题的更多相关文章

  1. 我使用celery以及docker部署遇到的问题

    首先我本机测试时没有问题的,但是在线上docker中,任务一直显示 "Sending due task".超时的任务是 django orm update 操作,本地不会出现这样的 ...

  2. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  3. Docker部署Hadoop集群

    Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...

  4. 程序开发使用docker部署

    我们公司自己研发了一套 grand-line 系统,使用 docker 来部署项目. 我是第一批小白鼠,一开始网络差,build 一次要半个小时,连接进入 web shell 也很慢,部署一个微信项目 ...

  5. Docker部署SDN环境

    2014-12-03 by muzi Docker image = Java class Docker container = Java object 前言 5月份的时候,当我还是一个大学生的时候,有 ...

  6. 在生产环境使用Docker部署应用

    导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...

  7. Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈

    版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98 来源:腾云阁 https://www.qclou ...

  8. NET Core Docker部署

    NET Core Docker部署 前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行 ...

  9. Docker部署Elasticsearch集群

    http://blog.sina.com.cn/s/blog_8ea8e9d50102wwik.html Docker部署Elasticsearch集群 参考文档: https://hub.docke ...

随机推荐

  1. SLAM入门之视觉里程计(2):相机模型(内参数,外参数)

    相机成像的过程实际是将真实的三维空间中的三维点映射到成像平面(二维空间)过程,可以简单的使用小孔成像模型来描述该过程,以了解成像过程中三维空间到二位图像空间的变换过程. 本文包含两部分内容,首先介绍小 ...

  2. Spring 链接数据库

    一.前言 Spring 现在是我们在做 JavaWeb 开发中,用的最主流的框架.以后是不是我们暂时不知道,但现在是.废话不多我就介绍 Spring 中.链接数据库的三种方式: git源码地址 需要的 ...

  3. CSS3渐变相关

    背景渐变 background: -moz-linear-gradient( top,#f24652,#da2c3c); background: -o-linear-gradient(top,#f24 ...

  4. 通过SQL创建一个有主键自动递增有默认值不为空有注释的表

    -- create database db_std_mgr_sys; use db_std_mgr_sys; create table student( std_id bigint not null ...

  5. ubuntu16.04 查询ip,网关,dns信息

    用ifconfig命令只能查询ip,子网掩码信息,不能获取dns和网关信息 用下面命令即可查询 nmcli dev show

  6. <!--[if lte IE 8][endif] ]-->IE下判断IE版本的语句

    <!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见 <!--[if lte IE 7]> <![endif]--> ...

  7. dd 命令详解

    作用: dd 是一个Unix和类Unix系统中的命令, 主要功能为转换和赋值文件.在Unix和类Unix系统上, 硬件的设备驱动(如硬盘) 和特殊设备文件(如/dev/zero, /dev/rando ...

  8. 根据NPOI 读取一个excel 文件的多个Sheet

    大家都知道NPOI组件可以再你本地没有安装office的情况下来 读取,创建excel文件.但是大家一般都是只默认读取一个excel文件的第一个sheet.那么如果要读取一个excel 的所有shee ...

  9. Amazon email system中使用的字体

  10. js获取手机屏幕宽度、高度

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...