GetRandomUserInfo 질문

문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족한 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.5.0
  • 프로젝트명 : 라이즈
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

안녕하세요 AI를 이용한 PVP를 개발중입니다.
활성화된 유저가 그렇게 많지를 않아 랭킹을 통해 유저 정보를 받아오는 방법보다는 GetRandomUserInfo를 사용하는것이 맞다고 판단되어서 작업중인데요.

GetRandomUserInfo의 value 파라미터의 경우 int만 받을 수 있는것으로 확인되는데 기준이 되는 값인 전투력이 long으로 저장되고 관리되고 있는 상황이라 전투력으로 랜덤 유저 정보 받기 사용이 어려운 상황입니다.

레벨을 기준값으로 받아오면 랭커들의 부 캐릭터들도 같이 검색이 되는 탓에 비슷한 유저들끼리 매칭이 어렵네요

value 파라미터를 long으로 사용할 수 있도록 업데이트 될 예정이나
제가 현재 이 상황을 해결 할 방법이 있을까요?

Where절을 이용한 테이블 조회를 이용하면 매칭 시간이 너무 오래걸린다거나 읽기 사용량이 과도하게 사용되는 등의 문제가 생길까요?

추가 질문
where.Less(“CombatPower”, (long) (maxCombatpower * (1 + (serchCount * 0.1f))));
where.Greater(“CombatPower”, (long) (maxCombatpower * (1 - (serchCount * 0.1f))));

이런 식으로 같은 컬럼 두개 넣을수는 없는건가요?

추가 질문2
테이블중에 Private 으로 설정된 테이블이 있는데요 해당 테이블에 데이터를 다른 유저가 불러와야하는 상황이 생겨서 public으로 수정을 해야할것 같은데 라이브중인 데이터들이라 조금 조심스러운데 문제가 없을까요?

안녕하세요 개발자님.

현재 GetRandomUserInfo의 경우, value와 gap이 int의 형태로만 삽입이 가능했는데 int 외에도 long 또한 지원하도록 하겠습니다.

Where 절을 이용한 데이터 Get의 경우, 숫자형을 이용한 데이터 찾기는 응답시간이 길게 걸리지 않습니다.
limit을 100으로 설정하고 숫자형 데이터를 통해 찾으시면 되겠습니다.
또한 랜덤 검색의 경우, 유저정보와 길드 정보까지 불러오기에 Where절을 이용해 검색하는 것보다 약간의 사용량이 더 발생할 수 있습니다.(where의 조건이 많을경우 달라질 수 있습니다.)

where에 들어가는 key의 경우 한 where의 중복된 key가 들어갈 수 없습니다.
만약 특정 수의 중간 값을 구하고 싶을 경우에는 where.Between을 사용해주시면 되겠습니다.


Private테이블을 Public테이블로 변경할 경우, 해당 테이블을 불러오는 함수중
Backend.Get(“tableName”, new Where()) 식의 모든 정보를 불러오는 로직이 있다면 위험할 수 있습니다.

해당 테이블의 Update, Get, Delete 방식이 inDate를 통해서 혹은 GetMyData를 통해 접근하는 방식로만 구성되어있는지 확인해주세요.

현재 스킬 테이블을 사용하는건

