TIL 111

24/02/16 TIL __ 실시간 시청자수 계산 오류(유저테스트)

유저테스트를 하는데 실시간 방송 시청자수 계산에 오류가 있었다. 분명 10명은 넘게 있었는데, 유저가 3명이 있다고 나와있었다. 혼자서 창을 여러개 띄워서 테스트 할때는 40개까지 문제가 없었는데, 유저가 20명 정도 오자 이슈가 발생했다. 그래서 이 부분을 다시 찾아보게 되었다. 아래는 기존 로직이다 @SubscribeMessage('count_live_chat_user') async countLiveChatUser(client: Socket, channelId: string) { Logger.log(`5초마다 실행되는 카운트 라이브 챗 유저 함수 ${client.id}`); const room = this.server.sockets.adapter.rooms.get(channelId)?.size; co..

TIL 2024.02.16

24/02/15 TIL __ XSS 공격이 들어온다면(유저테스트)

유저테스트를 진행했는데, 캠프 동기분들께서 테스트를 도와주셨다. 그중 미처 생각하지 못했던 문제가 있었는데 바로 xss공격에 대한 대응이 없었다는것.. xss 공격에 대해 덕분에 알게 되었다. 이는 실제 서비스에서 조심해야하는 부분이기에 이게 어떤거고, 어떤 방법으로 대응해야 하는지 찾아보았다. XSS 공격이란? sql injection과 함게 웹상에서 가장 기초적인 취약점 공격 방법 중 하나 권한이 없는 사용자가 악의적인 용도로 웹사이트에 스크립트를 삽입하는 공격 기법. 다른 웹사이트와 정보를 교환하는 식으로 작동해 사이트간 스크립팅 이라고 한다. 여전히 웹 취약점 빈도수 상위 10위권에 있는 공격이다. 보안 기법이 많이 나왔지만, 우회 기법도 많이 생겨났다. 주로 사용자의 세션을 서버로 전송해 탈취하..

TIL 2024.02.16

24/02/09 TIL __ socket io disconnect 되서 입력 불가 이슈(2)

가장 큰 문제가 있었다. 현재 내가 도커와 쿠버네티스, 로드벨런싱을 적용한 배포 환경에 대해 이해가 없다는 것이다. 코드에 이슈가 생긴 부분은 내 파트인데, 이게 배포환경과 섞이면서 테스트 결과가 달라지다 보니, 로컬에서 아무리 테스트를 해도 의미가 없었고, 로컬에서는 애초에 disconenct가 작동하지 않았다. 애써 disconnect를 작동하게 하려고 이것 저것 해봤지만(setTimeout으로 호출, 서버 껏다키기, 새로고침) 동일한 disconnect 작동이 아니기 때문에, 확인이 불가했다. 무조건 쿠버네티스 환경에서 테스트를 해봐야 의미가 있었고, 현재의 나는 할줄 모르고, 그걸 배우느라 1달을 보낸 팀원분을 봣기 때문에, 이 에러 해결을 위해 잠깐 본다고 다룰수 있진 않을 것 같았다. 그래서 ..

TIL 2024.02.09

24/02/08 TIL __ socket io disconnect 되서 입력 불가 이슈(1)

설 연휴를 앞두고 우리 프로젝트에 큰 문제가 생겼다.😂 채팅 기능이 갑자기 계속 끊겨서 입력이 안되고, 라이브 메인 화면에서도 방송 시작하고 사라지는... 팀원분이랑 테스트 하다가 방송을 켯다고 하셧는데 안보여서 당황했는데 이유는 socket io 의 disconnect가 일어나는게 단편적인 원인들 중 하나였다. 지금까지 테스트를 혼자 하거나 잠깐 팀원들이랑 해왔는데, 이번에 다 같이 동시에 테스트 해보며 다른 문제들도 많이 발견되었는데, 발견된 문제들은 아래와 같았다. 🚨 발견된 문제 1. 메인 화면에 방송중인 유저의 방송 썸네일 및 div가 잠시 보이고 사라져 버린다. 2. 유저의 채팅은 잠시후 연결이 끊긴다. 3. 많은 유저가 함께 채팅을 칠때 상대방이 enter 를 누름과 동시에 내 입력값이 사라..

TIL 2024.02.08

24/02/07 TIL __ 레플리케이션

소켓 서버는 부하가 많아 이 부하를 견딜수 있게 처리해주고 싶었다. 샤딩과 레플리케이션을 생각했고, 1차 저장소인 레디스에 적용을 하고 싶었다. 처음에는 mongodb, redis 2개를 사용해야 하기 때문에 2다 해야할까 싶엇지만, 일단은 레디스만 적용해보려 한다. 샤딩보다는 레플리케이션을 먼저 시도하는게 나을 듯 해서 레디스의 레플리케이션에 대해 공부해 보았다. 레디스 공식문서에 나와있기를 Redis의 기본 클라이언트 수는 최대 10,000개입니다. 최대값에 도달한 후 Redis는 모든 새 연결에 오류로 응답합니다. 연결(또는 애플리케이션 인스턴스)이 많으면 더 높은 수준으로 올라가야 할 수도 있습니다. Redis 구성 파일에서 최대 동시 클라이언트 수를 설정할 수 있습니다. maxclients 20..

TIL 2024.02.07

24/02/06 TIL __ 메세지 브로커 와 소켓 어뎁터

실시간 스트리밍 사이트에서 채팅기능을 맡아 진행했는데, socket io를 이용했었다. 대용량 트래픽을 경험해 보고자 메세지큐, 메세지 브로커 등을 찾아봤었는데, socket io의 adapter라는 애도 비슷한 역할을 하는게 아닌가?!! 혼돈의 카오스 였지만, 많은 정보조사를 통해 정리가 되었다. 먼저 socket io에서는 mongodb 어뎁터, redis 어뎁터, ws어뎁터, ws를 이용한 커스텀 어뎁터 가 있다. 이 어뎁터의 역할을 찾아보니, 분산된 소켓서버 간의 통신을 돕는다고 한다. 예를 들어보자. 1번 채팅방에 10명이 있었는데, 갑자기 1000000명이 들어왓다고 가정해 보자. 1번 채팅방은 실시간 소켓 통신이고, 이걸 저 많은 인원이 유지하고 있다고 하면? 서버 부하가 매우 많은 상황이라..

TIL 2024.02.06

24/02/04 TIL __ socket io에 redis어뎁터 추가

소켓 통신에서 분리된 소켓 서버에서도 잘 작동할 수 있도록 adapter를 연결했다. 처음에 대용량 트래픽 시나리오를 기반으로 시작했기 때문에 추후 분산될 소켓 서버를 생각하면 adapter를 사용하는게 맞다고 느껴졌다. pub/sub모델을 아직 사용하진 않지만, 공식문서에 안내된 대로 따라가서 이런 상태이다. 추후 kafka를 사용할 계획이고, pub/sub 부분을 어떻게 만져야 할지는 좀더 봐야할 것 같다. kafka라는게 있다는 것도 얼마 전에 알았기 때문에 공부가 많이 필요하다. adapter는 redis로만 사용해야 하는건 아니다. 공식문서를 잘 찾아보면, 다른 방법도 지원을 하고 있다. 추가로 redis의 pub/sub과 함께 사용했을때 그것을 구현하는 로직과 연관되어 성능상 이슈가 있었다는 ..

TIL 2024.02.04

24/02/03 TIL __ socket io와 TCP 통신

socket io를 보다보니 tcp통신 이라는게 눈에 들어왔다. 그 전에 socket io에 대해 간단하게 집고 넘어가보려 한다. 🦊 socket io socket io는 기본적으로 블로킹 모드이며, 해당 작업 완료까지 프로그램이 대기상태에 빠진다. 그러나 nodejs, nest js를 사용하는 나에게는 해당하지 않는다. 이 환경에서는 non-blocking이기 때문이다. 따라서, 송수신 함수 호출시 즉시 리턴되며, 호출한 스레드가 블록되지 않고 계속 실행된다. TCP 통신을 사용해 데이터를 안정적으로, 순서대로 오류없이 전송을 하도록 되어있고, 연결 중단시 최대 1번의 메세지 전달을 보장하는 특성이 있다. 커널의 소켓 버퍼에는 송신버퍼와 수신버퍼가 있다. socket io 에서 send 함수가 실행된다..

TIL 2024.02.03

24/02/02 TIL __ 레플리케이션 과 클러스터 그리고 샤딩

클러스터, 샤딩 이런 용어들이 익숙하지 않아 공부한걸 정리한다. 일단 db에 대해 다시 생각해야 한다. db는 단지 db 1개의 덩어리가 아니라 사실은 서버와 스토리지의 구성이다. db는 서버 역할을 하는 db서버와, 데이터를 저장하는 저장소(스토리지)가 한 세트로 구성되어 있다. 클러스터링 서비스를 제공할 때 db server에 장애가 나면, 서비스가 멈추게 된다. 이것을 방지하기 위해 db서버를 늘리고, 하나의 저장소를 바라보도록 한다. db서버의 부하가 줄어드는 장점이 있지만, 또 cpu나 메모리 자원 부하도 적어지지만, 병목현상 즉 몰려서 대기시간이 길어지는 상황이 생길 수 있다. 또 비용적 이슈도 있다. 클러스터링을 하는 다양한 방법이 있는데, active-active, active-stanby..

TIL 2024.02.02

24/02/01 TIL __ rtmp 프로토콜, hls 프로토콜을 이용한 스트리밍 서비스

실시간 스트리밍 서비스에서 가장 중요한 실시간 방송 파트는 다른 다른 팀원2분이 맡아 진행했었다. 생소한 분야다 보니 난이도가 있었는데, 실제 구현을 하면서도 잘 이해가 안가는 상황이 있었고, 담당하지 않은 사람들은 더욱 이해를 제대로 못하는 상황이 있었다. 어떻게 흘러가는지라도 파악을 하기 위해 정리한다. 실시간 스트리밍 에는 다양한 도구가 있지만, 현재 우리 프로젝트에서는 nginx의 rtmp모듈과 hls, obs스튜디오를 사용했다. 다른 스트리밍 도구들은 없는지 알아봤는데 꽤 많이 존재했다. ⚽️ MPEG-DASH 사용자 네트워크 조건에 따라 자동으로 비디오 품질 조절 안정적 ⚽️ Apple Low Latency HLS 낮은 지연시간.(HLS의 새로운 버전) 실시간 스트리밍 최적화(실시간 이벤트 같..

TIL 2024.02.01