유저 데이터 백섭 관련 문의

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.4.3
  • 프로젝트명 : 푸른달 : 새벽의 여정

안녕하세요. 현재 마케팅을 앞두고 있는데 유저 데이터 관련 이슈가 꾸준히 발생해
제 저장 방식에 문제가 있는 건지 알고 싶어 문의드립니다.

현재 푸른달 저장방식은 다음과 같습니다.

  1. 캐릭터 생성 시 insert 형태로 테이블 저장 <동기 방식>
  2. 100초 주기로 자동 저장 (모든 테이블 Update) <sendqueue 방식>
  3. 특정 행동 이후 (강화, 합성, 분해, 뽑기) 즉시 Update로 테이블 저장 <sendqueue 방식>
  4. 게임 종료시 insert 형태로 테이블 저장 <동기 방식>
  5. 뒤끝 서버와 연결 실패 시 bool을 활용하여 모든 저장 중단

불러오기는 다음과 같이 활용하고 있습니다.
(게임 접속 시 최초 1회 로드)

(코드 예시)
#1.

    public void Load_PlayerInfo_Indate()
    {
        Server_Failed = true; // 뒤끝 서버 통신 실패 체크 

        BackendReturnObject bro = Backend.GameData.GetMyData("PlayerInfo", new Where(), 1);

        if (bro.IsSuccess() == false)
        {
            return;
        }

        if (bro.GetReturnValuetoJSON()["rows"].Count <= 0)
        {
            Retry += 1;

            if (Retry == 2)
            {
               game_exit();
            }
            else if (Retry <= 1)
            {
                Load_PlayerInfo_Indate(); // 재실행
            }
            return;
        }

        if (bro.IsSuccess() == true)
        {
            Retry = 0;
            GetPlayerInfo(bro.GetReturnValuetoJSON());
        }
    }

#2.

void GetPlayerInfo(JsonData returnData)
    {
        // ReturnValue가 존재하고, 데이터가 있는지 확인
        if (returnData != null)
        {
            // rows 로 전달받은 경우 (전달 받을 데이터 여러개)
            if (returnData.Keys.Contains("rows"))
            {
                JsonData rows = returnData["rows"];

                for (int i = 0; i < rows.Count; i++)
                {
                    PlayerInfoGetData(rows[i]);
                }
            }
            else if (returnData.Keys.Contains("row"))
            {
                JsonData row = returnData["row"];
                string owner_inDate = row[0]["owner_inDate"]["S"].ToString();
                PlayerInfoGetData(owner_inDate);
            }
        }
        else
        {
            Debug.Log("데이터가 없습니다.");
        }
    }

#3.

void PlayerInfoGetData(JsonData data)
    {

(중략...)

        var load128 = data["C_key"][0]; // 1 ~ 128개의 데이터
        C_key = int.Parse(load128.ToString()); // 1 ~ 128개의 데이터 가져옴 

        Server_Failed = false; // 뒤끝 서버 통신 성공
        Load_End += 1;
    }

이렇게 사용중인 와중에 몇몇 유저 분이 데이터 백섭 (1~2시간 심하면 12시간까지) 이 빈번하게 발생하고 있습니다. 아무래도 Insert방식이 아닌 업데이트로 저장을 처리하다 보니 복구도 힘든 상황인데요. 확인해주실수있을까요?

안녕하세요 개발자님.

먼저 위의 로드하는 코드는 이상이 없는 것으로 보입니다.

