kafka와 같은 브로커를 사용하다보면, 전송방식을 결정해야하는 시점이 오는 것같다.
단순하게는 “그냥 데이터 보내면 되는거 아니야?” 라고 생각할 수 있다.
다만, Kafka에서 zero-payload 방식과 같은 전송방식을 고민한다는 것은 MSA환경을 고려하고 있다는 이야기이며, 그러면 결합과 의존성을 낮추기 위한 고민도 필요하다고 생각한다.
가장 일반적으로 떠올릴 수 있는 데이터 전송 방식은 전통적 통신 방식 으로,
단순히 데이터를 이벤트에 담아 보내는 것이다.
이 방식을 아래와 같은 장단점이 있다.
- 장점
- 통신 모델이 간단
- 자급 자족 가능
- 이벤트 자체에 필요한 모든 데이터가 포함되어 있어, 수신 서비스가 추가적으로 데이터를 요청할 필요가 없음
- 단점
- 서비스간 결합도 증가
- 스키마 의존성
- 이벤트에 포함된 데이터 구조에 수신 서비스가 의존하게 됨
- 이벤트 구조 변경시, Consumer도 변경 필요함
- 버전 관리
- 스키마가 변경될 때, 모든 서비스가 동시에 업데이트되어야 할수 있음
- 네트워크 스토리지 비용 증가
- 동일한 데이터가 여러 이벤트에 중복되어 있을 수 있음
- 확장성 문제
- 이벤트에 많은 데이터를 포함하면, 시스템 확장성에 영향을 줄 수 있음
- 보안 문제
- 이벤트 하나가 유출되면, 관련 데이터가 함께 들어있어 보안상 아쉬운 부분이 존재
이와는 반대로, Zero-Payload 방식 이 존재한다.
해당 방식은 아래와 같은 장단점이 존재한다.
- 장점
- 느슨한 결합
- 마이크로 서비스간 최소한의 데이터만 전달하므로, 구체적인 데이터 구조나 포맷에 대한 의존성을 줄일 수 있음
- “어떤 일이 일어났다”는 신호를 주며, 실제 데이터를 요청할 필요가 있을 때만 요청하게 됨
- 네트워크 효율성
- 유연한 데이터 요청
- 수신 서비스는 필요할 때만 데이터를 요청할 수 있음
- 모든 데이터가 필요하지 않거나, 일부 데이터만 필요할 때 유용함
- 높은 보안
- 이벤트가 하나 유출되도, 최소한의 데이터(id같은)만이 존재하기에 데이터 유출되지 않음
- 단점
- 추가통신 필요
- 이벤트 자체에는 데이터가 없기 때문에, 실제로 데이터를 필요로 하는 서비스는 추가 요청을 통해 데이터를 가져와야 함
- 시스템 복잡성을 증가시키고, 추가적인 네트워크 호출을 유발할 수 있음
- 모니터링과 디버깅의 어려움
- 실제 데이터가 포함되지 않으므로, 문제 발생시 원인 추적이 어려울 수 있음
- 성능 오버헤드
- 데이터 요청과 응답 사이 지연 발생 가능성 존재
- 서비스간 통신이 잦은 경우, 성능 문제로 이어질 수 있음
- 서비스간 더 많은 통신 프로토콜 의존성
- 데이터 요청위해 추가 API 호출이 필요하기 때문에, 서비스간 API 설계와 버전 관리가 중요해짐