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

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

上官德寿
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

  • 我的项目使用apache超文本传输协议客户端向超文本传输协议服务器发送超文本传输协议请求。但是奇怪的事情发生了。我设置连接超时为10秒,套接字超时为10秒。对于每一天,大多数请求时间(大约100个请求)是100ms-200ms,但是左(大约10个请求)将抛出连接超时异常,这意味着连接建立时间是10s以上。我不知道发生了什么。 我的电话是: HttpUtils。post(主机,空,参数,“UTF-8