我有一个MarkLogic 7数据库,其中插入了多个文档,每个文档都有自己的created-on
和released-on
。例如,如果文档在 1400 小时插入数据库并且其released-on
值 1700 小时,那么我需要将此文档POST到外部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
时间戳到达为止。
以下是此方法的查询/观察:
在所有尝试中,即使是 1000 文档,也可以使用大量系统资源(CPU和RAM)。我需要找到一种能够满足100K文档的方法。
如果在上述方法中可以进行任何改进,或者MarkLogic提供了一些有效处理此类方案的其他方法,请告诉我。
答案 0 :(得分:2)
您可以设置一个预定的作业,而不是CPF,每隔10分钟运行一次,并查找准备发布的文档。该作业将查找released-on
值介于fn:current-dateTime()
和上次作业运行之间的文档,我将保存在数据库中。
对于每个文档,您将生成一个POST文档的任务,这样一个错误就不会导致其他文档出现问题。循环后,将当前时间保存在数据库中以供下次使用。
10分钟的窗口可以根据您的喜好大小,具体取决于您对延迟的容忍程度。