미션 모듈 관련

김길규
문의할 제품 미션 
PHP 버전 PHP 8.2 
Rhymix 버전
사이트 주소 https://a.a 

안녕하세요. 오늘 미션 모듈 구매하였는데요, 

 

조금 궁금한 점이, 크론잡을 이용하는 이유가 일일미션 관련해서

유저들 내역을 한번 처리하는 것으로 보입니다.

 

근데 이렇게되면 회원이 많으면 많아질수록 크론잡 소요시간이 더 들테고

XE 코어에는 영향이 적겠지만 서버 자원이 소모 되지않을까 싶은데요.

 

비로그인 유저는 내역을 비울 필요 없이,

유저가 로그인 할 때 비우는걸로 처리하면 XE 코어 내에서 다 처리가 가능하지 않을까요?

휴먼회원이나 스팸회원이 많은 경우에 효과적일 것 같아요.

 

출석부 모듈같은거 보면 자동로그인 상태여도 해당 작업이 가능해보이고요.

 

아님 라이선스 인증/업데이트 때문에 크론잡을 사용하는데

여기에 유저 일일미션 비우는 기능도 겸사겸사 넣은거라고 보면 될까요?

웹개발을 조금씩 배우고있는데, 의도가 궁금합니다.

 

아 그리고, 한정미션은 업데이트 예정이라고 되어있는데

이건 기약이 없는걸까요?

 

감사합니다.

 

댓글
1
  • Waterticket
    2024.10.24

    안녕하세요

    우선 질문주신 내용에 대해 답변드리겠습니다.

     

    크론잡을 활용해서 일일 데이터 갱신을 배치로 처리하는 이유는 효율성과 안정성 때문입니다.

     

    1. 효율성

     

    예를들어 1만명의 사람이 일일미션을 하고있는 상황이라고 보겠습니다.

    말씀하신대로 로그인을 할때 데이터를 비운다고 가정하면, 유저가 로그인할때마다 날짜가 지났는지 체크하고 지난 데이터라면 해당유저의 데이터를 삭제하는 작업을 1만번 해야겠죠.

    DB I/O가 조회와 삭제 최소 2번은 진행되니 단순 수치로 2만번의 쿼리를 DB에 날리게 됩니다.

     

    그러나 크론은 0시에 무조건 실행되기때문에 조회없이 0시에 DB 삭제 쿼리 한번만 날려주면 됩니다.

    데이터 삭제는 사람이 인지할 수 없을정도의 속도로 처리되며, 마찬가지로 인지할 수 없을만큼의 자원을 먹습니다.

    수백만건의 데이터도 0.1초안에 처리하는 DB의 처리능력을 무시하시면 안됩니다.

     

    또한 흥미로운점은 쿼리를 날리는 작업또한 리소스를 어마무시하게 먹는다는점입니다.

    쿼리는 순수하게 명령어만 던진다고 실행이 되는것이 아닙니다.

    TCP 소켓 연결, DB 로그인 인증작업이 끝나야만 비로소 쿼리 하나를 던질 수 있게됩니다.

    이를 개발용어로 오버헤드라고 합니다.

    이 오버헤드를 줄이기 위해 최소한의 연결로 대부분의 데이터를 처리하는것이 효율성의 영역인데, 말씀하신 방법은 오히려 1만번의 인증작업과 2만번의 쿼리를 전송하는 효율성이 극도로 떨어지는 방식입니다.

     

    물론 요즘 DB의 처리방식이 그렇게 바보같지도 않고, 말씀하신 방식으로 개발하셔도 속도면에서 인간이 인지하기는 힘들정도의 차이만 나게 됩니다.

    다만 말씀하시는 방법이 효율성 측면에서는 이득을 볼 수 없다는 점을 말씀드리고 싶습니다.

     

     

    2. 안정성

     

    배치의 큰 장점은 일관성이 보장된다는 점입니다.

    DB를 관리하는 측면에서 오늘 로그인한 사람은 새로운 데이터인데, 오늘 로그인하지 않은사람은 오래된 데이터라면 어떨까요?

    어떤 사람은 오늘 미션 수치가 반영되어있는데, 어떤 사람은 3주전의 일일미션 수치를 가지고 있다면요?

    특정 유저에게 포인트를 지급해서 포인트 일일 미션 달성처리를 하고싶은데, 아직 로그인하지 않은 사람이였다면요?

    만약 사이트의 오류로 로그인을 했는데 미션이 초기화되지 않았다면요?

     

    그렇다면 반대로 날짜가 바뀐 시점에 최초로 로그인한 유저가 모든 유저의 데이터를 초기화한다고 가정해봅시다.

    두명 이상의 유저가 동시에 로그인을 했다면 어떻게 될까요?

    만약에 DB가 블로킹 상황에 도달해서 초기화를 하는 유저가 무한로딩 상황에 걸린다면요?

    무한로딩을 하다가 취소해버리면 DB쿼리는 실행되기 전으로 돌아가는데 그럼 초기화는 된건가요?

     

    유저의 인터렉션에 배치 작업을 돌리는 것은 굉장히 위험한 일입니다.

    특히 위에 나온 사례 말고도 고려하지 못한 케이스들이 수도없이 튀어나올 수도 있습니다.

     

    다만 크론잡을 통해 데이터를 초기화한다면 유저들이 정상적으로 데이터에 접근하는 동안, 백그라운드에서 데이터를 처리할 수 있으니 유저 문제가 발생하지 않게 되는것이죠.

    유저 상관없이 모든 데이터를 단 한번만 날리게 되는것이니 이슈가 발생할 가능성도 극히 낮아집니다.

     

     

    따라서 미션 모듈은 수십 수백만건의 데이터를 안정적으로 처리하기 위해 배치를 선택하였습니다.

     

     

     

    그리고 한정미션은 업데이트 예정으로 되어있지만 아직 기약은 없는 상황입니다.

    제가 내년 중순부터 조금 여유가 생겨서 내년 정도에 급한 이슈부터 처리해나갈 예정이니 조금만 기다려주시면 감사드리겠습니다.

댓글 쓰기
권한이 없습니다.