为什么一个基本的Celery应用程序无所事事,需要8个开放的Redis连接?

2024-09-28 23:20:33 发布

您现在位置:Python中文网/ 问答频道 /正文

试图更全面地了解Celery/Kombu和Redis如何在引擎盖下相互作用,以更好地扩展项目规模和设备成本(尤其是在开发环境中,我希望Redis设置尽可能小,因此连接最少)。在

我在Celery或Kombu用户指南中找不到关于这个主题的具体文档

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

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

  1. 为什么所有8个连接都保持打开?这是否与每个连接都来自一个池,因此从不关闭这一事实有关?

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

    BROKER_TRANSPORT_OPTIONS = {
        max_connections': 5,
    }
    BROKER_POOL_LIMIT = 5
    
  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"
    
  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\"}"
    
  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"
    
  7. 一(1)个连接类似于轮询队列和弹出元素,这对于保持活动是有意义的,我可以理解为什么它永远不会关闭。但是这些队列名称从何而来?它们似乎与上面使用SADD设置的名称不同。为什么他们要排3个队?在

    1449649224.677975 [0 [::1]:57601] "BRPOP" "celery" "celery\x06\x163" "celery\x06\x166" "celery\x06\x169" "1"
    

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


Tags: 队列localprocelerybindingmacbookxxxxxxkombu