为什么一个基本的 Celery 应用程序,什么都不做,需要 8 个开放的 Redis 连接?

10c*_*ool 5 python connection redis celery kombu

试图更全面地了解 Celery/Kombu 和 Redis 如何在幕后交互,以更好地扩展项目和设备成本(特别是在我希望尽可能最小的 Redis 设置并因此最少连接的开发环境中)。

我未能在 Celery 或 Kombu 用户指南中找到我正在寻找的有关此主题的特定文档。

以下所有假设和问题都基于我使用没有任务的 Celery 应用程序运行的测试(只是app = Celery("DatabaseWorker", broker=redis_uri)),然后只是坐在那里什么也不做,并使用 redis-cli 工具(使用实时监控选项更新)。我启动了一个这种类型的工人并获得了我的 8 个开放连接。

寻找答案或更正我错误的假设:

  1. 为什么所有 8 个连接都保持打开状态?这是否与每个连接都来自一个池并因此永远不会关闭的事实有关?

  2. 如果它与池相关,那么为什么设置如下值celeryconfig.py仍然会导致 8 个连接(这两个选项似乎都不起作用)

    BROKER_TRANSPORT_OPTIONS = {
        max_connections': 5,
    }
    BROKER_POOL_LIMIT = 5
    
    Run Code Online (Sandbox Code Playgroud)
  3. 两 (2) 个连接似乎与celeryev(用于监控工具)相关联。一种用于发布消息(发出PUBLISH命令),一种用于订阅 ( PSUBSCRIBE)。我可以使用--without-hearbeat(以前不使用CELERY_SEND_EVENTS配置变量)保存连接来关闭发布。我也可以阻止订阅连接吗?在我想要尽可能少的连接并且不关心监视杀死两者的开发环境中,这会很棒。

  4. 四 (4) 个连接遵循这种模式,它们检查某些队列/集合/键的存在,然后在集合中设置一个值。但是还没有关闭。为什么?例如:

    1449649220.026758 [0 [::1]:57605] "INFO"
    1449649220.027633 [0 [::1]:57605] "MULTI"
    1449649220.027655 [0 [::1]:57605] "LLEN" "celery@xxxxxx-MacBook-Pro.local.celery.pidbox"
    1449649220.027665 [0 [::1]:57605] "LLEN" "celery@xxxxxx-MacBook-Pro.local.celery.pidbox\x06\x163"
    1449649220.027674 [0 [::1]:57605] "LLEN" "celery@xxxxxx-MacBook-Pro.local.celery.pidbox\x06\x166"
    1449649220.027681 [0 [::1]:57605] "LLEN" "celery@xxxxxx-MacBook-Pro.local.celery.pidbox\x06\x169"
    1449649220.027691 [0 [::1]:57605] "EXEC"
    1449649220.027983 [0 [::1]:57605] "SADD" "_kombu.binding.celery.pidbox" "\x06\x16\x06\x16celery@xxxxxx-MacBook-Pro.local.celery.pidbox"
    
    Run Code Online (Sandbox Code Playgroud)
  5. 一 (1) 个连接似乎用于引导系统。设置与pidbox然后发布相关的密钥。如果这只是为了让分布式系统知道一个新的工人已经上线?

    1449697220.549016 [0 [::1]:62992] "PUBLISH" "celery.pidbox" "{\"body\": \"eyJyZXBseV90byI6IHsicm91dGluZ19rZXkiOiAiMTUwYWZhYzEtZThmNy0zNDI2LWEwM2ItNWRhNGYzMzg3M2JhIiwgImV4Y2hhbmdlIjogInJlcGx5LmNlbGVyeS5waWRib3gifSwgInRpY2tldCI6ICJjNGUyNTVjMS05YzZjLTQxNzktOGM4Yi05NzRmOGVjYmE5ZDQiLCAiZGVzdGluYXRpb24iOiBudWxsLCAibWV0aG9kIjogImhlbGxvIiwgImFyZ3VtZW50cyI6IHsicmV2b2tlZCI6IHt9LCAiZnJvbV9ub2RlIjogImNlbGVyeUBFc3RldmFucy1NYWNCb29rLVByby5sb2NhbCJ9fQ==\", \"headers\": {\"expires\": 1449697221.548759, \"clock\": 1}, \"content-type\": \"application/json\", \"properties\": {\"body_encoding\": \"base64\", \"delivery_info\": {\"priority\": 0, \"routing_key\": \"\", \"exchange\": \"celery.pidbox\"}, \"delivery_mode\": 2, \"delivery_tag\": \"e8e4ad76-bb0a-4c83-8cca-d01e25f3633b\"}, \"content-encoding\": \"utf-8\"}"
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在 redis 中为 Kombu 设置的密钥非常神秘,我很难确切地找出它们的用途。我假设这些键/值是正在使用的实际消息队列,但是_kombu.binding.celery.pidbox服务器的具体目的是什么,例如,该值的疯狂格式是什么?(我假设_kombu.binding.celery是默认的任务队列,_kombu.binding.celeryev是心跳消息的队列)

    1449649219.005095 [0 [::1]:57599] "SADD" "_kombu.binding.reply.celery.pidbox" "bc8319b5-c8d3-38b9-8848-da686bd088b7\x06\x16\x06\x16bc8319b5-c8d3-38b9-8848-da686bd088b7.reply.celery.pidbox"
    1449649220.020213 [0 [::1]:57604] "SADD" "_kombu.binding.celeryev" "worker.#\x06\x16\x06\x16celeryev.4834be60-b102-4fd5-9fdc-617bb945c079"
    1449649220.024899 [0 [::1]:57603] "SADD" "_kombu.binding.celery" "celery\x06\x16\x06\x16celery"
    1449649220.027983 [0 [::1]:57605] "SADD" "_kombu.binding.celery.pidbox" "\x06\x16\x06\x16celery@xxxxxx-MacBook-Pro.local.celery.pidbox"
    
    Run Code Online (Sandbox Code Playgroud)
  7. 一 (1) 个连接仅用于轮询队列和弹出元素,这对于保持活动是有意义的,我可以理解为什么这永远不会关闭。但是这些队列名称从何而来?它们似乎与上面使用SADD. 为什么他们的3个队列?

    1449649224.677975 [0 [::1]:57601] "BRPOP" "celery" "celery\x06\x163" "celery\x06\x166" "celery\x06\x169" "1"
    
    Run Code Online (Sandbox Code Playgroud)

如果最后一个工人只需要 8 个连接,因为所有这些都是必要的,那么就这样吧。