먼저 기존 질문에 대한 답변부터
쓰레드가 늘어나면 메모리점유율 과도해지고
ㄴ 쓰레드 늘린다고 처리량이 늘어나는게 아님, 쓰레드 경합과 다른 리소스들의 병목 때문에 메모리 점유율이 과도해질 정도로 쓰레드를 늘릴 일이 없음
ㄴ 최신 톰캣에서는 요청을 받아서 일단 큐에 넣어두고, 남는 워커스레드가 있으면 요청을 큐에서 꺼내 할당하는 식으로 처리함. 예전처럼 쓰레드 개수 = 동시 처리 가능한 요청 개수가 아님
적당히쓰자니 대기시간의 불편함..
ㄴ 위의 답변으로 해결됐을듯?
메모리 점유율 과해지면
ㄴ 위의 답변으로 해결됐을듯?
DB쪽이 캐싱밀리거나 어디손실될것같은데
ㄴ 서버 메모리 점유율이 과해졌는데, 왜 DB쪽 캐싱이 밀림?
이걸단순하게 스케일아웃이나 스케일업으로 돌리는건 흑우같고
ㄴ 이걸 단순하게 처리하는게 핵심이고, 스케일아웃으로 처리함
배민이 저녁시간에 특정시간에만 몰린다쳤을때
중복요청은 제거하고 특정데이터만 캐싱하고
로컬쪽으로 돌리거나 그렇게 해결하나?
ㄴ 특정 시간에만 스케일아웃 할 수 있도록, 증설이 간편한 클라우드를 사용함
---------------------------------------------------------------------------------
대규모 트래픽 처리를 현업에서 하는 방법은 이 글 하나로 정리할 수 있는게 아님
보통은 DB가 가장 문제라서 그거만 이야기할 생각
api 서버 같은건 가장 싸구려 자원으로, 필요하면 늘려버리면 그만임
가장 흔한 병목 해결(mysql 쓰는 경우)
ㄴ 읽기 요청이 늘어난다 -> DB 조회가 늘어난다 -> 커넥션풀이 부족해진다 -> redis나 로컬 메모리에 데이터를 캐시해서 DB 조회를 줄인다
ㄴ 대부분의 서비스는 읽기 비율이 훨씬 높음, 쓰기 요청 늘어나면 답 없음
ㄴ slave DB를 늘리는 것도 방법인데, 무한히 늘릴수는 없음. 복제 부하때문에 master DB가 터져버리기도 하고, 읽기가 그정도로 늘어나면 보통 쓰기도 어느정도는 늘어나버림. 이 외에도 여러가지 문제가 있음
트래픽이 아주 크고 쓰기가 많은 경우 병목 해결
ㄴ 이 경우에는 단순 slave만 늘려서 될 일이 아니고 분산 DB를 도입해야함
ㄴ 그 외에도 아주 많은 도구와 설계가 필요하지만 단순하게 DB만 보면 그렇다는 것이고, 이 DB는 자유로운 증설이 불가능함. 최대 트래픽에 대비해서 미리 늘려둬야함
깔끔하다 ㅇㅇ
눈 정화
다시 말하지만 의문을 가지는건 아주 좋음 근데 너무 거만해
스레드 늘리지말고 논블로킹하쟈
모든 api 서버를 논블로킹으로 도배하면 운영비용이 급상승함
이걸대답해준다고
글 쓰는 방식이 이상한게 문제지, 답할만한 질문이긴 하잖아 어젯밤엔 자야돼서 폰으로 대충 댓글 단거였음
궁금한게 있습니다. 만약 쓰기 작업할 데이터가 실시간성이 중요하지 않다면 메세지큐에 데이터를 모아서 일정량만큼 한번에 배치처리하면 db부하를 줄일 수 있을까요?? db입장에서 필요한 커넥션 횟수를 줄일 수 있고 bulk insert 하나의 쿼리로 처리할 수 있어 부하가 덜 할 것이라는 생각인데 맞는 생각인지 접근 자체가 틀린건지 궁금합니다
부하 줄어드는거 맞고, 실제로도 쓰는 방식임
그렇군요.답변 감사합니다! 추가적으로 저는 이 방식을 주문에 대한 결제(pg사) 승인 이후 결제 및 주문 상태를 업데이트하는 용도로 사용하려고 하는데 적합할까요?? 결제 승인 결과는 곧바로 사용자에게 응답하고, 이후 결제 및 주문상태를 업데이트하는 것은 결과적 일관성만 지켜진다면 괜찮다고 생각해서 비동기 처리로 전환하고자 하는데 올바른 판단인지 확신이
안섭니다.. 배치 처리를 하다가 특정 데이터의 문제로 전체 쿼리가 실패하는 케이스(그럴 일이 있나?) 오히려 좋지 않은 사용자 경험을 줄 수 있지 않을까??라는 생각도 들어요
거기다가 쓸 일은 아닌듯..
ㅠ답변 감사합니다..
그런건 최적화라서 필요할때 하면 됨 구조적으로 선행해서 고민할 문제는 아냐
넴..사실 위 작업은 이미 시도했다가 롤백한 케이스입니다ㅠ 성능테스트 시도중에 커넥션 타임아웃 에러 발생 -> hikari cp max connection 증가 -> 타임아웃 확률감소 -> 서버 스케일아웃 -> db max connection 초과 & db 부하 증가 -> SQS & Jdbc batchinsert 흐름으로 변경하면서 테스트했는데
쓸데없이 너무 이것저것 시도했나 라는 생각이 들어서 다시 철회했어요..
성능이란건 필요한만큼 나오면 되는거라서, 니가 임의로 구축한 환경에서 성테하는게 별 의미가 없어
그냥 그런 수단이 있겠구나 정도까지만 학습하고 넘어가
넵 알겠습니다 감사합니다 ㅎㅎ 혹시 종종 질문거리 있으면 여쭤보고싶은데 오카방 링크 받을 수 있을까욤
https://open.kakao.com/o/s13NHEQe
NIO 논블로킹개념이 톰캣방식이랑은 다르건가? 요청받은걸 남는워커스레드가 존재해야 큐에서 가져간다는건 결국 그 안에서 블로킹방식같은데 이말은 (워커)쓰레드수가 동시처리가능 요청갯수랑 비슷한것같은데 - dc App
또또 금쪽이 화법 쓴다 모르면서 왜 가정을 하고 자빠졌어
NIO가 뭔지 톰캣에서 NIO를 어떻게 쓰는지 알아? 모르잖아? 톰캣 NIO 커넥터에서 Java NIO를 가져다가 쓰는건데, 너는 커넥터가 뭔지 워커가 뭔지도 모르잖아? 논블로킹이 뭔지, 동시처리가능이 뭔지도 모르잖아? 모르는건 문제가 아닌데 말투가 뭔가 안다는듯이 말하잖아 이놈아 ㅋㅋ..
웹플럭스도 "진정한 동시" 처리 개수는 워커스레드 개수만큼이야 더 깊게 보면 진짜 동시는 cpu의 스레드 개수 만큼이긴 하지만.. api 서버에서 일반적인 동시 처리 개수라는건 얼마만큼의 요청을 수용할 수 있느냐야 동시 처리 개수를 넘어서면 더이상 수용할 수 없다고 오류를 반환하지
그리고 Java NIO의 논블로킹 개념과 톰캣의 워커 스레드는 별다른 연관이 없어 서버가 어떻게 동작하는지 공부해보라고 했는데, 공부도 안하고 돌아왔냐 이기야
화법은. .고치도록 노력할게.. 사실 톰캣에서 nio를 어떻게쓰는지도 모르고 커넥터는 요청으로 알고 워커는 잉여쓰레드느낌으로 배우긴했어.. 그렇게 말하니 진짜 난 대충 겉핥기식으로 아는구나.. - dc App
미안행.. - dc App
잘하자
내가 그냥 멍청한건지 나 그래도 cs나름대로 열심히 했다고 생각했는데 너가말하는 "서버"라는 지식은 어디서 얻는거야? 단순히 프젝으론 이렇게 못얻는것같은데 싸피할때도 이정도 깊이는 못본것같아 - dc App
톰캣 동작 방식 구글링해봐, tomcat configuration도 구글링해보고 그렇게 이론적인 지식을 쌓은 다음 디버깅을 해봐 톰캣 소스도 디버깅 가능함
뭐든 파고들면 다 나오는거야 세상에 모르는거 투성이인데 왜 파고들지 않는건지 모르겠네 니가 기획자야? 일반 유저야? 돈받고 개발 하려는 사람이 그런 마인드면 곤란해
귀찮게해서 미안한데 마지막으로 ..! 원래 취준생이 이정도는 기본적으로 알고가는게 좋은거야? 아니면 내가 수준미달인거야? 사실 취준은 이번이 처음이라 대부분기업이 면접10월때 볼것같은데 판가름이 안나네 - dc App
싸피는 그냥 돈주는 국비임 개발자 성장으로는 쓰레기
어디를 노리느냐에 따라 다르긴 한데, 서비스 대기업 노린다면 알아야지
이야 지나가는 백붕이 빤스에 지리고갑니다