>  기사  >  백엔드 개발  >  ES 일괄 요청 `es_rejected_execution_Exception`

ES 일괄 요청 `es_rejected_execution_Exception`

WBOY
WBOY앞으로
2024-02-11 21:50:07940검색

ES 일괄 요청 `es_rejected_execution_Exception`

PHP 편집기 Apple은 ES 일괄 요청의 일반적인 문제인 `es_rejected_execution_Exception`을 소개합니다. Elasticsearch를 사용하여 일괄 요청을 할 때 가끔 이 예외가 발생합니다. 이 예외는 일반적으로 동시 요청 수가 Elasticsearch 서버의 처리 용량을 초과하여 요청 실행이 거부되었음을 나타냅니다. 이 문서에서는 이 예외의 원인을 분석하고 문제를 원활하게 처리하는 데 도움이 되는 솔루션을 제공합니다.

질문 내용

약 500만 개의 항목으로 구성된 슬라이스가 있습니다. (단순화를 위해 각 항목이 바이트 슬라이스라고 가정하고 getIndexerItem 函数映射到索引器项),我将其平均分配给 200 个 go 例程。然后每个go例程调用push 함수를 사용하며 슬라이스 길이는 5M/200입니다.

내 이해에 따르면 Refresh的理解:wait_for Elastic에 요청이 이루어질 때마다 해당 요청에 의한 변경 사항이 검색에 표시될 때만 완료됩니다(IMO는 이를 더 이상 이 특정 요청이 없는 일괄 요청 대기열로 전환합니다). 그러면 왜 이 오류가 발생합니까?

으아아아

모든 항목은 동일한 색인 ankit-test에 들어갑니다.

으아아아

다른 프로세스가 어떤 방식으로든 인덱스와 상호 작용하지 않는다고 가정합니다.

Solution

여러 ES 문서를 사용하여 위 문제에 대한 해결책을 찾을 수 있었습니다. 아래 답변은 제가 이해한 내용을 토대로 작성되었습니다. 개선/수정할 부분이 있으면 댓글 남겨주세요.

요청 수명 주기는 다음과 같습니다.

  1. golang es 클라이언트는 여러 요청을 하나로 병합하여 단일 일괄 요청으로 서버에 보냅니다. 단일 배치 요청에는 여러 인덱스 및 샤드로 향하는 문서가 포함될 수 있습니다.
  2. 일괄 요청이 클러스터의 노드(코디네이터 노드라고도 함)에 도착하면 일괄적으로 일괄 처리 대기열에 배치되고 일괄 스레드 풀의 스레드에 의해 처리됩니다.
  3. 조정 노드는 문서를 라우팅해야 하는 샤드를 기반으로 일괄 요청을 분할합니다. 각 배치 하위 요청은 해당 기본 샤드를 보유하는 데이터 노드로 전달됩니다. 대량 하위 요청은 노드의 대량 대기열에 보관됩니다. 대기열에 여유 공간이 없으면 조정 노드에 대량 하위 요청이 거부되었음을 알립니다.
  4. 모든 하위 요청이 완료되거나 거부되면 응답이 생성되어 클라이언트에 반환됩니다. 일괄 요청에 포함된 문서 중 일부만 거부되었을 수도 있습니다.

제 문제는 제가 refresh = false (默认)发送请求。相反,应该使用 refresh = wait_for를 사용한다는 것입니다. 왜? 새로 고침은 3가지 모드를 제공합니다:

  1. false: 새로 고침 관련 작업을 수행하지 않습니다. 이 요청으로 인한 변경 사항은 요청이 반환된 후 어느 시점에 표시됩니다. 응답이 수신될 때까지 요청이 완료될 필요는 없습니다. 요청이 여전히 노드의 대기열에 있을 수 있습니다.
  2. true: 작업이 발생한 후 즉시 관련 기본 샤드와 복제본 샤드를 새로 고칩니다. 응답을 다시 보내기 전에 요청이 완료되었는지 확인하세요. 요청이 노드 대기열에서 제거되었습니다.
  3. wait_for: 응답하기 전에 요청에 따른 변경 사항이 새로 고침을 통해 표시될 때까지 기다립니다. true와 달리 이는 즉시 새로 고침을 강제하는 것이 아니라 새로 고침이 발생할 때까지 기다립니다. refresh = true보다 저렴하지만(서버 로드 측면에서) 응답을 다시 보내기 전에 요청이 완료되었는지 확인합니다. 요청이 노드 대기열에서 제거되었습니다.

모든 데이터가 동일한 노드로 리디렉션되었으며 refresh = false로 인해 기존 요청이 대기열에서 지워지기 전에 응답이 반환되어 오버플로가 발생했습니다.

위 내용은 ES 일괄 요청 `es_rejected_execution_Exception`의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제