만약 bro.IsSuccess()가 false일때 별도의 에러처리가 없다면 게임데이터를 로드하지 못해 문제가 발생할 수 있으니 아래 Retry 로직을 이용하여 한번 더 시도하는 것을 권장드립니다.

    public void Load_PlayerInfo_Indate()
    {
        Server_Failed = true; // 뒤끝 서버 통신 실패 체크 

        BackendReturnObject bro = Backend.GameData.GetMyData("PlayerInfo", new Where(), 1);

        if (bro.IsSuccess() == false)
        {
            Retry += 1;

            if (Retry == 2)
            {
               game_exit();
            }
            else if (Retry <= 1)
            {
                Load_PlayerInfo_Indate(); // 재실행
            }
            return;
        }
        if (bro.GetReturnValuetoJSON()["rows"].Count <= 0)
        {
            Retry += 1;

            if (Retry == 2)
            {
               game_exit();
            }
            else if (Retry <= 1)
            {
                Load_PlayerInfo_Indate(); // 재실행
            }
            return;
        }

        if (bro.IsSuccess() == true)
        {
            Retry = 0;
            GetPlayerInfo(bro.GetReturnValuetoJSON());
        }
    }

문제가 되는 부분은 업데이트로 확인이 됩니다.

말씀해주신 유저의 경우, 06일 12시 30분에 접속하여 18시 30분까지 지속적으로 플레이를 하였습니다.

하지만 로그중에는 Backend.GameData.Update 함수 호출이 13시 10분 이후로 되지 않고 있다가 18시 20분에 DugenRank를 2번 업데이트하고 게임이 종료된 것으로 확인이 됩니다.(그동안 PlayerInfo는 업데이트 되지 않았습니다.)

해당 시간동안에는 Backend.URank.User.GetMyRank,Backend.GameData.Get, Backend.URank.User.UpdateUserScore가 주로 호출이 되었으며 그로 인해 랭킹에는 등록이 된 것으로 확인됩니다.(랭킹에 등록하는 테이블은 StageRank이기에 해당 테이블만 업데이트 되고, 관련된 PlayerInfo는 저장되지 않았던 것으로 보입니다.)

게임이 종료된 시간인 2022-02-06T9:30:00.000Z 즈음의 indate가 생성되지 않는 것으로 보아 100초마다 주기적으로 업데이트 되는 로직 및 Insert되는 로직이 정상적으로 작동하지 않는 것으로 추정이 됩니다.

일부 유저 및 게임 동작 초기에는 정상적으로 실행되고 있으며, 랭킹 관련 함수는 지속적으로 요청이 되는 것으로 보아 업데이트가 반복되는 로직이 안되는 것 같아 해당 부분을 확인해보시는 것을 추천드립니다.

마지막으로 에러 발생시나 업데이트 시에 InsertLog등으로 로그를 삽입하여 에러가 발생했는지, 데이터가 변경되었는지 확인하도록 게임 로그 기능도 삽입하는 것을 추천드립니다.
(대부분의 게임 개발사의 경우 해당 기능을 이용하여 cs처리 및 에러 파악에 이용하고 있습니다.)

감사합니다. 아무래도 저장 관리 bool 값 문제인 것 같아 수정하였으며, 로그 삽입 기능 적극적으로 활용하겠습니다. 구체적인 답변 주셔서 너무나 감사합니다.

죄송하지만 한 가지만 더 여쭤보겠습니다. 해당 시간 동안 해당 유저의 Backend.URank.User.GetMyRank 함수는 혹시 100초마다 진행 되었을까요? 검수 앞두고 마지막 점검중이라 확실히 하고 싶은 마음입니다.

안녕하세요 개발자님,
해당 유저 확인시 말씀하신것 처럼 100초 간격으로 꾸준히 함수 호출이 이루어진 것으로 확인됩니다. :D

확인해주셔서 감사합니다.

추가로 일부 시간대에 조금 긴 텀을 두고 호출이 이루어진 경우도 확인됩니다.
3~10분정도 차이가 발생한 경우도 있는 것으로 확인됩니다.
자세한 호출 정보는 DM 으로 전달드리겠습니다.

아 자동 저장 함수 확인을 위해 문의드렸던 내용으로 100초 주기로 갱신되었다면 함수 자체는 정상적으로 작동하고 있음을 확인했습니다. 보내주지 않으셔도 될것 같습니다. 감사합니다.

좋아요 1