캐릭터 삭제
transactionList.Add(TransactionValue.SetDelete(“Skill”, “inDate”);

데이터 불러오기
SendQueue.Enqueue(Backend.GameData.GetMyData, “Skill”, new Where(), 10, skillData=>

데이터 저장
-Insert
transactionList.Add(TransactionValue.SetInsert(“Skill”, skillParam));

-Update
transactionList.Add(TransactionValue.SetUpdate(“Skill”, “inDate”, skillParam));

이 정도입니다.

안녕하세요 개발자님.

위에서 언급한 설명중 보다 안전한 방법이 존재하여 정정 및 추가답변드립니다.

inDate의 경우, 0.001초까지 동일한 시간에 삽입이 이루어질 경우 동일한 inDate가 생성될 수 있습니다.
private 테이블의 경우 자신이 소유하고 있는 inDate만 사용하기에 문제가 없으나,
public 테이블로 변경할 경우 매우 낮은 확률로 동일한 값의 다른 유저의 inDate에 접근할 가능성이 있습니다.

public 테이블로 전환하는 목적이 단순히 다른 데이터의 읽기(수정, 삭제 X)라면 row의 inDate를 이용하는 것 보다는
where절에 owner_inDate를 이용하여 본인만 가지고 있는 row를 검색하여 불러오는 것을 추천드립니다.

Where where = new Where();

where.Equal("owner_inDate","0000-00-00T00:00:00.000Z");

transactionList.Add(TransactionValue.SetDelete(“Skill”, where);

Where where = new Where();

where.Equal(“owner_inDate”,“0000-00-00T00:00:00.000Z”);
where.Equal(“inDate”,“0000-00-00T00:00:00.000Z”);

transactionList.Add(TransactionValue.SetDelete(“Skill”, where);

or

transactionList.Add(TransactionValue.SetUpdate(“Skill”, where);

그럼 위에 말씀드린 세가지 사용 방법 중 트랜잭션 삭제, 업데이트 부분만
이런식으로 본인이 가지고 있는 row 중 원하는 1개만 삭제하거나 업데이트 하는 방식으로 수정하면 테이블을 public으로 변경해도 문제가 없을거라는 말씀이신가요!?

지금 제가 필요한건 pvp를 위한 private 테이블의 다른 유저 정보를 받아오는 기능인데 혹시 뒤끝 펑션을 사용하면 public으로 바꾸지 않고도 가능한 부분일까요?

Where where = new Where();

where.Equal(“owner_inDate”,“0000-00-00T00:00:00.000Z”);
where.Equal(“inDate”,“0000-00-00T00:00:00.000Z”);

transactionList.Add(TransactionValue.SetDelete(“Skill”, where);

or

transactionList.Add(TransactionValue.SetUpdate(“Skill”, where);

inDate의 경우, where절을 통한 검색은 불가능합니다.
그러므로 owner_inDate 만으로 검색해 주시면 됩니다.

뒤끝펑션에서 사용하더라도 해당 테이블이 public이 아닐 경우, 다른 유저의 정보를 불러오는 것은 불가능합니다.
해당 부분은 private 테이블을 public으로 변경해야만 가능한 점 참고 부탁드립니다.

게임 구조상 테이블 row가 캐릭터 생성시마다 하나씩 인서트되는 구조인데 말씀주신대로 오너인데이트를 이용해서 삭제를 진행하면 해당 유저가 가진 모든 row가 삭제되거나 수정되는것이 아닌가요??

where 절로 검색을 하여 row가 여러개가 검색될 경우, 가장 최신의 데이터 하나만 대상으로 적용이 됩니다.

현재는 개발자님의 구조상 row가 여러개이기 때문에
owner_inDate 하나만으로는 제일 최근에 만든 캐릭터의 정보가 수정/삭제될 수 있습니다.

그러므로 그 캐릭터를 특정할 수 있는 값(nickname등)이 존재한다면 where 절에 추가하여 진행해주시면 될 것 같습니다.

Where에 삽입되는 값

  • owner_inDate
  • 해당 컬럼의 고유값(캐릭터의 닉네임등, 단 inDate제외)
Where where = new Where();
//Backend.UserInDate는 로그인한 유저의 inDate값입니다.
where.Equal("owner_inDate",Backend.UserInDate);
where.Equal("nickname","캐릭터1,2,3,4");

//캐릭터 삭제(수정 필요)
transactionList.Add(TransactionValue.SetDelete(“Skill”, where);

데이터 불러오기(수정 불필요)
SendQueue.Enqueue(Backend.GameData.GetMyData, “Skill”, new Where(), 10, skillData=>

데이터 저장(수정 불필요)
-Insert
transactionList.Add(TransactionValue.SetInsert(“Skill”, skillParam));

-Update(수정 필요)
transactionList.Add(TransactionValue.SetUpdate(“Skill”, where, skillParam));

해당 부분은 추후 업데이트를 통해 유저의 inDate와 데이터의 inDate 동시에 사용하여 검색/수정 가능한 기능을 추가하여 불편함을 줄이도록 하겠습니다.

감사합니다

그냥 Row InDate를 이용한 삭제 업데이트 부분을 현재 그대로 유지하면 안되는 부분인가요? 라이브중인 게임이라 데이터 구조 부분을 손대기가 너무 껄끄럽네요ㅜㅜ

그리구 채팅이 자주 먹통이 됩니다. 현재도 먹통 상태인데 채팅에서 튕기면 재접속하는 로직때문에 게임이 멈추는 현상도 있는것 같습니다.

저번에 공지에서 채팅 먹통 관련 공지를 본것 같은데 아직 해결이 안된 상황인건가요?

일단 지금 채팅 접속이 안되는 부분은 조속히 해결 부탁드립니다. 문의가 너무 많이 옵니다ㅜㅜ

해당 이상 현상은 게임 오픈 직후 처럼 매우 많은 유저(1000명 이상)가 동시에 Insert 했을 경우 매우 낮은 확률로 발생하는 현상이기에, 라이브 도중 변경하는 경우에는 발생할 가능성이 거의 없을 것으로 보입니다.

그러므로 코드 수정 없이 private 테이블의 설정을 public 테이블로 변경하는 작업만 하셔도 됩니다.

설명에 다소 혼란을 드려 죄송합니다.

만약 public 테이블로 변경한 후 inDate가 동일하여 자신의 정보가 아닌 다른 유저의 정보를 가져오는 제보 발생 시 문의해 주시기 바라며, 이부분은 public 테이블에서 자신만의 데이터만을 수정/삭제 할 수 있는 함수를 제공하여 해결할 수 있도록 하겠습니다.


뒤끝챗 인스턴스의 예정되지 않은 재시작이 발생되는 원인을 추적중에 있습니다.
보다 빠르게 해결해드리지 못해 죄송합니다.

조속히 재접속 시 멈춤 현상 발생 및 인스턴스 재시작 관련 이슈를 해결할 수 있도록 노력하겠습니다.