当芹菜工人从多个(或许多个)队列中撤离时,是否应该记住实质性的影响?例如,如果我的系统被设计成使工作人员从10到15个队列而不是仅仅1或2,那么是否会有显着的性能损失?作为后续行动,如果其中一些队列有时是空的怎么办?
关于队列限制的问题的简短回答是:
不用担心多个队列不会变得更糟或更好,代理被设计来处理大量的队列。当然,在很多用例中,你不需要这么多,除非是非常高级的用例。空队列不会产生任何问题,它们只是占用代理上的少量内存。
也不要忘记,您还有其他东西,例如交换和绑定,在那里您也没有真正的限制,但最好在使用它们之前了解它们各自的性能含义(TOPIC 交换将比直接交换使用更多的 CPU)以一个为例)
为了给您一个更完整的答案,让我们从更通用的角度来看看性能主题。
当研究像 Celery 这样基于消息传递的分布式系统时,从性能的角度来看有两个主要主题需要分析:
工人数量和并发因素。
您可能已经知道每个 celery Worker 都有一个并发参数,用于设置可以同时执行多少个任务,这应该根据服务器容量(CPU、RAM、I/O)进行设置,当然也基于特定消费者将执行的任务类型(取决于它将消费的队列)。
当然,根据您需要在特定时间窗口内执行的任务总数,您需要决定需要启动和运行多少个工作人员/服务器。
代理,是这种架构风格中的单点故障。
代理(尤其是 RabbitMQ)旨在毫无问题地管理数百万条消息,但是它需要存储更多消息,从而使用更多内存,并且需要更多消息来路由更多 CPU。
这台机器也应该进行良好的调整,如果可能的话,应保持高可用性。
当然,要避免的主要事情是消息的消耗速度低于其产生速度,否则您的队列将不断增长,并且您的 RabbitMQ 将爆炸。在这里您可以找到一些提示。
在某些情况下,您可能还需要增加在特定时间范围内执行的任务数量,但仅是为了响应请求峰值。这种架构的好处是,您可以监视队列的大小,当您了解队列的大小增长得很快时,您可以使用已配置的 celery 工作线程动态创建新机器,然后在不需要时将其关闭。这是一种相当节省成本且高效的方法。
一点提示,记住不要将 celery 任务结果存储在 RabbitMQ 中。