【发布时间】:2014-10-28 18:12:40
【问题描述】:
我有一个 MarkLogic 7 数据库,其中插入了几个文档,每个文档都有自己的 created-on 和 released-on。例如,如果一个文档在 1400 小时插入到数据库中,并且其 released-on 值为 1700 小时,那么我需要将此文档发布到外部 REST 服务1700 小时。
我尝试了以下选项:
-
配置一个 CPF 管道,这样每当插入一个文档时,它的
released-on值就会被读取,并创建一个 计划任务 以根据从released-on读取的时间戳值触发。以下是对这种方法的查询/观察:
由于管理配置操作 API 不是受事务保护的操作,我需要强制锁定某些 URI,以便从并行运行的 CPF 操作模块中创建计划任务。 详情read here
当我插入 1000 个文档时,CPF 操作模块需要大约 20 分钟来触发和创建 1000 个基于计划的任务在从插入的文档中读取的
released-on值上。-
如何根据从文档中读取的
released-on值将触发 CPF 操作模块的文档的 URI 传递给从 CPF 操作模块中创建的计划任务?
-
配置一个 CPF 管道,这样每当插入一个文档时,它的
released-on值就会被读取,并且xdmp:sleep()在当前日期时间和released-on的值之间剩余的毫秒数内被调用文件。以下是对这种方法的查询/观察:
触发 CPF 操作模块的任务服务器线程保持占用状态,并且在从其中调用
xdmp:sleep()时不会释放,因此在任何时候都会为最多 16 个文档和其他文件触发 CPF 操作模块留在队列中。有什么方法可以将睡眠线程配置为非活动状态,并让其他排队的操作模块被触发,当睡眠持续时间过去后,它会再次变为活动状态?
-
按照here 的描述配置一个多步 CPF 管道,在该管道中,文档一直在两个状态之间来回切换,直到
released-on时间戳到达。以下是对这种方法的查询/观察:
- 即使插入 30 个文档,观察到的 CPU 利用率仍为 100%
在所有尝试中,即使对于 1000 个文档,也会使用大量系统资源(CPU 和 RAM)。我需要找到一种可以满足 100K 文档的方法。
如果上述方法可以进行任何改进,或者 MarkLogic 提供了一些其他方法来有效处理此类情况,请告诉我。
【问题讨论】:
-
我认为选项 2 和 3 只会给您带来问题。一个更好的问题是为什么创建 1000 个计划任务需要 20 分钟?您是否为所有插入的文档使用相同的 URI 锁定?将日志级别设置为调试,并检查错误日志中的 DEADLOCK 消息。这应该让您了解您的性能问题是否与锁定有关。
-
@wst:是的,我使用相同的 URI 锁定:使用
xdmp:lock-for-update("/sample.xml")完整的 CPF 操作模块已发布 here -
插入 1000 个全部锁定在同一个 URI 上的文档听起来像是您的问题。使用插入文档的唯一 URI;然后所有其他任务可以并行运行。或者,查看多语句事务,它可以在单独的事务中串行执行表达式。
-
@wst 我尝试锁定使用
xdmp:lock-for-update($cpf:document-uri)触发CPF 操作模块的文档uri,但在这种情况下,当我并行插入多个文档时,所有文档都会触发CPF 操作模块但只有一个计划任务被创建。更多read here -
啊,我明白了。我仍然怀疑问题可能是太多进程争夺该锁。您可以返回到您的单 URI 锁,让 CPF 作业
xdmp:spawn实际执行任务。那么您最多会有 N(N = 任务服务器线程)任务竞争锁,而不是全部 1000。将 N 减少到 2 或 1,您可能会得到改进。值得一试。