试图更全面地了解 Celery/Kombu 和 Redis 如何在幕后交互以更好地项目扩展和设备成本(特别是在我希望尽可能最小的 Redis 设置和因此最少的连接的开发环境中)。
我未能在 Celery 或 Kombu 用户指南中找到我正在寻找的关于此主题的特定文档。
以下所有假设和问题都是基于我使用 Celery 应用程序运行的测试,没有任务(只是app = Celery("DatabaseWorker", broker=redis_uri)
),然后只是坐在那里什么都不做,并使用 redis-cli 工具(使用实时监控选项更新)。我启动了一个这种类型的工作人员并获得了 8 个打开的连接。
寻找我的错误假设的答案或更正:
为什么所有 8 个连接都保持打开状态?这是否与每个连接都来自池并因此永远不会关闭的事实有关?
如果它与池相关,那么为什么设置
celeryconfig.py
如下值仍然会导致 8 个连接(这两个选项似乎都不起作用)BROKER_TRANSPORT_OPTIONS = { max_connections': 5, } BROKER_POOL_LIMIT = 5
两 (2) 个连接似乎与
celeryev
(用于监控工具)相关联。一种用于发布消息(发出PUBLISH
命令),一种用于订阅(PSUBSCRIBE
)。--without-hearbeat
我可以使用(以前不使用CELERY_SEND_EVENTS
配置变量)保存连接来关闭发布。我也可以阻止订阅连接吗?在我想要尽可能少的连接并且不关心监视杀死两者的开发环境中会很棒。四 (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"
一 (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\"}"
在 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"
一 (1) 个连接只是轮询队列和弹出元素,这对保持活动是有意义的,我明白为什么它永远不会关闭。但是这些队列名称是从哪里来的呢?它们似乎与上面使用 设置的名称不同
SADD
。为什么他们的3个队列?1449649224.677975 [0 [::1]:57601] "BRPOP" "celery" "celery\x06\x163" "celery\x06\x166" "celery\x06\x169" "1"
如果最终,一个工作人员只需要 8 个连接,因为所有这些都是必要的,那就这样吧。