如何在MarkLogic群集的所有节点上传播Task Server线程?

时间:2014-12-04 06:39:25

标签: marklogic

我在MarkLogic 7中有一个3节点集群。我创建了一个数据库“sample-db”,其中包含以下林:

  1. sample-db-01托管在 node-1
  2. sample-db-02托管在 node-2
  3. sample-db-03托管在 node-3
  4. 现在,从 qconsole 我运行以下FLWOR表达式:

    for $i in 1 to 20000
    return
      xdmp:spawn-function(function(){
          xdmp:document-insert(xs:string($i), <sample>{xdmp:host-name()}</sample>),
          xdmp:commit()
      }, 
      <options xmlns="xdmp:eval">
        <transaction-mode>update</transaction-mode>
      </options>)
    

    上述表达式在“sample-db”中插入20000个文档。 但是当我查看Task Server状态时,我可以看到只有 node-1 用于处理在Task Server中排队的任务。

    enter image description here

    是否有任何配置或代码更改,我可以让所有三个节点参与处理排队的任务?

    谢谢!

2 个答案:

答案 0 :(得分:3)

任务是特定于主机的。它们在调用xdmp:spawn的主机上产生。

您可以编写一个替换xdmp:spawn的REST服务并实现您自己的任务分发。或者找一些其他方法在所有主机上生成这些任务。

答案 1 :(得分:2)

我担心迈克是对的。 Spawns和evals总是与当前主持人竞争。根据您的潜在需求,还有其他方法可以解决这个问题。如果您有兴趣传播摄取负载,通过转换,您可以考虑使用MLCP。另一种方法是使用CPF或提交后触发器。这些操作针对管理文档最终所在的林的主机。

你也可以尝试在ML中创建一个自定义端点并对其进行http调用以使生成器在整个群集中传播,但我想我个人可能更喜欢我提到的其他替代方案之一。

HTH!