在AWS上监控和扩展基于Docker的Celery工人集群



所以我有一个docker镜像,它通过主管运行一个芹菜工人,并且在单个docker Elastic Beanstalk上运行得很好(相当长的任务,所以是acks late = trueconcurrency = 1prefetch multiplier = 1)。

问题是,我想根据工作人员的有效任务负载来扩展实例,而EB只允许整体网络和CPU负载。

添加一个规则来放大CPU负载是可以的,但我不能保证EB在执行任务时不会决定缩小。这将触发docker stop,并有效地杀死任何不能很快完成的芹菜(如果我没有错的话,10秒)。

理想情况下,我需要一个基于CPU活动和队列中任务的监视器,在伪代码中,比如:

while check interval has passed if task queue is empty (or workers are not busy) if running instances is greater than 1 scale down 1 instance else if CPU load is higher than threshold scale up 1 instance

现在的问题是,这种级别的逻辑在EB中似乎无法实现,更可能在ECS上运行,但我不确定以下内容:

  • 我们应该实现什么样的芹菜监视器,代码应该在哪里运行?例如,通常的celener-worker-monitor命令似乎不是监控工作人员繁忙程度的好解决方案,我们需要处理在docker中运行工作人员的额外复杂性
  • 集群缩放函数应该在哪里运行?在与AWS工程师交谈后,AWS Lambda似乎是一个潜在的解决方案,但将集群实例负载报告挂接到Lambda片段似乎相当复杂,很难维护
  • 另外一个问题是,如果我们需要迁移到ECS,我们还需要重写部署脚本来手动触发版本交换,因为这目前由EB管理。最好的方法是什么

感谢任何帮助,谢谢!

您可以利用AWS弹性豆茎服务,只需提供docker图像。它还配有仪表板,您可以在其中提供环境变量,或根据CPU/请求/内存等扩展应用程序/工作程序。

你已经为你的芹菜工人制作了码头工人的照片。所以,不要在CPU或内存上进行缩放。您可以根据队列中的多个任务来扩展实例。您可以自己设置缩放约束。

以下是对队列中的芹菜任务进行计数的不同方法。选择在任务队列中放置监视的选项。

使用鼠兔:

import pika
pika_conn_params = pika.ConnectionParameters(
    host='localhost', port=5672,
    credentials=pika.credentials.PlainCredentials('guest', 'guest'),
)
connection = pika.BlockingConnection(pika_conn_params)
channel = connection.channel()
queue = channel.queue_declare(
    queue="your_queue", durable=True,
    exclusive=False, auto_delete=False
)
print(queue.method.message_count)

使用PyRabbit:

from pyrabbit.api import Client
cl = Client('localhost:55672', 'guest', 'guest')
cl.get_messages('example_vhost', 'example_queue')[0]['message_count']

使用HTTP

语法:

curl -i -u user:password http://localhost:15672/api/queues/vhost/queue

示例:

curl -i -u guest:guest http://localhost:15672/api/queues/%2f/celery 

注意:默认vhost是/,需要作为%2f 进行转义

使用CLI:

$ sudo rabbitmqctl list_queues | grep 'my_queue'

现在,根据您选择的选项(CLI或Python),您可以应用以下解决方案来扩展您的芹菜工人。这两种逻辑的共同点是都需要连续运行。

如果选择CLI。您可以创建一个脚本,该脚本将持续监控任务数量,如果超过提供的限制,则应用缩放逻辑。如果您正在使用kubernetes,那么扩展部署将非常容易。否则,您将需要遵循您的系统所需的方法。

使用python,您可以遵循相同的路径,但唯一的优势是,如果逻辑在未来变得过于复杂,它可以在未来作为服务工作。

相关内容

  • 没有找到相关文章

最新更新