KafkaProducer: 사용자가 직접 사용하는 클래스. send() 메서드를 호출하면 Record를 전송한다.
RecordAccumulator: 사용자가 KafkaProducer::send() 메서드를 호출하면 Record가 바로 전송되는 것이 아니라 RecordAccumulator에 저장된다. 그리고 실제로 Broker에 저장되는 것은 이후에 비동기적으로 이루어진다.
Sender: KafkaProducer는 별도의 Sender Thread를 생성한다. Sender Thread는 RecordAccumulator에 저장된 Record들을 Broker로 전송하는 역할을 한다. 그리고 Broker의 응답을 받아서 사용자가 Record 전송 시 설정한 콜백이 있으면 실행하고, Broker로부터 받은 응답 결과를 Future를 통해서 사용자에게 전달한다.