인프런 커뮤니티 질문&답변

노른자님의 프로필 이미지
노른자

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

채팅 데이터 처리 질문

작성

·

3.1K

0

현재 채팅앱 구현중인데, 경험이없어 조언을 얻고싶어 질문드립니다!

 

지금까지 나름 조사해본결과, 채팅 데이터 처리방법으로는
1. 소켓으로 채팅 하나하나올때마다 MySQL에 저장한다. 

클라이언트가 앱 최초 실행시 Local DB에 저장되어있던 마지막 ChatId로 MySQL에서 그 이후 채팅을 조회후 클라이언트에게 보내줌.

---가장 깔끔하고 쉽지만,대규모 채팅앱이 되었을경우 매번 INSERT를 해버리면 MySQL이 감당을 못할것같음.---

 

2. 소켓으로 채팅 올때마다 redis에 저장후 일정시간혹은 일정량이차면 한꺼번에 MySQL에 저장한다.

클라가 앱 최초 실행시 Local DB에 있던 마지막 Chat createdAt으로 그시간 뒤의 채팅들은 MySQL에서 조회후,

redis에 임시저장된 채팅들이 있다면 그것들을 합처주고 클라이언트에게 보내줌.

---좀 번거롭지만 MySQL INSERT를 한번에 해줌으로서 DB부하를 줄일 수 있을것같음.

다만, 아주 극적인 타이밍으로 클라가 MySQL에 채팅내역을 조회함과 동시에 redis에서 일정량이차서 MySQL에 INSERT 해주고 redis가 비워저버릴경우 해당 클라이언트는 합처줘야할 대화내용이 유실될수있을것같음.(아주 주관적인 이론)---

 

 

이정도가 있는것같은데, "대규모 채팅앱"이라고 가정할경우

1.더 좋은 방법이 있는지,

2.만약 위의 두번째방법이 괜찮지만 제 이론대로 대화내용 유실 문제가 있을수있다면, 해결방법이 있는지.

3.제로초님은 어떤방식을 선호하는지 등

 

조언을 듣고싶습니다..!

답변 2

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

제가 카카오 그룹쪽에 다니긴 하지만 카카오모빌리티라서 카카오톡같은 채팅앱은 잘 모릅니다. ㅎㅎ 슬랙이랑 카카오톡도 성격이 꽤 다르고요.

대규모 채팅 시에는 저는 dynamodb같은 nosql을 주로 썼습니다. mysql같은 sql로는 insert, 조회 등이 감당이 안 되더라고요. dynamodb를 쓰면 소켓에서 채팅 하나하나 올때마다 바로 insert하셔도 크게 무리가 없습니다.

카카오톡은 제가 알기로 파일과 db를 같이 쓴 걸로 알고 있습니다. 그래서 3일 이상 접속을 안하면 파일이 날아가서 그 부분은 복구를 못하곤했죠.

노른자님의 프로필 이미지
노른자
질문자

답변 감사합니다.

0

노른자님의 프로필 이미지
노른자
질문자

제로초님 말씀을 듣고,

유저정보,프로필,방정보,맴버 등 요청이 적은 데이터들은 MYSQL에 넣고,

채팅내역과 같은 굉장히 빈번하게 일어나는 데이터들은 dynamoDB에 넣을려고합니다.

 

그래서 nestjs에서 mysql과 dynamo db를 같이 사용가능한지와 어떻게 사용해야하는지 알고싶습니다.

혹시 제로초님 dynamoDB 관련강의도 있다면 알려주시면 감사하겠습니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

다이나모 강좌는 없습니다. 이정도 스페시픽하게 들어가면 이제부터는 강의같은게 없다고 생각하셔야 합니다. 검색으로만 찾으셔야 합니다. 그냥 npm dynamodb 모듈 사용해서 연결 후 쿼리 하시면 됩니다.

노른자님의 프로필 이미지
노른자

작성한 질문수

질문하기