事务提交后由 Hibernate Search (HS) 进行异步索引

Asynchronous indexing by Hibernate Search (HS) after transaction commit

有搜索和更新数据的 REST 服务,由 Hibernate 和 HS 支持。 Lucene 索引有超过 150 万个文档并且还在增长。

问题:当服务将更新的数据保存到数据库中时 (session.commit()) - 同时 HS 执行数据索引,结果事务延迟提交(2-5 秒) - 因此 HTTP 响应被延迟数据更新请求。 REST 服务有很多方法,此服务存在的客户端期望在 AJAX 调用 returns 之后 - 数据可用于 'GET',因此在服务器上以异步方式提交事务side - 不是一个选项(POST 之后客户端将无法使用数据)。

我正在使用 hibernate.search.default.worker.execution=async,但此设置帮助不大(改进大约 1 秒)。原因是 HS 使用当前 session/thread 为 updated/created 文档收集数据,然后异步索引到 Lucene..

所以我的问题是: 1、有没有办法让HS异步到主执行线程进行数据计算?所以事务提交在数据收集时不会被冻结.. 2. 我认为使用 JMS 和 Master/Slave 解决我的问题不会有太大帮助,因为瓶颈不是索引本身 - 而是收集数据以索引?

目前没有这样的选项。

在类似的情况下,我设法优化了 Hibernate 的数据访问,因为 2-5 秒不是很令人印象深刻,例如查看二级缓存,使不必要的关系变得懒惰(而必要的关系变得急切)。切记永远不要使缓存关系变得急切,否则它不会使用缓存。

如果您是 Hibernate 的新手,请了解它可能经过优化以便在几毫秒内完成操作;我很感激您可能已经是专家并且拥有大量复杂的数据,当然,您可以通过优化获得的内容是有限的,然后查看不同的模式是公平的。

我们可以考虑制作一个完全异步的索引过程,但它非常复杂:在您终止当前事务后,我们将读取一个可能不一致的状态。一种解决方案是在新事务中重新读取整个对象图:提交事务后,在干净的会话中打开一个新事务并重新加载所有必要的数据。 这可能是一个有趣的选择,但您的服务器和数据库很可能会受到这种模式创建的所有额外工作的影响。

我已经将一些设计想法归档为 https://hibernate.atlassian.net/browse/HSEARCH-2364