Блокировка файловой системы при создании индексатора - PullRequest
0 голосов
/ 10 апреля 2019

Я использовал hibernate-search, где я пометил домены @Indexed, @Field и многими другими.Мой проект основан на нескольких микросервисах, таких как

  1. Search Service - которые при запуске читают данные из БД и создают индексы.(код был упомянут ниже):
@Transactional(readOnly = true)
public void initializeHibernateSearch() {
    try {
        FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(centityManager);
            fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
MicroService 1 - обновляет индекс при вставке или обновлении любого домена.

Проблема, с которой я сталкиваюсь, заключается в том, что при запуске Search Service и создании индексов он берет блокировкииндексные файлы и никогда не снимает блокировки.и когда Microservice 1 пытается обновить индекс при вставке или обновлении, он выдает исключение, как показано ниже

org.apache.lucene.store.LockObtainFailedException: блокировка, удерживаемая другой программой: / root / data /index / default / Event / write.lock at org.apache.lucene.store.NativeFSLockFactory.obtainFSLock (NativeFSLockFactory.java:118) в org.apache.lucene.store.FSLockFactory.obtainLock (FSLockFactory.java:41) в орг.apache.lucene.store.BaseDirectory.obtainLock (BaseDirectory.java:45) в org.apache.lucene.index.IndexWriter. (IndexWriter.java:776) в org.hibernate.search.backend.impl.lucene.IndexWriterNewdec.index(IndexWriterHolder.java:126) в org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter (IndexWriterHolder.java:92) в org.hibernate.search.backend.impl.lucene.AxWorksIceI (: 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.LuceneBackenduehue.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.applyChangesets (SyncWorkProcessor.java:166) в org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.run (SyncWorkProcessg) jj.Thread.run (Thread.java:748)

Не могли бы вы сообщить, как правильно использовать поиск в режиме гибернации в архитектуре микросервисов.

1 Ответ

2 голосов
/ 10 апреля 2019

Есть несколько вариантов.Моя рекомендация - первая, так как она лучше всего соответствует архитектурному духу микро-сервисов.

  1. Каждый микро-сервис имеет независимый индекс: не разделяйте каталог индекса.
  2. Использованиеархитектура master / slave описана в документах , поэтому для записи в индекс одной службы - другие службы должны будут делегировать эту запись.Индексы можно реплицировать по сетевой файловой системе или с помощью Infinispan.
  3. Отключить exclusive_index_use , свойство конфигурации (также описанное в документации).Я перечисляю это для полноты, но это вообще плохая идея;это будет намного медленнее, и вы будете нести ответственность за то, что одна занятая служба записи не остановит работу другой службы, нуждающейся в записи.
...