kafka로 Chat Application 만들기 정리

600g (Kim Dong Geun)·2021년 9월 25일
0
post-custom-banner

현재 진행상황

  • 카프카 환경세팅 ✅
  • 채팅 어플리케이션 구축 ✅
  • 카프카 연동 ✅
  • nginx 환경세팅(도커) 및 로드밸런싱, 리버스 프록시 ✅
upstream chatServer {
    least_conn;
    server host.docker.internal:8080;
    server host.docker.internal:8081;
}

server {
    listen  80;
    server_name localhost;

    root html;

    location / {
        proxy_pass http://chatServer;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}
  • 모든 서버의 채팅의 동기화 ❌

위 conf 파일을 보듯이 nginx를 통해 카프카와 연동된 채팅서버들을 Load Balancing을 해주고 있다.


여기서 발생하는 문제점은 웹 브라우저는 하나의 채팅서버와 소켓 연결을 지속하기 때문에, 다른 채팅서버에서 내려준 응답을 확인할 수 없다는 점이다.

그렇기 때문에 내가 보낸 메시지를 상대방 (혹은 나 자신또한) 이 받지 못할 것이다.

실제로 테스트 결과도 이미지와 같이 동일한 대화방에서도 메시지들이 분할되어 출력된다.

이는 카프카가 Pull 기반의 메시지를 보내기 때문에 발생한 이유이기도 하며 (Redis 처럼 모든 서버에 뿌려주면 생각할 필요도 없다..)

컨슈머가 같은 그룹에 속해서, quque에 쌓인 요청들을 분할해서 처리하는 문제이기도 하다.

그래서 이를 어떻게 해결해줄까 생각하면, 해결 방안은 총 3가지가 나온다.

  1. 브로커마다 요청을 처리할 수 있도록 Queue에 메시지를 중복해서 보낸다.
    • 카프카 큐에 많은양의 메시지가 쌓일 것이다.
  2. 컨슈머의 그룹을 서로 달리한다.
    • 파티션을 왜 나눴을까..?
  3. Redis를 둔다.
    • 오류가 발생했을 때 메시지가 유실될 위험이 존재한다.

일단 한가지씩 모두 해볼 것이다.

profile
수동적인 과신과 행운이 아닌, 능동적인 노력과 치열함
post-custom-banner

0개의 댓글