当前位置: 首页 > 知识库问答 >
问题:

子工作流的输入非常大时出现超时异常

上官德寿
2023-03-14
16:37:21.945 [Workflow Executor taskList="PullFulfillmentsTaskList", domain="test-domain": 3] WARN com.uber.cadence.internal.common.Retryer - Retrying after failure
org.apache.thrift.transport.TTransportException: Request timeout after 1993ms
    at com.uber.cadence.serviceclient.WorkflowServiceTChannel.throwOnRpcError(WorkflowServiceTChannel.java:546)
    at com.uber.cadence.serviceclient.WorkflowServiceTChannel.doRemoteCall(WorkflowServiceTChannel.java:519)
    at com.uber.cadence.serviceclient.WorkflowServiceTChannel.respondDecisionTaskCompleted(WorkflowServiceTChannel.java:962)
    at com.uber.cadence.serviceclient.WorkflowServiceTChannel.lambda$RespondDecisionTaskCompleted$11(WorkflowServiceTChannel.java:951)
    at com.uber.cadence.serviceclient.WorkflowServiceTChannel.measureRemoteCall(WorkflowServiceTChannel.java:569)
    at com.uber.cadence.serviceclient.WorkflowServiceTChannel.RespondDecisionTaskCompleted(WorkflowServiceTChannel.java:949)
    at com.uber.cadence.internal.worker.WorkflowWorker$TaskHandlerImpl.lambda$sendReply$0(WorkflowWorker.java:301)
    at com.uber.cadence.internal.common.Retryer.lambda$retry$0(Retryer.java:104)
    at com.uber.cadence.internal.common.Retryer.retryWithResult(Retryer.java:122)
    at com.uber.cadence.internal.common.Retryer.retry(Retryer.java:101)
    at com.uber.cadence.internal.worker.WorkflowWorker$TaskHandlerImpl.sendReply(WorkflowWorker.java:301)
    at com.uber.cadence.internal.worker.WorkflowWorker$TaskHandlerImpl.handle(WorkflowWorker.java:261)
    at com.uber.cadence.internal.worker.WorkflowWorker$TaskHandlerImpl.handle(WorkflowWorker.java:229)
    at com.uber.cadence.internal.worker.PollTaskExecutor.lambda$process$0(PollTaskExecutor.java:71)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

我们的父工作流代码基本上是这样的(JSON 对象来自组织.

JSONObject[] array = restActivities.getArrayWithHugeJSONItems();
for(JSONObject hugeJSON: array) {
  ChildWorkflow child = Workflow.newChildWorkflowStub(ChildWorkflow.class);
  child.run(hugeJSON);
}

我们发现,在大多数情况下,父工作流工作者无法启动子工作流,并抛出上面的超时异常。它疯狂地重试,但从未成功,并一遍又一遍地打印超时异常。然而,有时我们非常幸运,它的工作。有时在活动工作器上它甚至更早就失败了,它抛出同样的异常。我们认为这是由于数据太大(大约5MB ),无法在超时时间内发送(从日志判断,我们猜测设置为2s)。如果我们用少量虚假数据调用< code>child.run,它100%有效。

我们使用子工作流的原因是我们想使用Async.function来并行运行它们。那么我们如何解决这个问题呢?我们应该增加节俭超时配置吗?或者我们可以避免传递大量数据?

提前感谢!

---Maxim回答后更新---

谢谢你。我阅读了示例,但对我的用例仍有一些疑问。假设我的RestActivitiesWorker中有一个由100个巨大的JSON对象组成的数组,如果我不应该将这个巨大的数组返回给工作流,我需要对数据库进行100次调用,以创建100行记录,并将100个id放入一个数组中,并将其传递回工作流。然后,工作流为每个id创建一个子工作流。然后,每个子工作流调用id为的另一个活动,从数据库中加载数据。但是该活动必须将那个巨大的JSON传递给子工作流,这样可以吗?对于向数据库中插入100个数据的RestActivitiesWorker来说,如果中途失败了怎么办?

我想归根结底,我们的工作流正试图直接使用巨大的JSON。我们正在尝试将巨大的JSON(5-30MB,不是那么大)从外部系统加载到我们的系统中。我们稍微分解了JSON,操作了一些值,并使用几个字段中的值来执行一些不同的逻辑,最后将其保存在数据库中。我们应该如何使用Temporal?

共有1个答案

凤高翰
2023-03-14

Temporal/Cadence不支持将大型blobs作为输入和输出进行传递,因为它使用DB作为底层存储。因此,您需要改变应用程序的架构来避免这种情况。

标准的解决方法是:

  • 使用外部blob存储保存大数据,并将引用作为参数传递给它
  • 将数据缓存在工作进程中,甚至主机磁盘上,并将操作此数据的活动路由到该进程或主机。有关此方法,请参阅文件处理示例
 类似资料:
  • 我正在尝试从服务器下载PPT文件。它以字节为单位。 但在调试时,我注意到输入流在运行时抛出FileNotFound异常。该文件确实存在于服务器上,这是我的代码,如果有任何帮助,我们将不胜感激。 我在Mac上使用Charles(类似于windows上的fiddler)来查看我从服务器发送和接收的内容。服务器不会返回任何错误,尽管它显示下载步骤6-7秒,下载大约400字节,然后停止。 从输入流行引发异

  • 2.)AVD没有互联网问题(原因稍后解释)。 3.)与我的volley singleton类或请求队列无关(原因稍后解释)。 所以我想我在Volley/Request Future的用法上犯了某种错误。

  • 我正在尝试编写一段代码来索引搜索一个值,如果它存在于数组中。以下是代码的样子: 每次我运行代码时,在将值输入数组时,它都会给我这个空指针异常:线程“main”java中的异常。lang.NullPointerException:无法存储到int数组,因为在indexSearch处“[]”为null。main(indexSearch.java:22) 为什么会这样,我该如何修复它?

  • 我试图在运行在Android中的SubscriptionClient实例上调用RegisterMessageHandler方法。 在将消息发布到特定主题(通过自动测试)20秒左右之后,我在我的Android应用程序中收到了几个超时异常,该应用程序实际上包含了SubscriptionClient实例的RegisterMessageHandler。 输出窗口 这里有个错误: **System.Time

  • 我在非GUI模式下为100个并发用户运行了一个脚本 我在运行期间保存了生成的 JTL 文件 运行完成后,我在查看结果树侦听器中加载了JTL文件,我可以看到如下错误: 响应代码: 非 HTTP 响应代码: 套接字超时异常 响应消息: 非 HTTP 响应消息: 读取超时 响应代码:非HTTP响应代码:Java . net . connect异常响应消息:非HTTP响应消息:连接超时:连接 我的JMet