MSA 프로젝트를 진행하다 "토픽의 이름을 어떻게 정하지" 라는 고민이 들었다. 아무래도 MSA의 강점은 협업인데, 누구나 보기 쉽게 네이밍을 해야겠다라고 생각했다(나만 알아볼 수 있으면 설명해야 하는데 시간을 들여야 하기 때문이다).
그래서 구글링하다가 스프링 문서 중, 간단하게 정리되어있는 것을 볼 수 있었다.
크게 5가지 방식이 있다.
재시도 토픽에 대해 접미사를 붙이는 방법이 있다.
만약 "my-annotated-topic"이라는 토픽이 있을 때, 토픽이 다시 들어올 경우 뒤에 추가적인 네이밍이 붙어서 온다.
토픽 인덱스나 지연 값을 접미사에 붙이는 방식이다.
고정된 지연시간으로 재시도된 단일 토픽에 대한 정책이다. 토픽 이름에 접미사로 딜레이 값을 붙인다. ex) my-annotated-topic-3_000
최소-최대 지연시간이 정해져있고 지연시간에 Interval이 정해져 있을 때의 대한 네이밍 정책이다. 예를 들어, 지연시간의 최솟값이 1000, 최댓값이 16000, interval이 1000, multiplier가 2일 때의 예시이다.
-retry-1000
-retry-2000
-retry-4000
-retry-8000
-retry-16000-0
-retry-16000-1
-retry-16000-2
…
-retry-16000-224
위의 정책들이 복잡하면 커스터마이징해서 네이밍할 수 있다. Spring 내에서는 RetryTopicNamesProviderFactory
을 상속받아 커스터마이징할 수 있다.
일단 이 위의 정보들은 재시도에 대한 처리인 것 같고.. 난 어떤 서비스에서 오는지, 어떤 종류의 메세지인지 구분할 수 있는 네이밍을 찾고 싶었다. Naming Convention에 대해 간단하게 정리되어있는 글을 찾을 수 있었다(밑에 참고란)
<root name space>.<product>.<product specific hierarchy>
<app type>.<app name>.<dataset name>.<stage of processing>
<app type>.<dataset name>.<data>
# 글쓴이가 추천하는 네이밍 규칙
<message type>.<dataset name>.<data name>
예를 들자면, DOJ라는 어플리케이션 중, 문제 관리 서비스가 TestCase의 정보를 출판하는 토픽이라면 DOJ-ProblemManage-TestCase
라고 지을 수 있겠다. 혹은, db-TestCase-inputoutput
이라고도 할 수 있겠다(이상해보이긴한데 그래도 직관적인 네이밍..)
그 외에 토픽 네이밍을 할 때 주의해야 할 점들은
참고
https://docs.spring.io/spring-kafka/reference/retrytopic/topic-naming.html
https://cnr.sh/essays/how-paint-bike-shed-kafka-topic-naming-conventions