具有长时间等待状态的批处理与 BPMN 处理

Batch vs BPMN processing with long wait states

我正在处理一个 Java 项目 (Spring),我需要为一个相当复杂的场景创建批处理。有些步骤必须等待相当长的时间,例如20天。我不太确定,我应该如何处理这种情况。

我的第一个想法是在 BPMN 引擎(如 Camunda)中进行,其中等待状态是建模元素的一部分。考虑到需要处理的数据量,对于一个 运行 我最终会得到大约 250.000 个流程实例,并且在基于 BPMN 的处理的情况下,从性能的角度来看,这个数据量很重要。

另一种解决方案是采用专为批处理设计的框架,例如Spring批处理。在那种情况下,我的问题是漫长的等待状态。据我了解,Spring Batch 不支持等待状态。然而,我提出的每个解决方案草案都有一些局限性。

我会分批进行吗,可能会发生等待的步骤将停止,直到 20 天结束。这将阻止处理其余要处理的数据。我想我可以将给定的数据项标记为稍后处理,然后重新 运行 批处理直到处理完每个项目。这意味着我需要以线性方式布置处理的每个分支,并且步骤本身将只接受为它们标记的数据项。

我是否会为每个要处理的项目启动一个新的批处理作业,我需要一种机制来在给定点停止,然后从给定步骤恢复 job/step。一个自然的解决方案是创建一个更细粒度的作业系统,但我会丢失有关处理的上下文信息。

在这两种情况下,我最终都会将自己的 BPMN 解决方案实现为数据库中的状态机...

如果您能给我任何帮助或提示,我将不胜感激。提前致谢。

通过 BPM 实现它可以为您提供透明度、灵活性、更快的实施以及开箱即用的持久性和错误处理,最重要的是支持长期 运行 宁流程。我不同意性能问题。 250,000(每天?每月还是每 20 天?)对于 Camunda 来说并不多。您编写流程实例可能 运行 大约 20 天,但我看不出您启动这些 250,000 个作业的频率。如果它是一份商业日报 运行,您每月仍然只能处理 5,500,000 个实例。这不是问题。你应该考虑

  • 您需要什么历史水平。这里可能不需要完整,审计可能就足够了。
  • 批处理项目有多大以及它们将存储在哪里。将大型业务对象持久化为流程数据并不是一个好的设计。业务对象的简单 CRUD 服务会更好。从引擎访问瞬态过程数据时,您可以使用它们。 (好吧...如果对象不大并且我们每个月只谈论 250k 个实例,即使是简单的 JSON 序列化作为过程数据也可以做到。)
  • 您想将审核数据存储多长时间?相应地设置进程的 TTL。似乎 <30 天就足够了。

我也和我的技术主管讨论过这个问题,有几个反对 BPMN (Camunda) 的论据。

  1. 在有实例仍处于等待状态(例如 运行 个进程)的情况下,潜在进程更新的难度级别。
  2. 使用 BPMN 并可能解决缩放和性能问题可能与我们最初打算使用它的目的(简单的消息编排)相矛盾。

由于这些原因,决定采用 Spring 批处理,我们将业务批处理(如 activity 图表中所述,等待状态等)和技术处理批处理(Spring 批处理实现)。在这种情况下,每个步骤都可以获取当前上下文,执行操作并更新它。一个技术批次可能会处理当前计划处理的每个业务批次(例如,新创建的批次的数据以及所有等待状态今天过期的数据)。这也需要我们创建一个状态机;可能也支持并行执行(例如 Petri 网)。