Celery和Redis的内存不足

Bil*_*lga 9 django redis celery celeryd celerybeat

我有一个部署到Heroku的Django应用程序,其中一个工作进程运行芹菜(+ celerycam用于监控).我使用RedisToGo的Redis数据库作为经纪人.我注意到Redis的内存不足.

这是我的procfile的样子:

web: python app/manage.py run_gunicorn -b "0.0.0.0:$PORT" -w 3
worker: python lipo/manage.py celerycam & python app/manage.py celeryd -E -B --loglevel=INFO
Run Code Online (Sandbox Code Playgroud)

这是KEYS'*'的输出:

  1. "_kombu.binding.celeryd.pidbox"
  2. "celeryev.643a99be-74e8-44e1-8c67-fdd9891a5326"
  3. "celeryev.f7a1d511-448b-42ad-9e51-52baee60e977"
  4. "_kombu.binding.celeryev"
  5. "celeryev.d4bd2c8d-57ea-4058-8597-e48f874698ca"
  6. `_kombu.binding.celery"

celeryev.643a99be-74e8-44e1-8c67-fdd9891a5326 正在填写这些消息:

{"sw_sys": "Linux", "clock": 1, "timestamp": 1325914922.206671, "hostname": "064d9ffe-94a3-4a4e-b0c2-be9a85880c74", "type": "worker-online", "sw_ident": "celeryd", "sw_ver": "2.4.5"}
Run Code Online (Sandbox Code Playgroud)

知道如何定期清除这些消息吗?

Bor*_*s S 2

这是一个解决方案吗?

  1. 除了_kombu.bindings.celeryev 设置之外,还会有例如celeryev.i-am-alive。具有 TTL 设置的按键(例如 30 秒);
  2. celeryev 进程将自身添加到绑定中并定期(例如每 5 秒)更新 celeryev.i-am-alive。TTL复位键;
  3. 在发送事件工作进程之前,不仅检查 _kombu.bindings.celeryev 上的成员,还检查单个 celeryev.i-am-alive。密钥也是如此,如果密钥未找到(过期),则它会从 _kombu.bindings.celeryev 中删除(并且可能会执行 del celeryev. 或 expire celeryev. 命令)。

我们不能只使用keys命令,因为它是O(N),其中N是数据库中键的总数。不过,在 Redis < 2.1 上,TTL 可能会很棘手。

芹菜过期。而不是德尔塞列耶夫。可以用来让临时离线的 celeryev 消费者复活,但我不知道这是否值得。

作者