0. Table Of Contents
1. 서론
현재 백엔드 팀 일부 프로젝트에서는 message를 관리하고 이를 적절한 곳에서 consume하기 위해 kafka를 사용하지만, 이에 대해서 exception handling이 잘 되고 있지 않으며 각 프로젝트 별로도 다르게 설계 중인 것으로 파악이 되었다.
따라서 kafka exception handling 어떻게 하면 잘 했다고 소문이 날지 생각해보게 되었으며, 내가 고민한 방법들을 적어보았다.
2. Dead Queue의 사용
처리가 되지 않은 message에 대해서 나중에 메시지를 처리할 수 있도록 다른 별도의 topic에 쌓아놓는 기법이다. 이 기법을 사용 할 경우 아래와 같은 장단점이 있을 수 있다.
- 장점
- 각 토픽별로 메시지를 보관 할 수 있으며, 작업시 자연스럽게 dead queue에 연결하여 하나씩 메시지를 까볼 수 있다.
- 단점
- [개인적인 생각] kafka는 데이터의 위치를 알려주는 offset이라는 강력한 기능을 제공하는데, 이를 적절하게 활용하지 못하는 느낌이다.
- topic이 많아지면 그만큼의 배수의 데이터가 중복으로 kafka에 생성되기 떄문에 스토리지 관점에서 비효율적이라고 생각된다.
3. 문제가 생긴 offset과 error type을 기록
kafka의 장점을 적극적으로 사용하여 offset기반으로 모든 데이터를 참조할 수 있다. 이 기법을 사용 할 경우 아래와 같은 장단점이 있을 수 있다.
- 장점
- kafka의 offset을 활용해 문제가 되는 데이터만 받아 볼 수 있다.
- 데이터의 복제본을 만들지 않아도 되므로 dataio를 최소화 할 수 있다.
- 단점
- retention 기간이 지나버리면, kafka에 있는 데이터가 삭제되므로 디버깅을 할 수 없다.
4. offset을 기록 하고, retention기간이 지나면 데이터를 archiving 한다.
위 2가지 방법을 하나로 합친 방법으로 자세한 설명은 아래와 같다.
- retention기간 동안에는 데이터베이스에 기록 된 offset과 exception 타입을 보고 문제를 처리한다.
- database connection 문제 등 배치로 해결 할 수 있는 문제의 경우, 일괄처리 한다.
- 배치로 처리 할 수 없는 경우는 개발자가 직접 해당 데이터를 디버깅하여 해결한 다음, 다시 처리할 수 있도록 해당 topic에 produce한다.
- retention기간이 지났을 경우, 배치를 이용하여 database에 기록된 offset에 해당하는 데이터를 압축하여 minio등 storage에 저장한다.
- 추후 이 문제에 대해 개발자들이 언제든 해결할 수 있도록 조치가 가능하다.
- 중복을 kafka에 데이터를 저장하지 않기 때문에 안정적인 kafka 운영을 기대할 수 있다.
'IT' 카테고리의 다른 글
Kafka Message Flow 살펴보기 [Consumer 편] (0) | 2024.06.18 |
---|---|
Kafka Message Flow 살펴보기 [Producer 편] (0) | 2024.06.18 |