사자어흥
10
2020-10-16 02:03:49
3
204

nodejs 로 대량 row 처리


nodejs 를 처음 접해보는 초보입니다.
제가 이해한 개념이 맞는지 궁금합니다.

db 에서 select한 row 가 만약 10만건이라면
php 에선 10만건을 1 row씩  for loop로 작업을 처리하고 응답을 주기엔 너무 오래걸립니다.

node js 에서는 for문을 실행하더라도 일단 응답을 먼저 주고 for 문이 실행된 이후 callback 에서 그 이후 처리를 하게 되는게 맞을까요??

db select 해서 1row씩 처리해야하는 작업 요청이 동시에 많이 들어온다면 nodejs에서 동시에 처리할수 있는 max client 는 얼마나 될까요???


너무 초보스런 질문이라 민망합니다..
0
  • 답변 3

  • 곰개발ㅈ ㅏ
    2020-10-16 08:41:42

    질문에 대한 답을 하기 위해서 좀 더 자세한 요구사항들이 필요합니다. throughput을 계산하거나 scalability를 처리하기 위한 방법은 매우 다양합니다.

    - 다량의 요청을 분산해서 처리하기 위해서는 rabbitmq나 kafka가 쓰입니다.

    - 쓰기보다 읽기가 많은지에 따라 Architecture는 달라집니다.

    - 해당 요청들이 반복될 경우는 couchbase나 redis 같은 cache를 이용할 수 있겠죠.

    통상 10만건의 처리를 한 request에서 처리하는 일은 없습니다. 

  • 도라도로떠납니다
    696
    2020-10-16 11:23:09

    node js 에서는 for문을 실행하더라도 일단 응답을 먼저 주고 for 문이 실행된 이후 callback 에서 그 이후 처리를 하게 되는게 맞을까요??

    -> 응답을 미리주지 않습니다 콜백에서 응답하는겁니다


    db select 해서 1row씩 처리해야하는 작업 요청이 동시에 많이 들어온다면 nodejs에서 동시에 처리할수 있는 max client 는 얼마나 될까요???

    -> db 및 nodejs 시스템의 성능에 따라 달라집니다 다만 nodejs는 싱글 쓰레드라는건 알고 계셔야합니다

    한 요청에서 처리하는 시간이 길어지면 다른 요청처리에 지장을 줍니다

    pm을 통해 동시에 여러 nodejs를 띄울순 있지만

    nodejs 는 하나의 요청에 많은 cpu를 점유하는 처리엔 적합하지 않음을 고려하셔야합니다.

  • 스텁
    2k
    2020-10-16 12:07:22

    말씀하신 개념대로 기본적으로 맞게 이해하신것 같습니다.


    노드 오피셜 사이트의 이벤트루프 설명이 참 좋습니다. 노드에서의 작업은 작은 단위의 작업을 이벤트 루프에 차곡차곡 쌓아놨다가 순서가 되었을때 하나씩 처리 된다로 인지하시면 됩니다.

    셀렉트 1만건을 하되, 루프돌면서 1건씩 비동기 처리후 콜백으로 받아주면 시간이 걸려서 그렇지 논블럭킹이기 때문에 받아줄수 있는 client는 서버 용량에 제약을 받을뿐 다 받아줄수 있습니다.

    다만 콜백으로 처리, 즉 비동기로 처리하기 때문에 애초에 들어온 요청에 대한 응답은 요청이 접수되었다 정도이지 처리가 완료되었다! 라는 응답은 주기가 어렵고 이건 별도의 진행과정 확인 rest api를 제공해주는게 맞아보입니다. 


    약간 별개의 내용으로 1만건을 처리할정도면 배치성이지 실시간 성은 아니니까 업무흐름에 대한 정의도 조금 다르게 해야지 싶긴 합니다. 1만건의 처리는 노드/스프링/기타등등 절대적으로 처리할 시간이 필요한 양인데 보통 온라인성의 클라이언트 요청은 응답시간이 길어야 30초로 제한되는 경우가 많습니다.

  • 로그인을 하시면 답변 을 등록할 수 있습니다.