创建Indexer时FileSystem锁定

问题描述 投票:0回答:1

我使用了hibernate-search,其中我用@Indexed@Field等注释了域名。我的项目基于多个微服务

  1. 搜索服务 - 在开始从数据库读取数据并创建索引时。 (代码已在下面提到):
@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:由org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:118)处的其他程序持有的锁:/root/data/index/default/Event/write.lock org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41)位于org.apache.lucene.index.IndexWriter的org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45)。(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)at org。 hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:81)在org.hiberna在org.hibernate的org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.applyChangesets(SyncWorkProcessor.java:166)的te.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:46)。 java.lang.Thread.run中的search.backend.impl.lucene.SyncWorkProcessor $ Consumer.run(SyncWorkProcessor.java:152)(Thread.java:748)

能告诉我在微服务架构中使用hibernate-search的正确方法吗?

lucene spring-data-jpa microservices hibernate-search
1个回答
2
投票

有几种选择。我的建议是第一个,因为它最符合微服务的架构精神。

  1. 每个微服务都有一个独立的索引:不共享索引目录。
  2. 使用描述in the docs的主/从体系结构,因此要将单个服务写入索引 - 其他服务必须委托给单个编写器。索引可以通过基于网络的文件系统或使用Infinispan进行复制。
  3. 禁用exclusive_index_use,一个配置属性(也在文档中描述)。我列出了这个完整性,但这通常是一个坏主意;它会慢得多,一个服务繁忙写入不会超时另一个需要写入的服务是你的责任。
© www.soinside.com 2019 - 2024. All rights reserved.