Ask Your Question

Seunghyun's profile - activity

2019-06-24 17:25:53 +0900 answered a question ORM DB 처리시 트랜잭션 관련해서 문의드립니다.

안녕하세요. 아이펀팩토리입니다.

하나의 이벤트 함수에서 Create, Fetch, Refresh 및 ORM Object 의 값 수정은 하나의 트랜잭션으로 처리됩니다. (엔진의 논리적인 트랜잭션이며 DB 의 트랜잭션은 아닙니다.) 이벤트 함수는 롤백에 의해 다시 시작될 수 있고 이 때 이벤트 스레드 중 하나가 할당됩니다.

롤백을 피하기 위해 이벤트를 쪼갤 경우 이벤트 수가 그만큼 늘어나게 되는 것은 맞습니다. 하지만 오브젝트를 DB 나 다른 서버로부터 읽어들이는 시간에는 영향을 주지 않습니다. 오브젝트의 Create(Key 를 갖는 오브젝트에만 해당), Fetch, Refresh 등은 이벤트 함수 최상단에서 불려야 가장 좋은 성능을 보이며, 롤백 시 성능 손실이 적습니다. 구현 과정에 불가피하게 이벤트 함수가 한참 실행된 이후에 이러한 처리가 필요할 경우 이벤트를 쪼개서 롤백에 의한 부하를 줄이거나, 아주 많은 오브젝트를 접근할 경우 잠금 시간이 길어지지 않도록 이벤트를 쪼개 성능 향상을 기대할 수 있습니다.

아래 링크의 이벤트 프로파일링 기능을 이용하시면 궁금증을 해소하시는데 도음이 될 수도 있을 듯 합니다. https://www.ifunfactory.com/engine/do...

감사합니다.

2019-05-22 12:30:10 +0900 answered a question DB에서 오브젝트 검색관련해서 문의드립니다.

안녕하세요. 아이펀팩토리입니다.

해당 문서에 오타가 있는 것을 확인 하였습니다. 아래와 같이 수정하여 사용 부탁드립니다.

const Ptr<std::set<Object::Id> => const Ptr<std::set<Object::Id>>

감사합니다.

2019-04-04 14:29:10 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

Zookeeper 연결이 끊긴 것이고, 아직은 복구 가능한 상태라는 의미의 로그입니다. 이 상태에서는 일부 서비스의 응답이 멈출 것이고, 연결이 복구된 후 응답하게 됩니다. (ORM, AccountManager 등)

만약 이 상태가 40 초를 초과할 경우 복구할 수 없어 서버가 종료됩니다.

이 경우 주키퍼 서버의 상태를 확인해보시는 게 파악에 도움이 되실 수 있습니다.

2019-04-04 14:14:53 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

Json 데이터 로드 및 Register*Handler() 류는 Install() 함수를, Timer.ExpireAfter(), Event.Invoke() 등 처리를 발생시키는 것은 Start() 에서 하시면 됩니다.

Install() 및 Start() 함수에 대한 문서 설명이 없어 곧 보완하도록 하겠습니다.

감사합니다.

2019-04-04 13:57:51 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

/usr/share/zookeeper/bin/zkCli.sh 를 실행하셨을 때 (로컬의 주키퍼서버에 접속합니다.) CONNECTING 과 CONNECTED 둘 중 어느 상태로 나오는지 확인 부탁드립니다.

2019-04-04 13:49:16 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

네 옮겨서 확인 부탁드립니다. install 함수는 핸들러 등록 등 초기화 처리를 위한 것이며 초기화가 완료된 상태가 아닙니다. start 함수는 초기화가 끝난 뒤 불리며 서비스를 시작하는 단계입니다.

2019-04-04 13:44:32 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

만약, Install() 함수에서 Event 등을 만드신다면 Start() 함수로 옮겨서 확인 부탁드립니다. 그래도 해결되지 않으면, 서버 구동 후 출력된 모든 로그를 부탁드립니다.

2019-04-04 13:40:29 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

감사합니다. 로그 파일도 부탁드립니다.

2019-04-04 13:29:33 +0900 answered a question Assert failed: index < the_object_id_to_zk_client_ids.size():

