所以我有一个通过主管运行芹菜工作者的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上运行,但我不确定以下内容:
任何帮助表示感谢,谢谢!
答案 0 :(得分:4)
您可以利用AWS弹性beanstalk服务,只需提供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,您可以遵循相同的路径,但唯一的好处是,如果将来逻辑变得太复杂,它可以在将来作为服务工作。