【问题标题】:Listening to Neo4j Lucene index changes监听 Neo4j Lucene 索引变化
【发布时间】:2016-03-11 08:33:40
【问题描述】:

我有一个嵌入式 Neo4j 2.3.2 数据库的 HA 设置,它使用旧版 Lucene 索引来存储数据。我现在希望能够监听该索引中的更改,以便仅在索引更改时才能将更改推送到客户端。

因为这是一个 HA 设置,更改索引的事务可能不在进行轮询的机器上,所以如果我理解正确,我无法仅使用 TransactionEventHandler 来解决这个问题。

有没有其他方法可以在不重复查询索引的情况下监控 Lucene 索引的变化?

理想情况下,我只需注册一个索引回调,当索引更改时会触发该回调,但我还没有从 Lucene 或 Neo4j 中找到这样的方法。此外,我一直在尝试从 Neo4j 访问 Lucene 索引,但只能到达从 gds.index().forNodes("myIndex") 返回的 org.neo4j.kernel.impl.coreapi.LegacyIndexProxy[Node]

让服务器每秒为每个连接的客户端查询索引以获取更新似乎在某些时候会变得非常占用 CPU。

【问题讨论】:

    标签: neo4j lucene


    【解决方案1】:

    修正

    tx 侦听器将在发起交易的机器上调用,该机器可以是主机(并且应该是),但如果您在从机上启动 tx,则会在那里调用 tx-listener。

    Afaik 目前无法直接监控 Lucene 更改。

    你想检测/推送什么样的变化?

    【讨论】:

    • 例如当一个新的项目被添加到主节点上的索引时,并且从节点上有来自客户端的长轮询。我想知道从节点上的新项目最好在主节点(通过 HA 进程)将更改推送到从节点的同时,以便从节点可以在长轮询连接上发送新数据。在我的 HA 设置中,主节点获取所有的 setter,而从节点处理 getter。所以实际上我想在从机上监控的索引的每一次更新都是通过从主机到从机的 HA 推送来完成的。
    • 为什么?在应用索引更新之前阻止您的读取?您也可以只使用粘性会话/事务并将更新值的读取发送到主服务器。
    • 假设我有两个客户端:client1、client2 和三个服务器 nodeMaster、nodeSlave1 和 nodeSlave2。现在 client1 和 client2 想要保持同步,所以他们都分别对 nodeSlave1 和 nodeSlave2 进行了长轮询。现在 client1 使用写入 nodeMaster 的 PUT“示例”进行更新,并更新索引。 HA 进程然后将更改推送到两个从站。现在为了让 client2 尽可能快地同步,我想知道 nodeSlave1 上的索引何时更改以将“示例”值返回给 client2。在集群中,无法保证两个客户端都是长轮询nodeMaster。
    • 我推荐的设置是:neo4j.com/docs/stable/ha-haproxy.html - “如果您能够在应用程序中区分写入请求和只读请求,那么您可以利用两个 (逻辑)负载均衡器:一种将所有写入发送到主服务器,另一种将所有只读请求发送到从服务器。”
    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2013-05-10
    • 2012-09-28
    相关资源
    最近更新 更多