我正在编写一些软件,它将通过间歇性的3G(或类似)连接管理"现场"中的几百个小系统.
家庭基地将需要将作业发送到现场的系统(例如,"报告您的状态","更新您的软件"等),并且该领域的系统将需要将作业发送回服务器(例如, "已检测到故障","这里有一些数据"等).
我花了一些时间看Celery,它看起来非常合适:celeryd在家里运行可以为celeryd现场系统收集工作,现场系统上的运行可以为服务器收集工作,这些工作可能是随着客户的到来而交换.
那么,芹菜是否适合这个问题呢?特别:
谢谢!
(建议Celery是矫枉过正是有效的,但还有其他原因会让我的生活更轻松,所以我想考虑一下)
ask*_*sol 12
大多数任务将被定向到一个单独的工作人员(例如,"将'get_status'工作发送到'system51'") - 这会是一个问题吗?
一点也不.只需为每个worker创建一个队列,例如说每个节点都监听一个被调用的循环队列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
Run Code Online (Sandbox Code Playgroud)
将任务直接路由到节点很简单:
$ get_status.apply_async(args, kwargs, queue="a.example.com")
Run Code Online (Sandbox Code Playgroud)
或使用以下配置Router:
# Always route "app.get_status" to "a.example.com"
CELERY_ROUTES = {"app.get_status": {"queue": "a.example.com"}}
Run Code Online (Sandbox Code Playgroud)
它是否优雅地处理不利的网络条件(例如,连接死亡)?
工作人员从代理连接失败中优雅地恢复.(至少从RabbitMQ,我不确定所有其他后端,但这很容易测试和修复(你只需要将相关的例外添加到列表中)
对于客户端,如果连接断开,您可以随时重试发送任务,或者您可以使用RabbitMQ设置HA:http://www.rabbitmq.com/pacemaker.html
只有将RabbitMQ用作后端时才能使用哪些功能?(我宁愿不在现场系统上运行RabbitMQ)
支持远程控制命令,仅支持"直接"交换(不是"主题"或"扇出").但这将在Kombu(http://github.com/ask/kombu)中得到支持.
我会认真考虑使用RabbitMQ.为什么你认为这不合适?恕我直言,我不会在其他地方找到这样的系统,(如果系统是暂时的,你可能不需要消息持久性,可能是ZeroMQ).
如果我像我所描述的那样使用芹菜,那么芹菜是否会让我的生活变得困难?
我从上面描述的内容中无法想到任何事情.由于并发模型是多处理的,它确实需要一些内存(我正在努力添加对线程池和事件池的支持,这在某些情况下可能有所帮助).
建议Celery是矫枉过正是有效的,但还有其他原因会让我的生活更轻松,所以我想考虑一下)
在那种情况下,我认为你轻易使用overkill这个词.这实际上取决于没有它需要编写多少代码和测试.我认为改进已有的通用解决方案会更好,理论上听起来它应该适合您的应用程序.