python - 尽管队列看起来是空的,但 Celery Redis 实例已满

标签 python django redis google-cloud-platform celery

我们有一个 Django 应用程序需要使用 Celery 获取大量数据。每隔几分钟就有 20 个左右的 celery worker 在运行。我们在 Google Kubernetes Engine 上运行,带有一个使用 Cloud memorystore 的 Redis 队列。

我们用于 celery 的 Redis 实例正在填满,即使根据 Flower 的说法,队列是空的。这导致 Redis 数据库最终被填满,Celery 抛出错误。

在 Flower 中,我看到任务进进出出,并且我增加了工作人员,以至于现在队列总是空的。

如果我运行 redis-cli --bigkeys 我会看到:


# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Biggest set    found so far '_kombu.binding.my-queue-name-queue' with 1 members
[00.00%] Biggest list   found so far 'default' with 611 items
[00.00%] Biggest list   found so far 'my-other-queue-name-queue' with 44705 items
[00.00%] Biggest set    found so far '_kombu.binding.celery.pidbox' with 19 members
[00.00%] Biggest list   found so far 'my-queue-name-queue' with 727179 items
[00.00%] Biggest set    found so far '_kombu.binding.celeryev' with 22 members

-------- summary -------

Sampled 12 keys in the keyspace!
Total key length in bytes is 271 (avg len 22.58)

Biggest   list found 'my-queue-name-queue' has 727179 items
Biggest    set found '_kombu.binding.celeryev' has 22 members

4 lists with 816144 items (33.33% of keys, avg size 204036.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
0 strings with 0 bytes (00.00% of keys, avg size 0.00)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
8 sets with 47 members (66.67% of keys, avg size 5.88)
0 zsets with 0 members (00.00% of keys, avg size 0.00)

如果我使用 LRANGE 检查队列,我会看到很多这样的对象:

"{\"body\":\"W1syNDQ0NF0sIHsicmVmZXJlbmNlX3RpbWUiOiBudWxsLCAibGF0ZXN0X3RpbWUiOiBudWxsLCAicm9sbGluZyI6IGZhbHNlLCAidGltZWZyYW1lIjogIjFkIiwgIl9udW1fcmV0cmllcyI6IDF9LCB7ImNhbGxiYWNrcyI6IG51bGwsICJlcnJiYWNrcyI6IG51bGwsICJjaGFpbiI6IG51bGwsICJjaG9yZCI6IG51bGx9XQ==\",\"content-encoding\":\"utf-8\",\"content-type\":\"application/json\",\"headers\": {\"lang\":\"py\",\"task\":\"MyDataCollectorClass\",\"id\":\"646910fc-f9db-48c3-b5a9 -13febbc00bde\",\"shadow\": null,\"eta\":\"2019-08-20T02:31:05.113875+00:00\",\"expires\": null,\"group\": null,\"retries\": 0,\"timelimit\": [null, null],\"root_id\":\"beeff557-66be-451d-9c0c-dc622ca94493\",\"parent_id\":\"374d8e3e-92b5-423e-be58-e043999a1722\",\"argsrepr\":\"(24444,)\",\"kwargsrepr\":\"{'reference_time': None, 'latest_time': None, ' rolling': False, 'timeframe': '1d', '_num_retries': 1}\",\"origin\":\"gen1@celery-my-queue-name-worker-6595bd8fd8-8vgzq\"},\“属性\”:{\“correlation_id\”:\“646910fc-f9db-48c3-b5a 9-13febbc00bde\",\"reply_to\":\"e55a31ed-cbba-3d79-9ffc-c19a29e77aac\",\"delivery_mode\": 2,\"delivery_info\": {\"exchange\":\"\",\"routing_key\":\"my-queue-name-queue\"},\"优先级\": 0,\"body_encoding\":\"base64\",\"delivery_tag\":\"a83074a5 -8787-49e3-bb7d-a0e69ba7f599\"}}"

我们正在使用 django-celery-results 来存储结果,所以这些不应该放在那里,我们正在为 Django 的缓存使用一个单独的 Redis 实例。

如果我用 FLUSHALL 清除 Redis,它会再次慢慢填满。

我有点不知下一步该去哪里。我不太了解 Redis - 也许我可以做些事情来检查数据以查看填充的是什么?也许是 Flower 没有正确报告?尽管我们使用 Django DB 获取结果,但 Celery 可能会保留已完成的任务一段时间?

感谢负载的任何帮助。

最佳答案

听起来 Redis 没有设置为删除已完成的项目或报告并删除失败的项目——即它可能会将任务放在 list 上,但不会将其取消。

查看 pypi 包:rq、django-rq、django-rq-scheduler

您可以在这里阅读一些关于它应该如何工作的信息:https://python-rq.org/docs/

关于python - 尽管队列看起来是空的,但 Celery Redis 实例已满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57571911/

相关文章:

django - django 中的电子邮件模板

docker - Docker 上的 Redis Sentinel 提供 Docker 网络 IP 地址

python - 无需下载视频即可捕获 YouTube 视频以供进一步处理

python - 如何解决 numpy 中的内存 View 错误?

python - Python中的 `board[x, y]`和 `board[x][y]`有区别吗?

django - 如何使用带有 gunicorn 的 Django 日志记录

python - 想要传递 false 但出现 Nameerror 异常

django - 运行 "python manage.py migrate"命令时 Django 中出现 ValueError

redis - 控制台上有奇怪的 REDIS 字符?

Redis点对点类集群(K8s)