안녕하세요.

아이펀팩토리입니다.

로그와 MANIFEST 의 Zookeeper 설정을 올려주시면 확인이 수월할 듯 합니다.

가사합니다.

2019-03-25 17:37:09 +0900 answered a question ORM Map 사용시 문의 드립니다.

안녕하세요. 아이펀팩토리입니다.

Keys() 를 이용하여 순회 하시면 됩니다. Map 의 Value 가 Object 이고 Foreign 이라면, 미리 모두 Fetch 하신 후 순회하셔야 성능에 문제가 생기지 않습니다. (루프를 돌며 하나씩 Fetch 하는 경우 성능에 매우 안 좋습니다.)

Foreign 일 경우 부모 오브젝트의 Fetch{Map Attribute 이름}() 함수를 이용하여 한번에 불러올 수 있습니다.

감사합니다.

2019-03-12 15:12:11 +0900 commented answer orm 관련해서 문의드립니다.

네 맞습니다.

Character 에 다른 Attribute 들이 많이 늘어날 게 예상되시면 별도의 NickName 모델을 만드시는 게 좋습니다.

2019-03-12 14:53:33 +0900 commented answer orm 관련해서 문의드립니다.

안녕하세요. https://answers.ifunfactory.com/quest... 참고 부탁드립니다.

감사합니다.

2019-03-12 14:52:10 +0900 edited answer orm 관련해서 문의드립니다.

ORM 관련해서 추가 질분 드립니다. 현재 모델 구조가 아래와 같다면,

"Account" : { "id" : "String(64) KEY", "Character": "Character Foreign" }, 
"Character": { "NickName": "String(64) KEY",  "Level": "Integer32" , "Exp": "Integer64" }

사용중인 DB 정보에서 NickName만 새로 변경해야 할 경우 로직적으로 어떤 작업이 필요한지 문의 드립니다.

2019-02-18 14:07:53 +0900 answered a question 매치메이킹 관련 문의 드립니다.

안녕하세요. 아이펀팩토리입니다.

MatchmakingClient 를 통해 전달된 사용자 정의 Context 는 MatchmakingServer 의 context["user_data"] 로 위치가 변경되었습니다.

CheckJoinable 함수에서

 int64_t player_level = player.context["user_data"]["player_level"].GetInteger();

로 수정 부탁드립니다.

해당 수정이 업데이트 Changelog 및 레퍼런스 문서, Poing Game 예제에 반영이 누락된 것을 확인 하였습니다. 번거롭게 해드려 죄송합니다. 곧 업데이트 하도록 하겠습니다.

감사합니다.

2018-12-13 11:49:43 +0900 commented answer 타이머 관련해서 문의드립니다.

Tag 를 무작위 값을 주시면됩니다. 이벤트 스레드 수 만큼 병렬로 실행됩니다.

EventTag tag = RandomGenerator::GenerateUuid();

Timer::ExpireAfter(..., tag);

2018-12-13 11:20:39 +0900 commented answer 타이머 관련해서 문의드립니다.

네 맞습니다. (Tag 인자를 생략하면 기본 값 Tag 를 사용하게 됩니다.)

2018-12-13 10:29:39 +0900 answered a question 타이머 관련해서 문의드립니다.

안녕하세요. 아이펀팩토리입니다.

타이머 핸들러는 이벤트 스레드에서 실행됩니다.

타이머 핸들러들은 타이머를 등록하는 Timer::Expire*(...) 함수의 Tag 인자별로 직렬화 되어 실행됩니다. 같은 Tag 값을 사용하는 타이머 핸들러는 순차적으로 실행됩니다. 만약 앞서 실행된 핸들러 함수가 오랫동안 끝나지 않으면 뒤에 실행될 타이머 핸들러들의 실행이 그 만큼 지연되게 됩니다.

별도로 Tag 인자 값을 지정하지 않으셨다면 모두 동일한 기본 값을 사용하게 되어 순차적으로 실행되게 됩니다.

감사합니다.

2018-12-10 17:44:29 +0900 commented answer ORM 오브젝트 관련 문의 드립니다.

