【问题标题】:CPF and task server in MarkLogic 8MarkLogic 8 中的 CPF 和任务服务器
【发布时间】:2016-05-23 15:37:28
【问题描述】:

我在插入和更新文档时创建了一个 CPF。这些 CPF 管道创建多个 xdmp:spawn-tasks 来执行各种任务。我对这种方法有几个疑问。

  1. 一些衍生的任务将修改原始文档。这会触发 CPF 的更新工作流程吗?我可以在文档上使用一个标志,表明它是衍生任务的更新。但是有没有更优雅的方法来做到这一点?
  2. 我需要担心死锁吗?我的意思是,如果从同一个 CPF 产生的两个任务尝试同时更新同一个文档,我该如何避免这种情况?

基本上,我正在尝试对插入的文档使用信封模式,并将所有工件文档包装到一个文档中。我使用 CPF 生成此工件文档的原因是,我可以使用 MLCP 或任何其他方式将文档转储到数据库中,并让 CPF 担心处理,而不是使用自定义 REST 端点并通过这个来获取所有文档自定义 REST 端点。

【问题讨论】:

  • 你为什么一开始就明确使用 spawn?为什么不将工作作为单独的管道步骤执行,让 CPF 负责编排呢?从您的解释中不清楚您要完成什么。
  • 我最初是在自己的 CPF 任务中做的,但是当我这样做时,我有时会出现内存不足的异常,因为我所做的事情之一是使用“xdmp: 从文档中提取文本:文档过滤器“......但是使用任务服务器我没有得到任何东西,因此产生了任务......而且我不认为原始文档的大小是问题......我最初假设内存没有被释放或其他东西...但是任务一切正常
  • xdmp:document-filter 允许流式传输结果,因此不一定需要消耗大量内存。不过,过滤可能是一个繁重的过程。可能值得在 SO 上打开另一个问题以分享更多详细信息并询问您为什么会出现内存异常..

标签: marklogic marklogic-8


【解决方案1】:

我建议不要生成任务以将更新应用到手头的文档。这样的更新会干扰 CPF 状态的自然流动。 CPF 本身的设计目的是让一个文档经历多个状态,并让每个转换都对整个转换做出贡献。

因此,让文档经历多个 CPF 状态,并在多个此类状态转换(管道)中进行更新。每个状态转换都已经是一个单独的事务,因此无需派生任务。

我认为您不必担心死锁,但我可以轻松想象并行执行更新会导致部分更新丢失,因为它们可能会被彼此覆盖。这取决于您使用的确切代码。 MarkLogic 的事务机制通常可以防止这种情况发生,但很容易编写绕过该机制的代码。

HTH!

【讨论】:

  • 实用阅读:Preventing Deadlocks
  • 我最初是在自己的 CPF 任务中做的,但是当我这样做时,我有时会出现内存不足的异常,因为我所做的事情之一是使用“xdmp:从文档中提取文本:文档过滤器“......但是使用任务服务器我没有得到任何东西,因此产生了任务......而且我不认为原始文档的大小是问题......我最初假设内存没有被释放或其他东西...但是任务一切正常..
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多