엘라스틱서치 bulk API

김민규·2023년 8월 7일
0

elasticsearch

목록 보기
7/7

bulk API

bulk API는 여러 색인, 업데이트, 삭제 작업을 한 번의 요청에 담아서 보내는 API다.

엘라스틱서치의 다른 API와 다르게 요청 본문을 JSON이 아니라 NDJSON(Newline Delimited JSON) 형태로 만들어서 보낸다.

  • Content-Type 헤더도 application/x-ndjson을 사용해야 한다.
  • 가장 마지막 줄은 줄바꿈 문자 \n으로 끝나야 한다.
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

bulk API의 작업 순서

bulk API에 기술된 작업은 반드시 그 순서대로 수행된다는 보장이 없다.

  • 조정 역할을 하는 노드가 요청을 수신하면 각 요청의 내용을 보고 적절한 주 샤드로 요청을 넘겨준다.
    • 여러 개의 주 샤드에 넘어간 각 요청은 각자 독자적으로 수행된다.
    • 따라서 요청 간 순서는 보장되지 않는다.
  • 그러나 완전히 동일한 인덱스, _id, 라우팅 조합을 가진 요청은 반드시 동일한 주 샤드로 넘어간다.
    • 따라서 한 bulk API 내에서 이 조합이 같은 요청, 즉 동일한 문서에 대한 요청은 bulk API에 기술된 순서대로 동작한다.

bulk API의 성능

네트워크를 통해 요청을 여러 번 반복해서 호출해야 한다면 이를 묶어 한꺼번에 전송하는 것이 일반적으로 성능상 이득이다.

  • bulk API 요청 한 번에 몇 개의 요청을 모아서 보내는 것이 성능상 적절한지는 정해져 있지 않다.
    • 각 요청의 크기나 데이터 특성 등에 따라 달라지기 때문이다.
  • 그러므로 성능 이슈가 있는 경우 수치를 조정해 가며 실험해 보는 것이 좋다.
  • 또한 HTTP 요청을 청크(chunked)로 보내는 것은 성능을 떨어지게 만들기 때문에 피해야 한다.

참조

profile
Backend Engineer, Vim User

2개의 댓글

comment-user-thumbnail
2023년 8월 7일

이런 유용한 정보를 나눠주셔서 감사합니다.

1개의 답글