네 맞습니다. 조회 목적의 Query 를 실행하신다면 적절한 Index 를 직접 추가하시면 됩니다.

2018-11-20 10:49:25 +0900 commented answer 패키징 시 MANIFEST 설정 문의

MANIFEST 의 인자가 Json Object 또는 Array 가 아닌 Primitvie 타입(bool, int, double 등) 인 경우 아래와 같이 읽을 수 있습니다.

DECLARE_uint64(api_service_port);

void Example() {
  LOG(INFO) << "ApiService Port=" << FLAGS_api_service_port;
}
2018-11-19 18:20:43 +0900 answered a question 패키징 시 MANIFEST 설정 문의

안녕하세요. 아이펀팩토리입니다.

서비스가 아니라 생성되는 런처 스크립트를 이용하여 실행하신다면 "{ProjectName}-local -api_service_port=1234" 와 같이 실행 인자로도 지정하실 수 있습니다.

감사합니다.

2018-10-16 11:50:20 +0900 answered a question Flavor 구성시 서버 이동 관련 문의 드립니다.

안녕하세요. 아이펀팩토리입니다.

서버 이동은 AccountManager::RedirectClient() 이용을 권장드립니다.

Redirect 된 후 flavor 를 알아내는 방법은 아래 링크 참고 부탁드립니다. https://www.ifunfactory.com/engine/do...

감사합니다.

2018-10-08 15:10:22 +0900 answered a question col__Object_id 질문입니다.

안녕하세요. 아이펀팩토리입니다.

col__Object_id 는 Uuid 값으로 무작위로 생성됩니다. 무작위로 생성하더라도 중복이 발생할 확률이 매우 낮아 중복이 없다고 가정하고 쓰셔도 됩니다.

감사합니다.

2018-07-24 11:26:46 +0900 commented answer 서버가 가끔 crash나는 현상이 발생합니다.

추후 다시 올려주시면 확인해보도록 하겠습니다. 감사합니다.

2018-07-23 09:24:30 +0900 answered a question 서버가 가끔 crash나는 현상이 발생합니다.

안녕하세요.

아이펀팩토리입니다.

확인을 위해 올려주신 로그 위쪽으로 50여줄도 올려주실 수 있으실지요?

감사합니다.

2018-05-24 12:30:15 +0900 edited answer 변경 가능한 닉네임 구현 문의

아래와 같은 방법으로 구현할 수 있습니다.

모델 정의

{
  "Nickname": {
    "Nickname": "String(12) Key",
    "User": "User Foreign"
  },
  "User": {
    "Id": "String(12) Key",
    "Nickname": "String(12)",
    ...
  },
  ...
}

닉네임 설정

string id = ...;
string new_nickname = ...;

Ptr<User> user = User::FetchById(id);

// 새 닉네임 생성
Ptr<Nickname> nickname = Nickname::Create(new_nickname);
if (not nickname) {
  // 이미 사용 중
  return;
}

// 기존 닉네임 제거
Ptr<Nickname> old_nickname = Nickname::FetchByNickname(user->GetNickname());
if (old_nickname) {
  old_nickname->Delete();
}

// 새 닉네임 할당
user->SetNickname(new_nickname);
nickname->SetUser(user->Id());
2017-12-28 15:58:22 +0900 answered a question pong server 실행오류 문의

NIC 은 정상적으로 인식 되어 있습니다. pong-source/src/MANIFEST.lobby.json 에서 RpcService 의 rpc_nic_name 값을 빈 문자열 값 "" 로 해주시거나, NIC 이름으로 변경하면 해결될 것으로 보입니다.

2017-12-28 15:12:28 +0900 commented answer pong server 실행오류 문의

리눅스 터미널에서 ifconfig 명령으로 확인할 수 있습니다. 이 명령 수행 후 출력되는 내용을 보여주실 수 있을까요?

2017-12-28 08:51:43 +0900 answered a question pong server 실행오류 문의

안녕하세요. 아이펀팩토리입니다.

