所以我有一个docker镜像,它通过主管运行一个芹菜工人,并且在单个docker Elastic Beanstalk上运行得很好(相当长的任务,所以是acks late = true
、concurrency = 1
和prefetch 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,您可以遵循相同的路径,但唯一的优势是,如果逻辑在未来变得过于复杂,它可以在未来作为服务工作。