프로젝트의 API 윤곽이 잡혔겠다, 이제는 MSA의 기본 조건이 되는 비동기 처리를 적용해야 했다. 이때 비동기 처리는 트래픽이 쌓인 순간에 로직 처리에 있어 지연이 발생할 수 있는 부분(처리 비용이 높은 부분)에 적용해줌으로써 서비스의 가용성을 높여준다. 그리고 이를 적용할 비즈니스 로직에 있어서 적용 부분 이후에 바로 이어서 진행해야 할 순차적인 작업이 있는지 여부에 따라 적용 가능 여부가 판가름 난다. 내가 진행하고 있는 프로젝트는 여러 상황별로 고려해야할만큼 규모가 크지는 않았고, DB 접근에 대해서만 비동기 처리를 적용해주면 되었다.
다만 비동기 처리 적용하는 데에 있어서 어떠한 방식을 채택할지는 조금 고민이 되었다. 대표적인 선택지는 세 가지가 있었다.
우선 Java에서 지원하는 CompletableFuture
는 적용하는 데에 가장 어려움이 없긴 하지만, 단일 JVM 내에서 비동기 작업을 관리하기 때문에 MSA 분산 환경에서는 부적합했다. 그렇다면 남은 건 RabbitMQ
와 Apache Kafka
인데, 둘 다 처음 써보기 때문에 고민이 필요했다.
일단 이 둘은 약간 극과 극이라고 할 수 있을텐데, 왜냐하면 RabbitMQ는 설정이 간단하지만 처리 속도가 Kafka에 비해 현저히 낮으며, 반면 Kafka는 처리 속도와 안정성에 있어서는 가장 좋지만 단지 비동기 처리를 위해서만 Kafka를 적용한다는 게 분명 오버 엔지니어링이었기 때문이다. 그래서 이 둘 중 무엇을 선택할지에 대해서도 꽤 많은 시간을 들여야 했는데, 결국엔 Kafka를 적용하기로 했다. 이유는 다음과 같았다.
이렇게 비동기 처리를 위해 Apache Kafka
를 적용하기로 큰 맘 먹고 결정. 그래서 결국 강의도 하나 새로 결제해서 듣기 시작했다... 이때는 이게 지금 내 건강을 악화시키는 큰 원인이 되리라고는 생각을 못했지...