Pong Server 를 실행하는 기계에 NIC(Network Interface Controller) 이 하나 이상인지 확인 부탁드립니다. Pong Server 는 아이펀엔진의 RpcService 를 이용하고 있는데, 이 기능은 NIC 이 없으면 작동하지 않습니다.

감사합니다.

2017-12-22 17:54:14 +0900 answered a question pong server 빌드 오류 문의

안녕하세요. 아이펀팩토리입니다.

  1. pong soruce 를 복사한 경로
  2. 빌드하실 때 입력하신 명령어 및 빌드 명령어를 실행한 경로

를 알려주실 수 있을까요?

2017-12-20 23:15:13 +0900 received badge  Famous Question (source)
2017-12-19 08:52:24 +0900 commented answer 튜토리얼 진행 중 DB 기능 활성화하기에 대한 질문이 있습니다.

재설치는 MySQL 이나 MariaDB 를 재설치를 말씀드린 것이며, root 계정 비밀번호를 다시 설정하기 위함입니다. DB root 계정의 비밀번호는 OS 의 것이 아니라 DB 계정입니다.

2017-12-18 18:23:44 +0900 commented answer 튜토리얼 진행 중 DB 기능 활성화하기에 대한 질문이 있습니다.

입력된 DB root 계정의 비밀번호가 틀린 것으로 예상되는데요, 비밀번호가 맞는지 확인 부탁드립니다. 비밀번호를 잊어버리셨거나, 해결되지 않으면 재설치하여 비밀번호를 다시 설정 부탁드립니다.

2017-12-18 18:12:17 +0900 answered a question 튜토리얼 진행 중 DB 기능 활성화하기에 대한 질문이 있습니다.

안녕하세요. 아이펀팩토리입니다.

MariaDB, MySQL 상관 없이 둘 중 하나를 설치하시면 됩니다.

감사합니다.

2017-10-27 14:55:06 +0900 commented answer aws s3 사용 문의

만약 src/CMakeLists.txt 에 추가했는데도 그렇다면 CMakeLists.txt 와 src/CMakeLists.txt 를 seunghyun@ifunfactory.com 으로 보내주실 수 있을까요?

2017-10-27 14:53:30 +0900 commented answer aws s3 사용 문의

src/CMakeLists.txt 에 추가하신 게 맞는지요?

2017-10-27 11:47:50 +0900 commented answer aws s3 사용 문의
  1. "g++ --version" 명령의 결과를 공유해 주시면 감사하겠습니다.
  2. CMakeLists.txt 의 가장 아래에 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pedantic") 를 추가하여 해결되는지 확인 부탁드립니다.

감사합니다.

2017-10-26 17:25:35 +0900 answered a question aws s3 사용 문의

안녕하세요. 아이펀팩토리입니다.

빌드 에러 발생 시 출력된는 내용을 올려 주실 수 있으신지요?

2017-09-26 10:29:47 +0900 received badge  Famous Question (source)
2017-09-26 10:29:47 +0900 received badge  Popular Question (source)
2017-09-26 10:29:47 +0900 received badge  Notable Question (source)
2017-09-22 09:38:41 +0900 answered a question 복합키와 계정 ID 변경(계정 플랫폼 연동)은 어떻게 해야하나요?
  1. ID 와 ID 를 소유한 플랫폼을 표현하기 위해 두 가지 키가 필요한데 이 것을 복합키로 만들 수 없나요? => 아이펀엔진의 ORM 은 하나의 오브젝트가 둘 이상의 다른 종류의 키를 만들 수 있지만 복합키와 같이 작동하지는 않습니다. 각각 개별적으로의 유일성만 보장됩니다. 하지만 아래 설명된 방법으로 복합키 없이 구현할 수 있습니다.

  2. 게스트 계정을 나중에 Facebook 같은 플랫폼 계정으로 연동하려는데 어떻게 해야하나요? ID 는 Key 라서 변경이 안돼서요 => 아래와 같이 구현할 수 있습니다.

오브젝트 모델 예제

// Platform 계정을 표현
"GuestAccount": {
  "Id": "String(50) Key",
  "Account": "Account"
},
"FacebookAccount": {
  "Id": "String(50) Key",
  "Account": "Account"
},
"TwitterAccount": {
  "Id": "String(50) Key",
  "Account": "Account"
},


