강의 메모 #
레코드 #
레코드 #
레코드는 타임스탬프, 헤더, 메시지 키, 메시지 값, 오프셋으로 구성되어있다. 프로듀서가 생성한 레코드가 브로커로 전송되면 오프셋이 지정되고, 옵션에 따라서 타임스탬프가 저장된다. 기본적으로 프로듀서는 오프셋을 가지고있지않고 레코드가 브로커에 저장될때만 오프셋이 있다. 브로커에 한번 적재된 레코드는 수정할 수 없다. 로그 리텐션 기간 또는 용량에 따라서만 삭제된다.
레코드 - 타임스탬프 #
스트림 프로세싱에서 활용하기 위한 시간을 저장하는 용도 기본값 : 프로듀서 레코드 생성 시간 (CreateTime) 또는 브로커 적재 시간(LogAppendTime)으로 설정할 수도 있다. 해당 옵션은 토픽 단위로 설정 가능하며 message.timestamp.type을 사용한다.
레코드 - 오프셋 #
프로듀서가 생성한 레코드에는 존재하지 않는다. 프로듀서가 전송한 레코드가 브로커에 적재될 때 오프셋이 지정된다. 오프셋은 0부터 시작되고 1씩 증가한다. 컨슈머는 오프셋을 기반으로 처리가 완료된 데이터와 앞으로 처리해야할 데이터로 구분된다. 각 메시지는 파티션별로 고유한 오프셋을 가지므로 컨슈머에서 중복 처리를 방지하기 위한 목적으로도 사용한다.
레코드 - 헤더 #
key/value 데이터를 추가할 수 있으며 레코드의 스키마 버전이나 포맷과 같이 데이터 프로세싱에 참고할만한 정보를 담아서 사용할 수 있다.
레코드 - 메시지 키 #
메시지 값의 분류하기 위한 용도 파티셔닝 메시지 키는 파티셔녀에 따라 토픽의 파티션 번호가 정해진다. 메시지 키는 필수값이 아니며, 지정하지 않으면 null로 설정된다. 메시지키에 어떤 데이터를 넣게되면 프로듀서가 send() 수행할때 여러 파티션들 중 하나에 매칭되어 들어간다. 메시지 키가 null인 레코드는 특정 토픽의 파티션에 라운드 로빈으로 전달된다. 기본 파티션의 경우, null이 아닌 메시지 키는 해쉬값에 의해서 특정 파티션에 매핑되어 전달된다.
레코드 - 메시지 값 #
실질적으로 처리할 데이터가 담기는 공간 메시지 값의 포맷은 제네릭으로 사용자에 의해 지정된다. 직렬화/역직렬화 클래스를 만들어 사용할 수도 있다. 브로커에 저장된 레코드의 메시지 값은 어떤 포맷으로 직렬화되어 저장되었는지 알 수 없기 때문에 컨슈머는 미리 역직렬화 포맷을 알고있어야한다.