工作人员与工作流程之间的比率以及如何进行管理 线程,以便在工作人员和工作流程数量之间不会出现中断 如果我启动更多的工作流程,则会引发以下错误
没有足够的线程来执行工作流。如果此消息始终出现,则应减小WorkerOptions.maxConcurrentWorklfowExecutionSize或 WorkerOptions.maxWorkflowThreads增加了。
处于阻塞状态的工作流在内存中保持活动状态? 处于等待状态的工作流会不断检查条件是否更多处于等待状态的工作流数将使工作人员处于忙碌状态 在下面的示例中,线程正在等待信号, 工作流程的数量被缩放为百万/天,关闭工作流程的时间= 2天。 并且触发信号的平均时间是相应工作流程开始后的1天
public class TestWorkflowImpl implements TestWorkflow {
private static final Logger logger = LoggerFactory.getLogger(TestWorkflow.class);
private int counter = 0;
private final CounterPrintActivity cpa = Workflow.newActivityStub(CounterPrintActivity.class);
@Override
@WorkflowMethod
public String startWorkflow() {
Workflow.await(() ->counter >= 1000);
return "Complete";
}
@Override
public int getCurrentStatus() {
return counter;
}
@Override
public void setCount(int setNum) {
logger.info("In signal");
counter = counter+setNum;
}
-
答案 0 :(得分:1)
工作人员与工作流之间的比率是多少?如何管理线程,以便工作人员与工作流数目之间不会出现中断?如果启动更多工作流,则会引发以下错误
没有这样的比率,因为阻塞的工作流根本不占用工作者内存(在将它们推出缓存后)。因此,如果这些工作流程没有任何进展,那么可能有数十亿个阻塞的工作流程和一个工作人员。
没有足够的线程来执行工作流。如果此消息始终出现,则应减小WorkerOptions.maxConcurrentWorklfowExecutionSize或增加WorkerOptions.maxWorkflowThreads。
maxWorkflowThreads
定义了所有当前正在执行和缓存的工作流可以使用多少个线程。
maxConcurrentWorklfowExecutionSize
定义可以并行执行的工作流任务数。
“没有足够的线程来执行工作流”异常表示没有足够的线程来执行当前正在运行的工作流任务。例如,如果每个工作流程使用两个线程并且maxConcurrentWorklfowExecutionSize
为100,则maxWorkflowThreads
应该至少为200。使用这种设置,将缓存0个工作流程,因为当前执行的工作流程任务将消耗所有线程。因此,通常最好使maxWorkflowThreads
高于maxConcurrentWorklfowExecutionSize
以支持缓存。
处于阻塞状态的工作流在内存中保持活动状态?
它会一直保持缓存状态,直到另一个工作流程需要取得进展并把已缓存的工作流程逐出为止。之后,当阻塞的工作流收到诸如计时器,信号或活动完成之类的新事件时,它将被加载到工作人员内存中。
处于等待状态的工作流连续检查条件?处于等待状态的工作流程数量更多,将使工作人员忙于工作?
它仅在处理某些新事件时检查。如果什么也没发生,则不执行检查。
在下面的示例中,线程正在等待信号,工作流的数量缩放为百万/天,timetocloseWorkflow = 2天。并且触发信号的平均时间是相应工作流程开始后的1天
在假定工作人员可以跟上工作流任务处理速度的情况下,此方案应该可以很好地工作。