앞선 포스팅에서는 자동 커밋을 수행하는 컨슈머 애플리케이션을 개발해보았다.
이번에는 수동 커밋을 수행하는 컨슈머 애플리케이션을 개발해볼 것 이다.
수동 커밋의 종류는 동기 커밋, 비동기 커밋으로 두가지가 있다.
poll() 메소드 호출 이후 commitSync() 메소드를 호출하여 오프셋 커밋을 명시적으로 수행할 수 있다.
commitSync()는 poll()로 받은 가장 마지막 레코드의 오프셋을 기준으로 커밋한다.
동기 오프셋 커밋을 사용할 경우 poll()로 받은 모든 레코드의 처리가 끝난 후에 commitSync() 메소드를 호출해야 한다.
레코드 단위로도 오프셋 커밋을 수행할 수 있다.
레코드 단위로 오프셋 커밋을 하기 위해서는 TopicPartition과 OffsetAndMetaData를 가진 Map을 정의해야 한다.
그 후 commitSync의 파라미터로 넣어주게 되면, 레코드별로 오프셋 커밋이 가능해진다.
이렇게 레코드 단위로도 커밋을 수행할 수 있지만 일반적인 환경에서는 잘 사용하지 않는다.
커밋을 수행한다는 것은 컨슈머와 브로커가 통신하는 과정이므로, 불필요한 잦은 커밋은 브로커에 부담을 줄 수 있기 때문이다.
동기 오프셋 커밋을 사용할 경우 커밋 응답을 기다리는 동안 데이터 처리가 일시적으로 중단되기 때문에 더 많은 데이터 처리를 위해서는 비동기 오프셋 커밋을 수행할 수 있다.
비동기 오프셋 커밋은 commitAsync() 메소드를 호출하여 사용할 수 있다.
우리가 커밋을 수행한다고 해도 컨슈머와 브로커가 통신하는 과정에서 정상 커밋되지 않을 수도 있다.
그러므로 커밋이 잘 완료되는지 또한 콜백 함수를 통해 받을 수 있다.