Kafka Partition 정보와 java volatile

개발 공부 일지·2022년 2월 10일
0

나는 Spring kafka를 사용하며, KafkaMessageListenerContainer를 직접 설정해주고 선언해서 사용하고 있다. (다른 사용법으로도 Spring Context 객체를 이용해 KafkaMessageListenerContainer를 접근할 수 있다)

그러다가 Kafka Consumer에서 현재 연결하고 있는 Topic의 Partition 정보를 실시간으로 받고 싶어서 찾아보았는데, KafkaMessageListenerContainer의 메소드 중 "public Collection getAssignedPartitions()" 메소드를 통해 현재 연결이 할당된 Partition 정보의 값을 받을 수 있다는 것을 알았다.

그런데 특이한 점이 이 메소드의 값을 받아서, 따로 넣어 놨는데도 (객체를 새로 생성해서 담진 않고 Collection 객체 그대로 넘김) 값을 부를 때마다 partition 연결 정보를 실시간으로 가져오는 것을 확인했다. (결과 값이 알아서 바뀜)

그래서 KafkaMessageLisnterContainer 클래스의 내용을 살펴보았더니, getAssignedPartitions 메소드는 KafkaMessageLisnterContainer의 클래스 인스턴스 중 ListenerConsumer를 통해 listenerConsumer의 partition 정보를 얻는 데, 이 인스턴스는 volatile로 선언되어 있음을 확인했다. 이 volatile 선언 때문에, 최신 partition 연결 정보를 계속 받을 수 있던 것이었다.
이런 식으로 -> private volatile ListenerConsumer listenerConsumer;

java에서 volatile 선언은 해당 인스턴스의 값을 memory가 아닌 Main memory에 저장한다는 것을 의미한다. 사용할 때마다 Main memory에서 값을 읽고 쓰도록 한다. 그래서 최신의 값을 가져갈 수 있도록 하고, multi thread 환경에서 값의 Context를 공유할 수 있도록 지원한다. multi thread 환경에서의 얘기기 때문에 당연히 값을 변경하는 경우가 있다면, transaction 생각해서 synchronized도 생각해줘야 한다.

cf) 당연한 얘기
context.setPartition( listener.getAssignedPartitions() ) → 이러면 volatile 유지
context.setPartition( new ArrayList<>( listener.getAssignedPartitons() ) → 이러면 마지막 값만 유지

profile
알고리즘 / 기술 스택 / CS

0개의 댓글