2016-09-01 6 views
0

Hibernate와 HS에 의해 지원되는 데이터를 검색하고 갱신하는 REST 서비스가있다. Lucene 지수는 150 만 개가 넘는 문서를 보유하고 있습니다.트랜잭션 커밋 후 Hibernate Search (HS)에 의한 비동기 색인화

문제점 : 서비스가 업데이트 된 데이터를 데이터베이스 ()로 유지하는 경우 HS가 데이터 인덱싱을 수행하는 것과 동일한 결과 트랜잭션이 지연 (2 ~ 5 초)되어 커밋 됨 - 데이터 업데이트 요청에 대해 HTTP 응답이 지연됩니다. REST 서비스는 많은 메소드를 가지고 있으며이 서비스를 위해 존재하는 클라이언트 측은 AJAX 호출이 리턴 된 후에 'GET'을 위해 데이터를 사용할 수 있으므로 서버 측에서 비동기식으로 트랜잭션을 커밋하는 것이 옵션이 아니라고 예상한다 (데이터 ' POST 직후 클라이언트에 사용할 수 없음).

나는 hibernate.search.default.worker.execution=async을 사용하고 있지만이 설정은별로 도움이되지 않습니다 (개선 효과는 약 1 초입니다). 그 이유는 현재 세션/스레드를 사용하여 업데이트/생성 된 문서에 대한 데이터를 수집하고 Lucene과 비동기 적으로 색인을 생성하는 것입니다.

내 질문은 입니다. 1. HS에 의한 데이터 계산을 비동기 적으로 수행 할 수 있습니까? 실행 스레드? 따라서 트랜잭션 커밋은 데이터 수집시 고정되어 있지 않습니다. 2. 병목 상태가 자체적으로 인덱싱하지 않기 때문에 마스터/슬레이브와 JMS를 사용하여 문제가 발생하면 병목 현상이 도움이되지 않을 것이라고 생각합니다.

답변

1

현재 이러한 옵션이 없습니다.

유사한 상황에서 2 ~ 5 초가 매우 인상적이지는 않습니다. 예를 들어 2 차 수준의 캐싱을 살펴보고 불필요한 관계를 게으른 (필요한 관계를 열망하는) 것처럼 Hibernate의 데이터 액세스를 최적화했습니다. 캐시 된 관계를 열망하지 못하게하거나 캐시를 사용하지 않도록하십시오.

당신이 Hibernate를 처음 사용하는 경우, 일 수도 있고일지도 모른다는 것을 알고 있기 때문에 몇 밀리 초 내에 작업을 수행 할 수 있습니다. 물론 이미 전문가 일 수도 있고 복잡한 데이터가 많을 수도 있습니다. 물론 최적화를 통해 얻을 수있는 것의 한계가 있으며 다른 패턴을 살펴 보는 것이 적절합니다.

완전히 비동기 색인 생성 프로세스를 생각할 수도 있지만 매우 복잡합니다. 현재 트랜잭션을 종료 한 후에는 잠재적으로 일관성없는 상태를 읽게됩니다. 해결책은 새로운 트랜잭션에서 전체 객체 그래프를 다시 읽는 것입니다. 트랜잭션이 커밋 된 후 클린 세션에서 새 트랜잭션을 열고 필요한 모든 데이터를 다시로드하십시오. 아마도 흥미로운 옵션 일 수 있지만, 패턴과 같은 모든 추가 작업으로 인해 서버와 데이터베이스가 손상 될 가능성이 높습니다.

나는 문제는 우리가 어떤 POST (갱신) 요청에 따라 2 000 + 문서를 다시 인덱싱 필요가있다, https://hibernate.atlassian.net/browse/HSEARCH-2364

+0

들으 사네 일부 디자인 의견을 제기했습니다. 이 경우 데이터 수집에는 2 초 정도의 시간이 걸리는 것이 당연합니다. 문서 당 약 1 밀리 초 정도입니다. 우리는 꽤 복잡한 관계와 많은 수의 관련 엔티티가 문서에로드되어야하기 때문에 OK라고 생각합니다. 해결책으로 우리는 당신이 추천 한 바를 정확히 사용합니다 : _ Hibernate EventListener와 Spring AsyncTaskExecutor를 사용하여 트랜잭션이 커밋 된 후 새로운 트랜잭션에서 전체 객체 그래프를 다시 읽습니다. – aillusions