일단 수준이 낮아서 질문 자체도 부족하고, 고려한 방법에 대한 생각도 짧은점 미리 사과드립니다
팀 프로젝트에서 SNS 관련 서비스고, 구현하고 싶었던 기능은 아래와 같습니다
1. 접속한 회원의 관련 데이터(친구, 즐겨찾기한 회사, 좋아요한 게시글, 좋아하는 태그)를 DB에서 조회하고, 각 게시물이 가지고 있는 관심도 점수(댓글 갯수와 좋아요 받은 수)를 합산하여 가장 높은 점수 순으로 보여줍니다.
2. 비회원은 게시물의 관심도 점수 순으로 보여줍니다.
이러한 기능을 만들었을 때 처음에는 DB에 쿼리문을 보내 모든 데이터를 조회하였습니다. 특별히 데이터가 많지않았을땐 문제가 없었으나 각 데이터 1000만건을 생성하고 1000TPS 요청을 보내니 아래와 같은 문제가 발생했습니다.
- 가장 치명적으로 타임아웃이 발생하였습니다.. 정확히 어떤 문제때문이라고는 자세히 알 능력이 부족하여 확답을 드리긴 어렵지만, 거의 모든테이블에 JOIN 연산때문에 커넥션 풀 고갈로 새로운 커넥션 생성에서 발생하는 지연과 리소스 사용으로 인한 문제라고 생각했습니다(제 미천한 추측입니다..)
해결 방안은 고민 중인데 고수님들의 의견을 듣고 싶습니다.. 제가 생각한 문제 해결방법은 이렇습니다
1. 가장 데이터를 많이 탐색하는 게시물 데이터를 Redis에 저장하려합니다. Write-behind 방식으로 처음 데이터는 DB에서 가져오고, 이후로는 레디스에 먼저 작성 및 수정, 특정 시간마다 DB에 쓰기작업을 실행하려합니다.
2. 추천 기능 시 조회는 역인덱스를 지원하는 툴을 사용하려 합니다. 어떤 것을 사용할지 확정은 안했습니다! 해당 기능을 통해 특정 키워드가 담겨있는 ID를 레디스에서 찾아 특정 조건(회원 개인 선호도에 맞춰)에 게시물 관심도 점수를 추가로 더하려합니다.
서버단에서의 해결을 해보려했으나, 서버 자체에서는 연산이 크지않아 수정하여도 속도 개선이나 에러 처리엔 부족하다고 생각했습니다. 단순히 커넥션풀을 늘리기에는 CPU 점유율이 너무 높아져서 포기했고(이것도 제가 잘 몰라서 그런걸수도..) 이미 테이블을 손대기에는 너무 멀리와서 고민중입니다. 미천한 백붕이에게 가르침을 주세요
팀 프로젝트에서 SNS 관련 서비스고, 구현하고 싶었던 기능은 아래와 같습니다
1. 접속한 회원의 관련 데이터(친구, 즐겨찾기한 회사, 좋아요한 게시글, 좋아하는 태그)를 DB에서 조회하고, 각 게시물이 가지고 있는 관심도 점수(댓글 갯수와 좋아요 받은 수)를 합산하여 가장 높은 점수 순으로 보여줍니다.
2. 비회원은 게시물의 관심도 점수 순으로 보여줍니다.
이러한 기능을 만들었을 때 처음에는 DB에 쿼리문을 보내 모든 데이터를 조회하였습니다. 특별히 데이터가 많지않았을땐 문제가 없었으나 각 데이터 1000만건을 생성하고 1000TPS 요청을 보내니 아래와 같은 문제가 발생했습니다.
- 가장 치명적으로 타임아웃이 발생하였습니다.. 정확히 어떤 문제때문이라고는 자세히 알 능력이 부족하여 확답을 드리긴 어렵지만, 거의 모든테이블에 JOIN 연산때문에 커넥션 풀 고갈로 새로운 커넥션 생성에서 발생하는 지연과 리소스 사용으로 인한 문제라고 생각했습니다(제 미천한 추측입니다..)
해결 방안은 고민 중인데 고수님들의 의견을 듣고 싶습니다.. 제가 생각한 문제 해결방법은 이렇습니다
1. 가장 데이터를 많이 탐색하는 게시물 데이터를 Redis에 저장하려합니다. Write-behind 방식으로 처음 데이터는 DB에서 가져오고, 이후로는 레디스에 먼저 작성 및 수정, 특정 시간마다 DB에 쓰기작업을 실행하려합니다.
2. 추천 기능 시 조회는 역인덱스를 지원하는 툴을 사용하려 합니다. 어떤 것을 사용할지 확정은 안했습니다! 해당 기능을 통해 특정 키워드가 담겨있는 ID를 레디스에서 찾아 특정 조건(회원 개인 선호도에 맞춰)에 게시물 관심도 점수를 추가로 더하려합니다.
서버단에서의 해결을 해보려했으나, 서버 자체에서는 연산이 크지않아 수정하여도 속도 개선이나 에러 처리엔 부족하다고 생각했습니다. 단순히 커넥션풀을 늘리기에는 CPU 점유율이 너무 높아져서 포기했고(이것도 제가 잘 몰라서 그런걸수도..) 이미 테이블을 손대기에는 너무 멀리와서 고민중입니다. 미천한 백붕이에게 가르침을 주세요
dba: 적어도 씨발 쿼리로그라도 분석해서 와라 수수께끼하냐 - dc App
추천시스템은 쿼리로 만드는게 아님
나도 잘모르나 아래 영상 참고해보셈
https://youtu.be/LAD6LYnkPsA?si=F8xcHzr1WGBpCfdO
- dc App
https://youtu.be/zJI4bgEJ8IU?si=N2Mm5FKHMOf8UzgB
- dc App
보통 머신러닝 기반 - dc App
말이 추천시스템이긴한데 쓴이가 원하는건 사실상 각 항목별로 가중치를 두고 인기글 보여주는 느낌을듯? 가중치계산해서 페이징하고 게시물 보여줄려는거 같은데 연산 존나게 들어가고 모든 테이블 다 스캔하니까 타임아웃 발생하고... 맞나..?
어찌 됐건 DB에서 처리하기에 적합한 비즈니스는 아니지 저런것들은 보통 DW, ETL 구축해서 아까말한 머신러닝같은 굴린 결과를 서비스에 뿌려주는 형식으로 함 - dc App
얘 말대로 db에서 하기 적합한 서비스도 아니고, 그러다보니 실시간으로 딱 맞을 필욘 없음 추천 게시물이 게시물 하나 쓰여지고 이런거에 따라 매번 유사도가 달라지는데.. 그냥 몇 분 몇 시간 마다 한번 씩 배치 돌리고 캐싱해두는게 최선이라고 봄.. 공부하는 플젝 수준에선