大部分任务将被定向
给单个工人(例如,“发送
‘get_status’ 作业到 ‘system51’”) —
这会是个问题吗?
一点也不。只需为每个工作人员创建一个队列,例如假设每个节点都侦听一个名为default 的循环队列,并且每个节点都有自己的以其节点名称命名的队列:
(a)$ celeryd -n a.example.com -Q default,a.example.com
(b)$ celeryd -n b.example.com -Q default,b.example.com
(c)$ celeryd -n c.example.com -Q default,c.example.com
将任务直接路由到节点很简单:
$ get_status.apply_async(args, kwargs, queue="a.example.com")
或者通过配置使用Router:
# Always route "app.get_status" to "a.example.com"
CELERY_ROUTES = {"app.get_status": {"queue": "a.example.com"}}
它是否优雅地处理不利因素
网络条件(例如,
连接死亡)?
worker 优雅地从代理连接失败中恢复。
(至少来自 RabbitMQ,我不确定所有其他后端,但是这个
易于测试和修复(您只需将相关异常添加到列表中)
对于客户端,如果连接断开,您可以随时重试发送任务,
或者您可以使用 RabbitMQ 设置 HA:http://www.rabbitmq.com/pacemaker.html
只有哪些功能可用
如果 RabbitMQ 被用作
后端? (我宁愿不运行 RabbitMQ
在现场系统上)
远程控制命令,仅支持“直接”交换(不支持“主题”或“扇出”)。但这将在Kombu (http://github.com/ask/kombu) 中得到支持。
我会认真重新考虑使用 RabbitMQ。为什么你认为它不适合?
恕我直言,我不会在其他地方寻找这样的系统,(如果系统可能是 ZeroMQ
是暂时的,您不需要消息持久性)。
还有什么其他原因可以让芹菜成为我的生活
如果像我描述的那样使用它会很困难吗?
我想不出你上面描述的任何东西。由于并发模型
是多处理它确实需要一些内存(我正在努力添加对
线程池和 eventlet 池,在某些情况下可能会有所帮助)。
认为 Celery 是矫枉过正是有道理的,但也有
其他让我的生活更轻松的原因,所以我想
考虑一下)
在这种情况下,我认为您轻描淡写地使用了“矫枉过正”这个词。这真的取决于
关于没有它你需要编写多少代码和测试。我想
最好改进一个已经存在的通用解决方案,理论上听起来
喜欢它应该适用于您的应用程序。