Celery 4.1 “latentcall“ 版本升级详解:DynamoDB 结果后端、Redis TLS 与 Beat 调度自动更新
Celery 4.1 latentcall 版本升级详解DynamoDB 结果后端、Redis TLS 与 Beat 调度自动更新【免费下载链接】celeryDistributed Task Queue (development branch)项目地址: https://gitcode.com/gh_mirrors/ce/celeryCelery 4.1代号 latentcall是一个以修复回归缺陷为主的版本但它在结果后端与调度系统上引入了多项实用能力全新的 AWS DynamoDB 结果后端、Elasticsearch 后端的增强配置、Redis 结果后端的 TLS 支持、MongoDB 二进制结果兼容修复、Celery beat 任务调度的热更新以及任务级参数disable_sync_subtasks。读完本文你可以完整了解 4.1 相对 4.0 的行为变化掌握各后端 URL 的配置语法与参数含义并结合当前仓库源码理解其底层实现路径为升级或选型提供依据。一、版本概览4.1 的定位与发布背景根据 docs/history/whatsnew-4.1.rst4.1.0 官方定义为主要是修复版本用于解决 Celery 4.0.0 中暴露的一些问题与回归同时新增了对 Python 3.6 与 PyPy 5.8.0 的官方支持。文档中列出的受支持 Python 版本为CPython 2.7CPython 3.4CPython 3.5CPython 3.6PyPy 5.8pypy2文档同时说明新版本 PyPy预期可用但没有资源进行测试因此未列入官方支持清单。发布过程方面4.1 是 Celery 首次在没有创建者 Ask Solem 参与的情况下完成的版本。原作者在Preface中承认发布流程存在疏漏——4.1.0 发布时遗漏了这份 Whats New 文档且未按惯例更新发布代号并致谢 Ask Solem 多年来的贡献由 Omer Katz 接任该版本的发布经理。理解这段背景有助于阅读文档中若干补充说明式的措辞。需要说明的是该文档描述的是 4.1 发布时的支持范围当前仓库处于持续演进中仓库描述为 development branch具体环境要求请以你所使用版本的官方发布说明为准。二、结果后端升级本版本的新闻主体文档News部分的第一大主题是 Result Backends共覆盖四个后端DynamoDB新增、Elasticsearch增强、RedisTLS、MongoDB回归修复。2.1 新增 DynamoDB 结果后端4.1 为使用 AWS DynamoDB 的用户提供了一个全新的结果后端对应实现位于 celery/backends/dynamodb.py。安装与配置入口后端要求安装boto3库通过 extras 安装$ pip install celery[dynamodb]使用方式是将result_backend设置为 DynamoDB URLdocs/userguide/configuration.rst 中给出的配置示例# 指定 AWS region 与表名 result_backend dynamodb://us-east-1/celery_results # 从环境解析 AWS 凭据使用默认表名celery并指定读写容量单位 result_backend dynamodb:///?read5write5 # 使用可下载的本地 DynamoDBDynamoDB Local result_backend dynamodb://localhost:8000 # 使用自定义端点本地版或兼容 API 的服务 result_backend dynamodb://us-east-1 dynamodb_endpoint_url http://192.168.0.40:8000完整的 URL 字段定义为result_backend dynamodb://aws_access_key_id:aws_secret_access_keyregion:port/table?readnwritem各字段含义与默认值URL 字段说明默认值aws_access_key_id/aws_secret_access_key访问 AWS API 的凭据也可由 boto3 从环境变量等来源解析无regionAWS 区域如us-east-1本地版使用localhost无port本地 DynamoDB 监听端口若 region 未写localhost该参数不生效无table结果表名celeryread/write建表时的读写容量单位Provisioned Throughput各为 1ttl_seconds结果存活时间秒正数到期过期负数主动关闭表 TTL不设不触碰表 TTL不过期官方文档同时给出了一条重要警告该后端不兼容定义了 sort key 的表如需按分区键以外的字段查询结果表应改用全局二级索引GSI。源码层面的实现要点从 celery/backends/dynamodb.py 的DynamoDBBackend类可以看出其设计继承自KeyValueStoreBackend见 celery/backends/base.py即按 key/value 语义存取任务元数据表结构由_get_table_schema()生成分区键为id字符串型S结果存于result二进制型B并带timestamp字段_get_or_create_table()会在表不存在时自动create_table并轮询等待状态变为ACTIVE声明了supports_autoexpire True因为可以利用 DynamoDB 原生的 Time-to-Live 机制自动清理结果。TTL 的启用/禁用逻辑集中在_has_ttl()与_set_table_ttl()中当ttl_seconds为正时_prepare_put_request()会为每条记录写入一个ttl属性值为写入时间戳加上存活秒数交由 DynamoDB 过期回收类属性默认值与文档一致table_name celery、read_capacity_units 1、write_capacity_units 1实现了incr()原子自增并置implements_incr True结合_apply_chord_incr()使 chord头计数场景可以在 DynamoDB 上原子累加chord_count。另外从源码可以看到URL 解析后若region为localhost或合法 IP会自动拼装本地端点http://region:port并将 region 固定为us-east-1本地版约定同时打印 warning 日志——这正是 2.1 节中dynamodb://localhost:8000写法背后的机制。2.2 Elasticsearch 后端更稳健、更可配置文档指出 Elasticsearch 结果后端现在更加稳健且可配置。对应的配置项可在 docs/userguide/configuration.rst 的 Elasticsearch 章节中查到例如result_backend elasticsearch://example.com:9200/index_name/doc_type主要配置项默认值来自文档配置项默认值说明elasticsearch_retry_on_timeoutFalse超时时是否切换节点重试elasticsearch_max_retries3抛出异常前的最大重试次数elasticsearch_timeout10.0 秒后端全局超时elasticsearch_save_meta_as_textTrue元数据以 text 还是原生 json 存储结果始终序列化为 text2.3 Redis 结果后端支持 TLS4.1 让 Redis 结果后端可以经由 TLS 加密与 Redis 服务器通信配置方式见conf-redis-result-backend文档docs/userguide/configuration.rst 中的 Redis 章节。结合 celery/backends/redis.py 的源码可以确认其行为约束SSL 连接必须使用rediss://方案若提供了 SSL 参数却使用redis://会触发E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCH错误提示rediss://URL必须携带ssl_cert_reqs参数取值只能是CERT_REQUIRED、CERT_OPTIONAL、CERT_NONE三者之一缺失或非法会报E_REDIS_SSL_CERT_REQS_MISSING_INVALID源码中对安全性有明确警示CERT_OPTIONAL与CERT_NONE都可能使 Celery 不验证 Redis 服务器身份从而暴露于中间人攻击对应常量W_REDIS_SSL_CERT_OPTIONAL/W_REDIS_SSL_CERT_NONE因此在生产环境应优先使用CERT_REQUIRED支持的 SSL 连接参数包括ssl_ca_certs、ssl_certfile、ssl_keyfile、ssl_cert_reqs等。2.4 MongoDB 后端修复二进制结果回归文档说明 MongoDB 结果后端现在可以处理二进制编码的任务结果这是修复 4.0.0 引入的回归此前使用 MsgPack、Pickle 等序列化器配合 MongoDB 结果后端会出问题因为这些序列化器产出的正是二进制字节串。如果你此前因该回归而被迫改用 JSON 序列化4.1 之后可以恢复原有序列化配置。三、周期任务调度表自动更新无需重启 beat这是 4.1 对运维体验最直接的改善。文档原文任务调度表现在会在新任务加入时自动更新。现在如果使用 Django 数据库调度器Django database scheduler你可以增删调度任务而无需重启 Celery beat。结合 celery/beat.py 的源码结构可以印证其机制Scheduler定义了同步频率参数sync_every 3 * 60默认 3 分钟以及可选的sync_every_tasks多少个任务后强制同步默认None每次apply_async()派发调度任务后会累计_tasks_since_sync并由should_sync()判断是否到达同步阈值达标则调用_do_sync()触发sync()数据库调度器Django 调度器的sync()会从存储重新装载调度条目经由setup_schedule()重建调度表而update_from_dict()负责将调度条目合并进内存中的调度表。因此增删任务无需重启的实现路径是beat 周期性地把数据库中的调度条目同步回内存调度表新任务的生效时间取决于beat_sync_every之类的同步间隔而非立即。理解这一点有助于回答为什么我新加的任务没有马上执行这类问题。四、任务参数disable_sync_subtasks4.1 为任务新增了disable_sync_subtasks参数允许用户覆盖禁用同步子任务的默认行为。该参数在 celery/result.py 中贯穿AsyncResult、GroupResult、ChordResult的构造路径get_task_meta、get等方法签名中默认disable_sync_subtasksTrue并向下透传给子任务结果对象。官方对同步子任务的建议见 docs/userguide/tasks.rst 的Avoid launching synchronous subtasks一节任务等待另一个任务的结果既低效又可能在 worker 池耗尽时死锁推荐用回调或链式任务canvas替代。文档给出的正误对照示例# Bad同步等待易死锁 app.task def update_page_info(url): page fetch_page.delay(url).get() info parse_page.delay(page).get() store_page_info.delay(url, info) # Good用 chain 串接天然异步 app.task def update_page_info(url): chain fetch_page.s(url) | parse_page.s() | store_page_info.s(url) chain()disable_sync_subtasks的意义在于当你在group或chord头部任务内部需要主动调用子任务结果对象的get()时可以显式传disable_sync_subtasksFalse覆盖默认拦截避免被框架强制异步的限制挡住——但官方立场仍是尽量改用 canvas 组合。五、Canvas 稳定性修复文档News最后一项指出 Canvas 修复了多个 bug使用 Canvas 的体验显著更顺滑。Canvas任务组合原语如chain、group、chord的实现位于 celery/canvas.py是 Celery 的核心抽象这一项虽未逐项列出但在从 4.0 升级到 4.1 时值得对组合任务做一轮回归验证。六、升级与验证建议适用前提升级前确认 Python 环境在 4.1 官方支持清单内CPython 2.7/3.4/3.5/3.6 或 PyPy 5.8 pypy2超出范围的解释器属于未测试状态。变更点核对如果你的部署使用了 DynamoDB / Elasticsearch / Redis / MongoDB 结果后端逐一对照上文第二节确认新增能力是否需要启用例如 Redis 端启用 TLS 需要同时确认rediss://与ssl_cert_reqs配置Beat 用户使用 Django 数据库调度器的用户升级后即可利用调度热更新但注意生效周期受同步间隔限制组合任务使用 canvas 的组合流程建议在测试环境跑一遍集成用例仓库中 t/integration/ 下的test_canvas.py等测试文件可作参考。参考路径内容路径4.1 Whats New 原文docs/history/whatsnew-4.1.rst4.1 变更日志docs/history/changelog-4.1.rstDynamoDB 后端实现celery/backends/dynamodb.pyRedis 后端实现TLS 相关celery/backends/redis.py结果后端配置文档docs/userguide/configuration.rst同步子任务说明docs/userguide/tasks.rstBeat 调度器实现celery/beat.pyCanvas 实现celery/canvas.py【免费下载链接】celeryDistributed Task Queue (development branch)项目地址: https://gitcode.com/gh_mirrors/ce/celery创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →