SendQueue 질문

문의를 남기실 경우 다음 항목을 작성해 주시면 빠른 답변 처리에 도움이 됩니다.

  • 프로젝트명 : 라이즈
  • 뒤끝SDK 버전 : 5.5.0
  • 에러 코드 :

테스트를 진행중인데 간헐적으로 랭킹 입장시 로딩창이 뜨고 없어지질 않는다라는 리포트가 있었는데요 현재 랭킹을 가져오는 로직이 성공을 했든 안했든 콜백만 오면 로딩창은 꺼지도록 되어있어서 아예 콜백을 받지 못했거나
SendQueue가 정상적으로 요청을 서버에 보내지 못하고있다라고 판단을 하는게 맞다고 생각이 듭니다 모든 요청을 SendQueue를 이용해서 보내고 있는데요 SendQueue 이용 시 콜백을 받지 못하는 문제가 언제 발생할 수 있을까요?

추가적으로 전 프로젝트인 리턴에서도 이런 현상이 발생해서 끝까지 고치질 못했습니다 뒤끝 SDK에서 큐를 지원하지 않았을때 직접 큐를 만들어서 진행을 해보기도 하고 BackendAsyncQueue 기능이 추가되었을 때는 해당 기능을 사용했지만 고쳐지지 않았었구요 그 때는 실시간 저장이라 저장이 되지 않아 데이터가 롤백이 되는 큰 문제로 발전이 되었었는데 현재는 로컬에도 저장을 하고 있어서 롤백이 발생하지는 않겠지만 큰 문제임에는 다름이 없는 것 같습니다

또 제 판단으로는 SendQueue 쓰레드가 중단되는 상황이 발생할 수 있지 않을까라는 생각으로
SendQueue
이렇게 로직을 추가했는데 이렇게 사용을해도 문제가 없을까요?

안녕하세요 개발자님.

만약 SendQueue.Poll을 호출하는 스크립트가 나누어져 있다면, Backend SDK import 시 함께 제공되는 ToolKit에 SendQueueMgr.cs를 사용하는 것을 추천드립니다.

SendQueue 전용 GameObject를 생성하여 사용하면 DontDestroyOnLoad되어있어 씬 전환에도 제거되지 않고 Poll이 계속 유지되기 때문에 에러가 발생할 일이 더 줄어들 것이라 판단됩니다.

또한 호출 도중에 Exception에서 에러가 발생했을 수도 있으니 테스트 시에 증상이 계속된다면 Exception에 Log를 호출하거나 UI화하면 좋을 거 같습니다.

해당 증상은 테스트 시에 발생되지 못해 정확한 답변은 드리기 어렵습니다만 의심되는 사항은 다음과 같은데,

  1. 한번(한 Tick)에 많은 SendQueue가 추가되는 경우
  2. SendQueue.Enqueue와 동시에 클라이언트 내에 무거운 작업(for문 등)이 실행되는 경우
  3. 실제로 응답이 오지 않았을 경우(Timeout)

1,2,3번 중에 해당되는 부분이 있는지 확인해주시고, 랭킹을 불러오는 함수의 호출 순서를 바꿔보는 것도 시도해주시면 감사하겠습니다.

  • 로딩 UI 표시 함수 호출하기 전에 SendQueue.Enqueue 호출
  • 로딩 UI 표시 함수 호출 이후 제일 마지막 SendQueue.Enqueue 호출

마지막으로 SendQueue의 bool값 initialize는 StopSendQueue를 호출하지 않는 이상 변경되는 일은 없어, 해당 로직에서 else의 값이 호출되는 일은 발생하지 않을 거 같습니다만 에러가 해결되지 않는다면 추가하여 테스트 해보실 바랍니다.

현재 Poll이 들어가 있는 스크립트도 DontDestroyOnLoad 되어 있는데도 SendQueueMgr.cs 로 따로 빼는게 안정성이 더 향상 될까요?

의심 사항 1번에 한 번에 많은 SendQueue가 추가 될 경우라고 하셨는데 몇개정도 들어가야 많다고 판단을 하는걸까요?

또 2번 항목은 잘 이해가 되질 않는데 무거운 작업과 Enqueue가 동시에 실행되는 경우 Enqueue 작업이 실패 할 가능성이 있다는 뜻일까요?

SendQueue 기능만이 있는 게임 오브젝트를 만들어 관리하는 것이 더 안정성이 있다고 보여 SendQueueMgr.cs로 게임 오브젝트를 만드는 것을 추천드립니다.

3~5개 정도이며, 원래라면 한 틱에 많이 Enqueue를 해도 순차적으로 콜백이 오는 것이 정상이지만 테스트로서 최대한의 오류 방지를 위해 호출하는 Enqueue를 줄이는 것을 추천드립니다.

2번은 메인쓰레드의 로직 작동 도중에 다른 쓰레드의 호출 및 응답이 정상적으로 안될 가능성을 고려해보았는데, 해당 부분은 문제가 없을 거 같습니다.

혹은 랭킹을 호출할 때 SendQueue 대신 일반 비동기 함수로 교체하여 로직을 구성하여 오류가 발생하는지도 확인해주시면 감사하겠습니다.

랭킹뿐만 아니라 모든 데이터 저장들도 SendQueue로 구성되어 있어서 일반 비동기로 교체해서 해결된다 해서 이제 와서 모든 함수를 다시 일반 비동기로 바꾸기는 어려운 상황입니다. SendQueue가 일반 비동기 함수에 비해 안정적이라고 해서 교체를 진행을 했는데 아닌건가요? 현재 뒤끝에서 권장하는 방식은 어떤 방식인가요?

현재 권장하고 있는 비동기 호출 방식은 SendQueue를 통해 순차적으로 처리하는 방식입니다.

원래라면 SendQueue.Enqueue를 하면 순차적으로 응답이 오게 되어있지만 현재의 경우,

가끔씩 응답이 오지 않는다고 하여 SendQueue를 비동기함수로 바꾸고 동일하게 테스트하면
SendQueue의 기능에 문제가 발생하는지 혹은 메인이 아닌 다른 쓰레드에서 응답을 받지 못하는 지
원인을 파악하기 위해 해당 요청을 드렸었습니다.

SendQueue의 응답이 오지 않는 이슈가 발생하는지 테스트해보고 있지만 테스트 환경에서는 재현되지 않아 테스트에 어려운 점 양해 부탁드리며,

현재 해결에 도움이 될 만한 방법은 이전에 말한 SendQueue를 비동기함수로 바꾸는 방법보다는

SendQueue.Enqueue가 동시에 되는 로직을 아래와 같이 Enqueue 로 넣은 callback 안에 다음 기능을 Enqueue하는 방식으로 교체하여 동일한 증상이 발생하는지 테스트해주시면 감사하겠습니다.

SendQueue.Enqueue(Backend.GameData.Insert, callback =>
{
    SendQueue.Enqueue(Backend.GameData.Update, callback2 =>
    {
        SendQueue.Enqueue(Backend.GameData.Get, callback3 =>
        {

        });
    });
});

넵 답변 감사드려요 말씀 주신 부분들 다 적용해서 테스트 진행 해보도록 하겠습니다!