사용자가 전송한 메세지를 nosql 디비에 저장해두려함
나중에 조회할때 메세지 내용+보낸사람정보(아이디 이름 프사url) 을 쏴줘야하는데
매번 발신자 ID 로 rdb 훑어서 프로필 정보 합쳐 보내주는건 미친짓 같음
그래서 고민중인게 지금
1. 메모리에 사용자 정보 캐싱하여 join
2. 디비에 메세지 저장할때 사용자 정보도 함께 저장
인데, 전자는 인메모리 디비를 저렇게 써도 되나 싶고
후자는 데이터가 중복되어 저장되는게 걱정됨
일반적으로 많이 사용하는 방법이 무엇인지 궁금함
실시간 채팅이 1:1임? 그러면 사용자 정보는 클라이언트에서 가지게 해도되지않나 대규모는 경험이 없어서 모르겠고, 그냥 개인적인 생각으로는 사용자 정보는 클라에 저장하는걸 쓸것같음 만약에 상대방이 프사같은걸 바꾸면 그때만 사용자 정보를 다시 보내주는 방식으로 하고
그룹채팅임
클라에서 사용자 정보는 가지고 있긴 한데.. 사용자 아이디만 쏴주는게 맞을라나
나도 잘 모르겠는데, 나라면 디코같은 서비스 들어가서 개발자 도구 네트워크 탭 볼것같음 처음 진입때 유저정보를 다 가져오고, 채팅에서는 id만 보내주는지, 아니면 채팅에 다 넣어서 보내주는지 http나 소켓 응답값 보는게 빠르고 확실함
디스코드는 당연히 확인해봤지 모든 각 메세지가 사용자 정보를 포함하고 있음 이름부터 프사 프사효과 뭐 이런 정보들 근데 그건 단순히 웹이라 그런게 아닐까 싶어서 질문올려봤음
글구 글케 보내준다고 해서 걔들이 매번 디비 긁는지 캐싱한거 가져오는지 아니면 메세지랑 함께 저장해두는지는 알 수가 없잖어
나는 그냥 처음진입시 유저 정보 다 긁어서 클라에 저장하는 방법 쓸것같은데, 그게 싫으면 서버 메모리에 저장하셈 실시간이면 소켓같은거 쓸꺼자너 걍 그 채팅방 소켓 생성되면 사용자 정보 다 가져와서 메모리에 저장해두고, 채팅에 합쳐서 보내주던가
채팅 조회할땐 발신자 id, 메시지만 보내고 따로 프로필 조회하는 api 만들어서 클라이언트에서 조합하게 하면 안되려나
지금 만들어둔 형태가 그러하긴 함 근데 문제가 모종의 이유로 클라이언트가 서버로부터 사용자 목록을 가져오는게 늦어졌다고 가정했을때 기기에 저장해둔 정보가 없는 사용자가 채팅을 보내면 그동안 보여줄 데이터가 없어버림 클라한테 메세지를 큐에 넣고 한 1초씩 늦게 렌더링 하는 방법은 어떻냐고 제안해봤는데 못하겠대..
컴퓨터는 생각보다 빠릅니다. 너무 애기같이 조심스럽게 다루지 말고 팍팍 리소스 사용하세요.
ㅋㅋㅋㅋ
1번. 애초에 채팅 서버면 stateful이라 커넥션 어짜피 메모리에 다 올려야 하잖아 채팅 서버가 매번 db io 하는거 미친짓임
대화내역 조회 Api가 50개씩 가져오는데 최악의 상황에는 호출마다 db io를 50번씩 할 수도 있는거잖아? 이거를 생각해보니까 1번을 좋은 방법이라 할 수 있는지가 고민되더라고
온라인 상태인 사용자 정보는 메모리에 올라가있긴하지 근데 대화내역은 온라인 여부에 상관 없이 불러오는거니까.. 메세지랑 같이 저장하는 방법은 별로일까
메시지에 사용자 정보를 계속 넣으면 중간에 사용자가 프사 바꾸면 어케하려고 채팅 전체를 업데이트 하지는 않을거고, 그냥 일주일전 채팅은 예전 프사로 보내주고, 어제 채팅은 최신프사로 보내주려고?