Java 设计模式 (Orchestration/Workflow)

Java Design Pattern (Orchestration/Workflow)

我需要在事件发生后自动化工作流程。我确实有 CRUD 应用程序的经验,但没有 Workflow/Batch 处理方面的经验。在设计系统方面需要帮助。

要求

工作流程涉及 5 个步骤。每一步都是一个 REST 调用并且依赖于上一步。 步骤 EX:(VerifyIfUserInSystem、CreateUserIfNeeded、EnrollInOpt1、EnrollInOpt2、..)

我的思路是维持2个DB Tables

  1. WORKFLOW_STATUS Table 其中包含像这样的列 (外键(指主table),工作流状态:(NEW,INPROGRESS,FINISHED,FAILED),完成步骤:(STEP1,STEP2,..),处理时间,..)

  2. EVENT_LOG Table 维护特定记录的 Events/Exceptions 轨迹 (外键、STEP、ExceptionLog)

问题

#1。这是编排系统的正确方法吗(不是那么复杂)?

#2。由于这些步骤涉及 REST 调用,我可能必须在服务不可用时停止进程并在稍后的时间点恢复进程。我不确定应该进行多次重试,以及如何在将其标记为失败之前保持尝试次数。 (猜测在 WORKFLOW_STATUS table 中创建另一个名为 RETRY_ATTEMPT 的列并在将其标记为失败之前设置一些限制)

#3 EVENT_LOG Table 是正确的设计吗?我应该为异常日志使用什么数据类型(clob 或 varchar(2048))?每 step/retry 次尝试都将作为新记录插入此 table。

#4 如何在依赖服务备份后 reset/restart 失败条目。

如果有的话,请告诉我 blogs/videos/resources。 提前致谢。

您是否考虑过使用像 Netflix 的 Conductor 这样的工作流编排引擎? docs, Github.

Conductor 内置了许多您正在寻找的功能。

这是一个使用两个连续 HTTP 请求(其中第二个请求来自第一个请求的响应)的示例工作流:

输入提供一个 IP 地址(和一个 Accuweather API 密钥)

{
  "ipaddress": "98.11.11.125"
}
  1. HTTP 请求 1 定位 IP 地址的邮政编码。

  2. HTTP 请求 2 使用 ZipCode(和 apikey)报告天气。

此工作流的输出是:

{
  "zipcode": "04043",
  "forecast": "rain"
}

您的问题:

  1. 我会使用像 Conductor 这样的编排工具。
  2. 这些任务中的每一个(在 Conductor 中定义)都内置了重试逻辑。您的实现方式将因预期时间等而异。因为我在这里调用的 2 APIs 是 public (而且相对较快),我不会在重试之间等待很长时间:
 "retryCount": 3,
 "retryLogic": "FIXED",
 "retryDelaySeconds": 5,

在连接内部,您可以调整更多参数:

          "connectionTimeOut": 1600,
          "readTimeOut": 1600

如果需要,还有指数重试逻辑。

  1. 事件日志存储在 ElasticSearch 中。
  2. 您可以为所有工作流程构建 error pathways

我在名为“Stack_overflow_sequential_http”的 Conductor Playground 中启动并 运行 设置了此工作流。创建一个免费帐户。 运行 工作流 - 单击“运行 工作流,select “Stack_overflow_sequential_http” 并使用上面的 JSON 来查看它的运行情况。

get_weather 连接非常 慢API,因此在成功之前可能会失败几次。复制工作流程,并尝试调整超时值以提高成功率。

您描述的 Enterprise Integration Pattern with enrichments/transformations from REST calls and stateful aggregation of the results over time (consequently meaning many such flows may be in progress at any one time). Apache Camel 正是为这些场景设计的。

What exactly is Apache Camel?