我需要详细地解释这些事情,才能理解所有这些事情之间的关系.
Supervisor的存在源于一些简单的设置.最重要的一次是:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work
autostart=true
autorestart=true
numprocs=8
这里最重要的设置是numprocs=8
,它说的是supervisor the manual:
Supervisor将启动与Numpros指定的相同数量的此程序实例.请注意,如果number pros>;1,则PROCESS_NAME表达式中必须包含%(PROCESS_NUM)s(或包含PROCESS_NUM的任何其他有效的Python字符串表达式).
运行名为artisan queue:work
的程序的Supervisor的这种配置将创建8个artisan queue:work
的实例(进程、工作进程等).这意味着可以处理8个作业(job)simultaneously个,不多也不少.
Horizon并不是define比numprocs
,你唯一需要知道的重要设置是stopwaitsecs=3600
.这应该始终远远大于作业(job)在整个应用程序中运行的最大时间.在这里,绝对最大时长将是60分钟.
现在,Horizon提供了balancing strategy,您可以在其中定义进程(工作进程)的最小和最大数量以及它的策略
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
Horizon在这里提供的是根据队列中存在的工作量来扩展或缩减进程(工作进程)的数量.
如果您定义如下所示的主管配置:
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'events', 'xls', 'whatever'],
'balance' => 'auto',
'minProcesses' => 10,
'maxProcesses' => 40,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 3,
],
],
],
然后,所有4个队列default
、events
、xls
和whatever
都在相同的条件下运行,总共将有40个工作进程可用,最少有10个.因此,not每个队列有40个工作进程可用,但所有队列加在一起有40个工作进程可用.
这里的关键点是让每个队列有一个良好的规模以最佳方式工作,关键是将它们划分为不同的类别,例如
- 每项作业(job)大约需要1到5秒.
- 每项作业(job)大约需要5到30秒.
long-load
->;每个作业(job)最多需要5分钟.
- 每项作业(job)花费的时间超过5分钟,最长可达1小时.
如果您最终只有两个方案,如short-load
和long-load
,那么您将有两种Horizon配置,以这种方式定义Supervisor将以多快的速度响应生成新的Worker,以及如果作业(job)失败,它将try 重复作业(job)的次数(在这种情况下,您非常不希望try 在59分钟3次后每次都失败的作业(job)).
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'events'],
'balance' => 'auto',
'minProcesses' => 10,
'maxProcesses' => 40,
'balanceMaxShift' => 10,
'balanceCooldown' => 1,
'tries' => 3,
],
'supervisor-long-run' => [
'connection' => 'redis',
'queue' => ['xls', 'whatever'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 1,
],
],
],
在你问的最后一条 comments 中
我想了解你做的所有计算,它的公式是什么
公式是,1个Supervisor实例可以有多个队列,并且所有这些队列都有最大数量的可用工作线程.队列是not个同样重要的队列,但是放置在这些队列in a certain amount of time is中的amount个作业(job)(以及作业(job)的种类).
Example:个
每分钟产生120个作业(job)的4个队列,需要x
个工人来处理.如果您放大(或缩小)工作线程(进程)的数量,则处理所有这些作业(job)直到队列为空所需的时间与您提供的可用工作线程数量有关.
- 如果您有10个可用的工作人员,则将同时处理10个工作.
- 如果您有120个可用的工人,那么将同时处理120个工作.
如果一个作业(job)需要10秒才能完成(例如,平均值),并且平均有120个作业(job)被放入一个队列,则需要each分钟.如果您希望在one分钟内处理(清除队列)所有作业(job),则每个作业(job)需要120 jobs*10 seconds/60 seconds立即=在1分钟内完成所有这些作业(job)所需的工人(进程)数量.
因此,是的,你可以将员工数量扩大到64512人或24890人.这一切都回到了问题how much load can your hardware handle.
希望这是有意义的.
明天我将仅使用工作进程、进程或实例来清理文本.真是一团糟.)