// 실제 계정을 표현
"Account": {
  "Cash": "Integer",
  "RegisterDate": "Integer",
  ... // 기타 계정 데이터
}

서버 코드 예제

// Guest 계정을 생성
void OnCreateGuestAccount(const Ptr<session> &session, ...) {
  const string guest_id = ...;  // client 에서 받은 message 에서 읽는다.

  // GuestAccount 생성
  Ptr<guestaccount> guest_account = GuestAccount::Create(guest_id);

  // Account 생성
  Ptr<account> account = Account::Create();

  // GuestAccount -> Account 연결
  guest_account->SetAccount(account);

  // Account 의 기본 값 설정 등 나머지 처리
  account->SetCash(100);
  account->SetRegisterDate(WallClock::GetTimestampInSec());
  ...
}


// Guest 계정을 Facebook 계정으로 연동
void OnCreateFacebookAccountFromGuestAccount(const Ptr<session> &session, ...) {
  const string guest_id = ...;     // client 에서 받은 message 에서 읽는다.
  const string facebook_id = ...;  // client 에서 받은 message 에서 읽는다.

  // Facebook Id 에 대한 인증은 AuthenticationService 로 수행하며,
  // 이 예제에선 생략

  // Guest 계정 불러오기
  Ptr<guestaccount> guest_account = GuestAccount::FetchById(guest_id);
  if (not guest_account) {
    // 존재하지 않는 Guest 계정에 대한 예외처리
    return;
  }

  // Facebook 계정 만들기
  Ptr<facebookaccount> facebook_account = FacebookAccount::Create(facebook_id);
  if (not facebook_account) {
    // 이미 존재하는 Facebook 계정에 대한 예외처리
    return;
  }

  // GuestAccount 로 실제 Account 를 가져온다
  Ptr<account> account = guest_account->GetAccount();

  // GeustAccount 와 Account 의 연결을 끊고, GuestAccount 를 삭제한다.
  guest_account->SetAccount(Account::kNullPtr);
  guest_account->Delete();

  // FacebookAccount 에 Account 를 연결한다.
  facebook_account->SetAccount(account);

  // 기타 나머지 처리
  ...
}

감사합니다.

2017-09-22 09:34:07 +0900 asked a question 복합키와 계정 ID 변경(계정 플랫폼 연동)은 어떻게 해야하나요?
  1. ID 와 ID 를 소유한 플랫폼을 표현하기 위해 두 가지 키가 필요한데 이 것을 복합키로 만들 수 없나요?
  2. 게스트 계정을 나중에 Facebook 같은 플랫폼 계정으로 연동하려는데 어떻게 해야하나요? ID 는 Key 라서 변경이 안돼서요
2017-09-05 10:35:41 +0900 answered a question Protobuf 메시지 파일 추가

안녕하세요. 아이펀팩토리입니다.

src/CMakeLists.txt 파일에 다음 내용이 있습니다.

set(                                                                            
  ADDITIONAL_PROTO_SOURCES                                                      
  ${PROJECT_NAME}_rpc_messages.proto                                            
  ${PROJECT_NAME}_messages.proto                                                
)                                                                               

여기에 추가하시면 됩니다. 예를 들어 my_messages_inven.proto 를 추가하신다면 이렇습니다.

set(                                                                            
  ADDITIONAL_PROTO_SOURCES                                                      
  ${PROJECT_NAME}_rpc_messages.proto                                            
  ${PROJECT_NAME}_messages.proto
  my_messages_inven.proto                                                 
)                                                                               

감사합니다.

2017-08-29 15:20:52 +0900 received badge  Commentator
2017-08-29 15:20:52 +0900 commented answer dump as json

안녕하세요. 아이펀팩토리입니다.

아직 C# 버전에서는 ORM 오브젝트를 JSON 으로 Dump 하는 기능은 지원하고 있지 않습니다. 빠른 시일내에 업데이트 하도록 하겠습니다.

답변이 늦어 죄송합니다.

감사합니다.