如何优雅地使用Lucene NRT Reader / Writer终止进程?

时间:2012-01-25 05:54:06

标签: lucene lucene-nrt

我们正在使用Lucene的近实时搜索功能在我们的应用程序中进行全文搜索。由于提交成本很高,所以我们承诺在每10个文档添加后进行索引(我们预计每小时大约需要150到200个文档进行索引)。现在,如果我想终止我的进程,如何在进程被终止之前确保内存中的所有文档都被提交到磁盘?这里有推荐的方法吗?或者我的文档量太少而无法理解,我是否应该每次添加它?

我应该跟踪所有未提交的文件吗?如果进程在提交到磁盘之前被杀死,那么我应该在进程启动时再次索引这些未提交的进程吗?

Lucene NRT用于运行嵌入式Jetty的进程。是否正确的方法是将一个shutdown命令(调用一些servlet)发送到jetty并等待所有文件都提交然后使用System.exit()终止?

1 个答案:

答案 0 :(得分:0)

您可以添加一个钩子来提交servlet的destroy方法中的所有缓冲文档,并确保在调用System.exit之前关闭嵌入式servlet容器(可能通过添加shutdown hook到JVM)。

但这仍然不完美。如果您的进程被终止,则所有缓冲的数据都将丢失。另一种解决方案是使用软提交。软提交是廉价提交(不执行fsync),因此如果您的进程被终止,数据不会丢失(但如果服务器意外关闭,数据仍可能丢失)。

总结一下:

  • 关闭钩子
    • 最佳吞吐量
    • 如果进程被杀,数据可能会丢失
  • 软提交
    • 如果进程被杀,则不会丢失任何数据
    • 如果服务器意外关闭,
    • 数据可能会丢失
  • 硬提交(默认)
    • 完全没有数据丢失
    • 慢(需要执行fsync)