0

工人和工作流之间的比率是多少以及如何管理线程以便工人和工作流数量之间不应该中断如果我启动更多数量的工作流,则会引发以下错误

没有足够的线程来执行工作流。如果此消息始终出现,则应减少 WorkerOptions.maxConcurrentWorklfowExecutionSize 或增加 WorkerOptions.maxWorkflowThreads。

处于阻塞状态的工作流在内存中保持活动状态??处于等待状态的工作流不断检查条件??更多处于等待状态的工作流将保持工作人员被占用??在下面的示例中,线程正在等待信号,工作流的数量被缩放到一百万/天,timetocloseWorkflow = 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;
 }

--

4

1 回答 1

1

工人和工作流之间的比率是多少以及如何管理线程以便工人和工作流数量之间不应该中断如果我启动更多数量的工作流,则会引发以下错误

没有这样的比率,因为阻塞的工作流根本不消耗工作内存(在它们被推出缓存之后)。因此,如果这些工作流程没有取得任何进展,则可能有数十亿个被阻止的工作流程和一个工作人员。

没有足够的线程来执行工作流。如果此消息始终出现,则应减少 WorkerOptions.maxConcurrentWorklfowExecutionSize 或增加 WorkerOptions.maxWorkflowThreads。

maxWorkflowThreads定义所有当前正在执行和缓存的工作流可以使用多少线程。

maxConcurrentWorklfowExecutionSize定义可以并行执行的工作流任务的数量。

“没有足够的线程来执行工作流”异常表示没有足够的线程来执行当前正在运行的工作流任务。例如,如果每个工作流使用两个线程并且maxConcurrentWorklfowExecutionSize为 100,那么maxWorkflowThreads应该至少为 200。使用这种设置 0,工作流将被缓存,因为所有线程都将被当前执行的工作流任务消耗。所以一般来说,保持maxWorkflowThreadsmaxConcurrentWorklfowExecutionSize支持缓存要好得多。

处于阻塞状态的工作流在内存中保持活动状态??

它保持缓存状态,直到另一个工作流需要取得进展并将缓存的工作流踢出。之后,被阻塞的工作流在接收到一些新事件(如计时器、信号或活动完成)时被加载到工作内存中。

处于等待状态的工作流不断检查条件??更多处于等待状态的工作流将保持工作人员被占用??

它仅在处理某些新事件时进行检查。当什么都没有发生时,检查不会被执行。

在下面的示例中,线程正在等待信号,工作流的数量被缩放到一百万/天,timetocloseWorkflow = 2 天。触发信号的平均时间是相应工作流程启动后的 1 天

假设工作人员可以跟上工作流任务的处理速度,这种情况应该可以正常工作。

于 2020-09-18T03:04:16.860 回答