Blog

카프카를 통한 동시성 문제 해결 고민

tag
프로젝트 고찰
날짜
2023/10/27
생성 일시
2023/10/28 06:39
작성자

Kafka를 시도하는 이유

1.
현재 진행 중인 프로젝트의 서비스는 대용량 트래픽을 받는 서비스이다.
→ kafka를 사용하면 데이터 베이스나 애플리케이션에 락을 걸지 않고 전송 속도를 제어해서 동시성 문제가 발생하지 않는 속도로 순차적으로 전달한다면 락보다 속도가 빠를것입니다.
2.
확장성이 중요한 경우
→ 서비스가 계속 성장하고 더 많은 트래픽을 처리해야 할 경우, Kafka는 쉽게 확장할 수 있는 구조를 가지고 있어 미래의 성장에 대비할 수 있습니다.
3.
탄력성과 고가용성이 중요한 경우
→ Kafka는 분산 시스템으로 설계되어 있어 노드 하나가 실패하더라도 서비스의 가용성을 유지할 수 있습니다.
즉 저희 서비스의 확장성과 안정성, 서버 과부하 방지, 동시성 문제를 성능 저하하는 락없이 해결하기 위해 카프카가 필요합니다.
책나눔서비스 → 선착순(티켓팅)과 비슷한 서비스 → 동시성문제가 발생가능성 높다. → 해결을 위해 Lock을 사용해보았다. → Lock을 사용함으로써 성능 저하 문제가 발생 → 성능의 차이는 JMeter로 확인했음 → Lock을 사용하면 평균 222 세마포어를 적용하면 111 2배정도 차이가 발생했다.

Kafka를 한 곳에서 실행을 한다면 성능이 향상 될까?

KafKa의 동작 흐름은 아래와 같습니다

1.
프론트엔드에서 요청: 사용자의 액션에 의해 프론트엔드에서 백엔드로 HTTP 요청이 전송됩니다.
2.
Kafka 컨트롤러: Spring Boot 어플리케이션 내의 컨트롤러가 HTTP 요청을 받아 처리합니다.
3.
Kafka 프로듀서: 컨트롤러는 Kafka 프로듀서를 통해 메시지를 Kafka 서버의 특정 토픽으로 전송합니다.
4.
Kafka 서버: Kafka 클러스터는 메시지를 받아 토픽에 저장하고, 이 메시지를 구독하고 있는 컨슈머에게 전달합니다.
5.
Kafka 컨슈머: Kafka 컨슈머는 메시지를 받아 필요한 비즈니스 로직을 처리합니다. 이 과정에서 외부 API를 호출할 수도 있습니다.
6.
API 호출 (선택적): 필요한 경우 컨슈머는 외부 API를 호출하여 추가적인 처리를 진행합니다.
하지만 컨슈머와 프로듀서를 분리하지 않으면 하나의 서비스에서 모든 것이 이루어져야 합니다
그러면 아래 처럼 하면 어떨까?
API 수많은 파생 서비스가 나타나는 것을 컨트롤하는것도 어렵다.
Stream 동시성처리, 성능은 개선될 것이 거의 확실하다. 발행 순서에 따라 순서가 보장될 가능성이 높다.
Batch
이렇게 서버를 3개로 나누면 기존 프로젝트에서 코드를 재구성해야 한다는 문제가 있습니다.
난이도가 어려울 걸로 추정 됩니다.
우선 코드를 재구성해야하고
1.
비동기적인 작업 처리와 결과 전송을 위해 웹소켓이나 서버 센트 이벤트(Server-Sent Events)와 같은 기술을 사용하여 다른 서버에서도 클라이언트에게 직접 데이터를 보내야 합니다.
a.
웹소켓 사용
클라이언트가 프로듀서 서버에게 요청을 보내고, 프로듀서 서버는 웹소켓 연결을 통해 컨슈머 서버와 통신할 수 있습니다. 이 경우, 클라이언트는 프로듀서 서버와 웹소켓 연결을 유지하고, 프로듀서 서버는 해당 연결을 통해 검색 결과를 클라이언트에게 직접 전송할 수 있습니다. 또한, 컨슈머 서버도 웹소켓을 사용해 프로듀서 서버를 통하지 않고 직접 클라이언트에게 데이터를 보낼 수 있습니다.
b.
서버 센트 이벤트(Server-Sent Events): 이는 단방향 통신 방법으로, 서버가 클라이언트로 데이터를 푸시할 수 있게 해줍니다. 클라이언트는 프로듀서 서버에게 HTTP 요청을 보내고 연결을 열어두면, 프로듀서 또는 컨슈머 서버는 해당 연결을 통해 클라이언트로 데이터를 전송할 수 있습니다.
2.
실무에선 컨슈머는 직접 클라이언트에게 응답을 보내지 않고, 결과를 프로듀서에게 전달하고 프로듀서가 클라이언트에게 응답을 보내는 구조로 처리로 합니다.
a.
그럼 대안은 컨슈머와 프로듀서를 동일하게 넣고 카프카 서버를 분리 시키는 방법입니다.
만약 이렇게 구현을 하였을때 애플리케이션이나 데이터베이스 레벨에서 락을 거는 것보다 성능이 향상 될 지는 의문 입니다.
락이 걸려있지 않으니 락적인 측면에서는 성능향상이 있겠지만 프로듀서가 카프카로 보내주는 것과 컨슈머가 받는 것을 한 서버에서 하기에…