직접 접근법 (Cody)을 작성한 사람이 작성한 위대한 광범위한 블로그 게시물 here이 있습니다. 일반적으로
, 카프카 배달 의미 섹션을 읽고, 마지막 부분은 말한다 :
기본적으로 제공 및 가 있습니다 그래서 효과적으로 카프카 보장 한 번에-최소 사용자가 사용하지 않도록 설정하여 전달하면 기껏 구현 생산자에 대해 재시도하고 메시지 묶음을 처리하기 전에 오프셋을 커밋합니다. 정확한 배송은 대상 스토리지 시스템과의 협력이 필요하지만 Kafka는 오프셋을 제공하므로이를 직접 구현할 수 있습니다.
이것은 기본적으로 "정확히 한 번 원한다면 우리가 상자 밖으로 적어도 한 번 당신을 줄이는 당신이다"의미. 또한,의 보장에 대한 블로그 게시물 회담이 "정확히 한 번만"의미는 두 가지 접근 방식 (직접 수신기를 기반으로, 강조 광산)과 스파크에서 얻을 :
둘째, 스파크 정확히 한 번만 보장하지 않습니다 이해 출력 작업의 의미. Spark 스트리밍 가이드가 정확히 한 번에 대해 에 대해 말하면, RDD 의 주어진 항목을 계산 된 값에 한 번만 포함하고, 기능적으로는 의 의미입니다. 에서 결과를 저장하기 위해 수행하는 부작용 출력 작업 (예 : )이 실패하고 다시 시도 될 수 있기 때문에 반복 될 수 있습니다.
또한,이 스파크 문서 수신기 기반 처리에 대해 말씀입니다 :
첫 번째 방법은 (수신기 기준) 사육사 소비 오프셋을 저장하는 카프카의 높은 수준의 API를 사용합니다. 이것은 전통적으로 Kafka의 데이터 을 사용하는 방법입니다. 이 접근법 (미리 쓰기 로그와 함께) 은 데이터 손실을 0으로 보장 할 수 있습니다.최소한 한 번 의미가 있음), 일부 오류로 인해 일부 레코드가 두 번 소비 될 수있는 가능성이 희박합니다 ( ).
이 기본적으로 당신이 불꽃과 함께 수신기 기반 스트림을 사용하는 경우 당신은 여전히 출력 변환이 실패 할 경우 데이터를 복제 한 수 있음을 의미, 그것은 적어도 한 번입니다.
내 프로젝트에서 직접 전달 방식을 사용합니다. 여기서는 전달 의미론이 인데 어떻게 처리합니까?입니다. 즉, 정확히 한 번 의미를 유지하려는 경우 데이터가있는 트랜잭션 (예 :)의 패션과 같은 오프셋을 저장할 수 있습니다. 다른 하나가 실패해도 실패합니다.
블로그 게시물 (위 링크)과 Delivery Semantics in the Kafka documentation page을 읽는 것이 좋습니다. 결론을 내리면 직접 스트림 접근 방식을 살펴 보는 것이 좋습니다.