【问题标题】:MarkLogic - Is it possible to configure Weekly scheduler which runs every minute until the job completesMarkLogic - 是否可以配置每分钟运行一次的每周调度程序,直到作业完成
【发布时间】:2021-03-09 06:47:29
【问题描述】:

我们正在使用 MarkLogic v9.0-10.4

我们创建了 6 个调度程序(每个节点一个,6 个节点集群),每 1 分钟运行一次,并批量删除版本化文档。一批是 20000 个文档。这意味着它每分钟删除 120k 个文档。

现在我们想再次安排每周一次的活动。假设在上午 9 点。因此,每周星期六上午 9 点,这 6 个调度程序应该每 1 分钟运行一次,直到有版本化的文档。 (通常,调度程序需要 5-7 分钟来删除版本化文档)

【问题讨论】:

  • 如果有一个在上午 9 点启动的每周计划任务,它会选择所有版本的 URI,然后使用删除第一批的那些 URI 生成一个函数的执行。如果你关心间隔它可以睡一分钟。然后,如果还有剩余的 URI 要删除,它会使用剩余的 URI 生成另一个任务。当它用完 URI 时,它会停止产生更多工作。
  • 我试过这种方式,得到所有版本化的 uris(500 万),创建批次,一批 10k uris,现在我将这 10k uris 传递给删除它们的函数。将函数调用放在 xdmp:spawn-function 中,但似乎它正在按顺序运行,我没有看到队列大小增加

标签: marklogic


【解决方案1】:

使用这样的模块安装 URI /tasks/delete-versions.xqy:

declare variable $URIS external;
declare variable $BATCH-SIZE external;
declare variable $SLEEP external := 1000;
declare variable $MODULES-DB external;

let $head := fn:subsequence($URIS, 1, $BATCH-SIZE)
let $tail := fn:subsequence($URIS, $BATCH-SIZE + 1)
return (
  xdmp:log("deleting " || count($head) || " of " || count($URIS)),
  for $uri in $head  
  return xdmp:document-delete($uri),
  
  if (count($tail) gt 0) then 
    let $params := map:map() 
      => map:with(xs:QName("URIS") => xdmp:key-from-QName(), $tail) 
      => map:with(xs:QName("BATCH-SIZE") => xdmp:key-from-QName(), $BATCH-SIZE)
      => map:with(xs:QName("SLEEP") => xdmp:key-from-QName(), $SLEEP)
      => map:with(xs:QName("MODULES-DB") => xdmp:key-from-QName(), $MODULES-DB)
    let $options := map:map() => map:with("modules", $MODULES-DB)
    return 
      (xdmp:sleep($SLEEP), xdmp:spawn("/tasks/delete-versions.xqy", $params, $options))
  else ()
)

您可以按如下方式创建一个计划任务,每周计划一次,用您的逻辑替换 URIs 查询以选择要删除的版本,并指定安装递归删除模块的 Modules 数据库:

xquery version "1.0-ml";
let $uris := cts:uris("", (), cts:true-query())
let $modules-db := xdmp:modules-database()
return
  xdmp:spawn("/tasks/delete-versions.xqy", 
    map:map() 
      => map:with(xs:QName("URIS") => xdmp:key-from-QName(), $uris)
      => map:with(xs:QName("BATCH-SIZE") => xdmp:key-from-QName(), 20000)
      => map:with(xs:QName("SLEEP") => xdmp:key-from-QName(), 60000)
      => map:with(xs:QName("MODULES-DB") => xdmp:key-from-QName(), $modules-db),
    map:map() => map:with("modules", $modules-db)  
  )

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2013-11-09
    • 1970-01-01
    • 2018-02-23
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2018-11-30
    相关资源
    最近更新 更多