创建索引器时文件系统锁定

时间:2019-04-10 06:28:44

标签: lucene spring-data-jpa microservices hibernate-search

我使用了hibernate-search,在其中用@Indexed@Field以及更多注释了域。 我的项目基于多种微服务,例如

  1. 搜索服务-开始从DB读取数据并创建索引时。 (以下提到了代码):
@Transactional(readOnly = true)
public void initializeHibernateSearch() {
    try {
        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(centityManager);
            fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
  1. MicroService 1-在插入或更新任何域时更新索引。

我面临的问题是启动Search Service并创建索引时,它将获取索引文件上的锁,而从不释放锁。 并且当微服务1尝试在插入或更新时更新索引时,它会引发如下异常

  

org.apache.lucene.store.LockObtainFailedException:另一个程序持有的锁:/root/data/index/default/Event/write.lock           在org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:118)           在org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41)           在org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45)           在org.apache.lucene.index.IndexWriter。(IndexWriter.java:776)           在org.hibernate.search.backend.impl.lucene.IndexWriterHolder.createNewIndexWriter(IndexWriterHolder.java:126)           在org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter(IndexWriterHolder.java:92)           在org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriter(AbstractWorkspaceImpl.java:117)           在org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriterDelegate(AbstractWorkspaceImpl.java:203)           在org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:81)           在org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:46)           在org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.applyChangesets(SyncWorkProcessor.java:166)           在org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.run(SyncWorkProcessor.java:152)           在java.lang.Thread.run(Thread.java:748)

请让我知道在微服务体系结构中使用休眠搜索的正确方法是什么。

1 个答案:

答案 0 :(得分:2)

有几种选择。我的建议是第一个,因为它最适合Micro服务的体系结构精神。

  1. 每个微服务都有一个独立的索引:不要共享索引目录。
  2. 使用in the docs中所述的主/从体系结构,以便将单个服务写入索引-其他服务将必须委托给单个写入器。可以通过基于网络的文件系统或使用Infinispan复制索引。
  3. 禁用 exclusive_index_use ,这是一种配置属性(在文档中也有介绍)。为了完整起见,我将其列出来,但这通常不是一个好主意。这将变得非常慢,并且您将要负责的是,一个服务正在忙于编写不会使另一服务需要写超时。