16.모든 RMI 호출 시점을 접근하기

Edit

ProudNet에서는 네트웍으로 주고받는 메시지, 즉 RMI의 호출 시점을 접근할 수 있는 장치가 있습니다. 이 기능을 활용하면 예를 들어 다음과 같은 것들을 할 수 있습니다.

• 호출되는 모든 RMI의 로그를 남기기

• 각 RMI별로 실행되는 시간을 측정해서 게임 서버 성능을 최적화하기

그림 16-1모든 RMI 호출 시점을 접근하기를 활용한 예

16.1송신측(Proxy) 호출 시점을 접근하기

송신측에서의 호출 시점을 접근하는 방법은 다음과 같습니다.

• 먼저, PIDL 컴파일러 결과물의 Proxy 파생 클래스를 만듭니다.

Proud::IRmiProxy::NotifySendByProxy 를 오버라이드합니다.

이렇게 하면 매 송신시마다 오버라이드한 메서드가 호출됩니다.

기본적으로 Proud::IRmiProxy::NotifySendByProxy()는 호출되도록 설정되어 있습니다만 성능을 더 높이기 위해 Proud::IRmiProxy::NotifySendByProxy() 호출 자체를 막고 싶을 때가 있습니다. 이럴 때는 Proud.IRmiProxy.m_enableNotifySendByProxy 를 false로 설정해주면 Proud::IRmiProxy::NotifySendByProxy()의 호출이 더 이상 되지 않습니다.

16.2수신측(Stub) 호출 시점을 접근하기

수신측에서의 호출 시점을 접근하는 방법은 다음과 같습니다.

  1. Stub 인스턴스의 멤버 변수 Proud.IRmiStub.m_enableStubProfiling 를 true로 세팅합니다.

  2. PIDL 컴파일러 결과물의 Stub의 파생 클래스의 Proud.IRmiStub.BeforeRmiInvocationProud.IRmiStub.AfterRmiInvocation를 오버라이드합니다.

이렇게 하면 매 수신시마다 오버라이드한 메서드가 호출됩니다. 도착한 RMI를 실행 직전에 Proud.IRmiStub.BeforeRmiInvocation가 호출되고 실행이 끝나면 Proud.IRmiStub.AfterRmiInvocation가 호출됩니다. 이를 활용하면 처리 시간이 오래 걸려서 서버 성능에 문제를 일으키는 RMI를 찾는데 도움이 됩니다.

한편, Stub에서는 수신되는 RMI 함수의 파라메터를 모두 출력할 수 있습니다. 그 방법은 다음과 같습니다.

  1. Stub 인스턴스의 멤버 변수 Proud.IRmiStub.m_enableNotifyCallFromStub를 true로 세팅합니다.

  2. Proud::IRmiStub::NotifyCallFromStub 를 오버라이드합니다. 이 메서드는 파라메터를 문자열로 변환한 형태로 받습니다. 예컨대 여기서 로그를 남기면 됩니다.

Proud.IRmiStub.m_enableNotifyCallFromStub를 켜면 RMI 처리 성능이 급격히 떨어집니다. 꼭 필요할 때만 사용함을 권장합니다.

16.3RMI 이름 감추기

호스트가 주고받는 RMI의 이름을 Proud.IRmiStub.BeforeRmiInvocation 등에서 나타나게 하기 위해 ProudNet에서는 모든 RMI의 이름을 실행 파일에 보관할 수 있습니다. 그러나 보안상의 이유로 감추고 싶다면 아래와 같이 해주십시오.

PIDL의 컴파일 결과물 중 ..._proxy.cpp를 include 하기 전에 다음과 같은 정의를 해주십시오.

#define HIDE_RMI_NAME_STRING

1.7.36365 이후 부터, IRmiStub.BeforeRmiInvocation 함수에서는 RMI 함수의 이름이 기본적으로 나타나지 않습니다. 보안상의 이유 때문입니다. 이것이 나타나게 하려면, PIDL 컴파일 결과물의 proxy, cpp 소스 파일이 컴파일 되기 전에 다음을 정의하셔야 합니다.

#define USE_RMI_NAME_STRING