NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서

T
tcaesvkKCVA, Principal Research Engineer um NEXON Korea Corporation
네트워크 비동기 통신,
합의점의 길목에서
㈜넥슨
신규개발3본부 개발1실 GTR팀 성능연구유닛
김재석
다룰 내용
네트워크 프레임워크 프레임워크
개발 목표 및 구현
시기별 시도 방법 및 쟁점
시연
연관 강연
NDC2010
패킷 지옥으로부터 탈출
NDC2011
마비노기 영웅전 자이언트 서버의 비밀
C++ 프로그래머를 위한 C#
용어
서비스 : 비동기 요청을 처리하는 주체
IDC의 그것이 아님
클라이언트 : 비동기로 요청을 보내는 주체
고객 시스템에 배포되는 그것이 아님
책임연구원
2010/2011, 마비노기2
2006/2009, 마비노기 영웅전
테크니컬 디렉터
2004/2005, 마비노기
2003/2004, 프로젝트 T2
2001/2003, Oz World
[ɡ̊ɪm̚ ʨæːsɤk̚]
/ɡim ɟɛːzʌɡ/
목적
네트워크 코딩에 스트레스 받지 말자
사용하는데 지나치게 지식을 요구하지 말 것
문제
네트워크 통신 ≠ 비즈니스 로직
네트워크 통신≠ 비즈니스 로직
비동기 로직을 꼼꼼하게 처리하면 좋겠다.
모든 송수신은 우아하고 효과적으로.
네트워크 또는 비동기?
네트워크 통신 ≠ 비즈니스 로직
필요한 정보가 요구되는 시점에
즉시 계산될 수 있는 것으로
생각하고 싶다.
또 다른 문제
C++ / C# 두 언어를 잘 지원할 것
방향
우아하고 효과적인 네트워크 코드는 “생성”
C++ / C# 두 언어에서 상호 운용이 되도록
생성되는 코드가 논리의 흐름을 끊지 말 것
기반수준에서 기술되는 고급지식은 숨길 것
상충하는 설계 목표
시스템 프로그래머
혹은
응용 프로그래머
설계목표 –
시스템 프로그래머
설계목표 –
응용 프로그래머
상충하는 설계 목표
시스템 프로그래머
혹은
응용 프로그래머
실제 문제의 본질
메시지 생성 및
프토토콜 반복기
1차 시기
메시지 생성
C# : LCG (Lightweight Code Generation)
4.0에서는 Expression Trees로 대체 가능
var dm = new DynamicMethod(…);
var il = dm.GetILGenerator();
…
@delegate = dm.CreateDelegate(…);
C++ : Visual Studio 매크로 또는 하드 코딩
쟁점
좋은 점
• C#은 데이터 형식만 만들면 직렬화 코드를
작성할 필요가 없다.
나쁜 점
• C++ 코드 생산성
• C# 형식의 가변성 / 제네릭 처리
프로토콜 반복기 (client)
var op = new Operation() { … };
op.OnComplete += _ => { … }; // ②
op.OnFail += _ => { … }; // ②’
RequestOperation(loc, op); // ①
프로토콜 반복기
(service)
IEnumerable<object> Run()
{
var op = Operation;
var info = …;
yield return info.ID;
yield return info.Name;
}
쟁점
좋은 점
• 연관 코드가 가까이 있음 (클라이언트)
나쁜 점
• 반복자 때문에 서비스 코딩 난이도가 높음
• C++에 사용 불가
• 중간 처리가 필요한 비동기 작업이 드묾
대리자 기반
코드 생성
2차 시기
대리자 기반
C# 대리자를 IDL (Interface Definition
Language)로 사용
[OperationContract]
public delegate bool
Authenticate(string credential);
ref T, out T
코드 생성
C++ Client / CLI Service를 가정하고
C++ / CIL 코드 생성
Hindley-Milner 형식 유추
불변성 : ref
가변성
공변성 : out, return
반공변성 : in
코드 사용 (C++ client)
channel->BeginAuthenticate(
credential, endAuthenticate,
object);
void EndAuthenticate(IAsyncResult*
asyncResult)
{
bool result = channel->
EndAuthenticate(asyncResult);
}
코드 사용 (CLI server)
public void Handle(
long clientID,
ref AuthenticateInvoke arg)
{
var response =
new AuthenticateReturn(
ref arg,
Validate(arg.Credential));
Server.Current.Return(
clientID, ref response);
}
쟁점
좋은 점
C#에서 패킷을 기술하면 클래스 자동 생성
나쁜 점
프로토콜의 연관성을 기술할 방법이 없음
클라이언트/서비스 코드의 대칭성 없음
높은 요구 배경 지식  Copy&Paste
유지보수성 (C++ / CIL)
인터페이스 기반
코드 생성
3차 시기
인터페이스 기반
C# 인터페이스를 IDL로 사용
[ServiceContract]
public interface IServiceProvider
{
[OperationContract]
bool SampleMethod(int arg1, ref float arg2, out string arg3);
[OperationContract(IsOneWay = true)]
void SampleOneWayMethod();
[OperationContract]
long SampleProperty { get; set; }
[OperationContract]
event EventHandler SampleEvent;
}
코드 생성
Client / Service 코드를 CodeDOM으로
C++ / CIL 양쪽에 대칭으로 생성
Asynchronous Programming Design Patterns
권고를 따라 생성
자명한 Serializable 형식은 C++에 복제
(열거형 등)
코드 사용 (열거형, C++)
// [System::SerializableAttribute()]
struct Facing : public System::ValueType
{
enum EnumType { Front = 0, Back = 1 };
typedef Int32 UnderlyingType;
static const EnumType MinValue = Front;
static const EnumType MaxValue = Back;
static const std::vector<Facing>& GetValues() { … }
static bool TryParse(const String& s, /*out*/Facing& result) { … }
static Facing Parse(const String& s) { … }
Facing() { … }
Facing(EnumType value) { … }
explicit Facing(UnderlyingType value) { … }
operator EnumType() const { … }
bool operator==(const Facing& value) const { … }
bool operator==(EnumType value) const { … }
String ToString() { … }
const String& ToString() const { … }
…
};
코드 사용 (client)
public void SampleMethodAsync(int arg1, ref
float arg2);
public void SampleMethodAsync(int arg1, ref
float arg2, object userState);
public event
SampleMethodCompletedEventHandler
SampleMethodCompleted;
protected IAsyncResult BeginSampleMethod(int
arg1, ref float arg2, AsyncCallback
callback, object @object);
protected bool EndSampleMethod(IAsyncResult
asyncResult, out float arg2, out string
arg3);
코드 사용 (client)
// C#
client.SampleMethodAsync(arg1, ref arg2,
e =>
{
try
{
string arg3;
var result = e.Return(
out arg2, out arg3);
…
}
catch (CommunicationException)
{
…
}
});
코드 사용 (client)
// C++
using namespace IServiceProviderEvents;
…
client->SampleMethodCompleted() +=
new SampleMethodCompletedEventHandler(*this, &OnSampleMethodCompleted);
…
client->SampleMethodAsync(arg1, arg2);
void OnSampleMethodCompleted(Object* sender, SampleMethodCompletedEventArgs* e)
{
try
{
float arg2;
String arg3;
bool result = e->Return(arg2, arg3);
…
}
catch (const Pointer<Exception>&)
{
…
}
}
코드 사용 (server)
// C#
public override bool SampleMethod(
int arg1, ref float arg2,
out string arg3)
{
…
}
// C++
bool SampleMethod(int arg1, float& arg2,
/*out*/String& arg3)
{
…
}
쟁점
좋은 점
작업을 위해 필요한 코드의 자동 생성으로
실제 개발에 투하되는 시간을 확보
C++ / CLI 양 쪽에서 일관성 있게 작업
나쁜 점
상속을 사용해서 생기는 제약
시연
Q&A
@tcaesvk
1 von 39

Recomendados

[C++ Korea] Effective Modern C++ mva item 7 distinguish between and {} when c... von
[C++ Korea] Effective Modern C++ mva item 7 distinguish between and {} when c...[C++ Korea] Effective Modern C++ mva item 7 distinguish between and {} when c...
[C++ Korea] Effective Modern C++ mva item 7 distinguish between and {} when c...Seok-joon Yun
819 views20 Folien
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type... von
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...Seok-joon Yun
3.2K views19 Folien
[C++ korea] effective modern c++ study item 7 distinguish between () and {} w... von
[C++ korea] effective modern c++ study item 7 distinguish between () and {} w...[C++ korea] effective modern c++ study item 7 distinguish between () and {} w...
[C++ korea] effective modern c++ study item 7 distinguish between () and {} w...Seok-joon Yun
2.2K views16 Folien
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준 von
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준Seok-joon Yun
2.4K views23 Folien
Visual studio 2010 von
Visual studio 2010Visual studio 2010
Visual studio 2010MinGeun Park
872 views32 Folien
C++17 Key Features Summary - Ver 2 von
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
17.6K views83 Folien

Más contenido relacionado

Was ist angesagt?

C++20 Key Features Summary von
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features SummaryChris Ohk
9.9K views77 Folien
[C++ Korea 2nd Seminar] C++17 Key Features Summary von
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
10.5K views79 Folien
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기 von
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
6.8K views79 Folien
[C++ korea] effective modern c++ study item8~10 정은식 von
[C++ korea] effective modern c++ study item8~10 정은식[C++ korea] effective modern c++ study item8~10 정은식
[C++ korea] effective modern c++ study item8~10 정은식은식 정
2.6K views15 Folien
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ... von
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...Seok-joon Yun
3K views21 Folien
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23 von
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23Seok-joon Yun
1.5K views33 Folien

Was ist angesagt?(20)

C++20 Key Features Summary von Chris Ohk
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
Chris Ohk9.9K views
[C++ Korea 2nd Seminar] C++17 Key Features Summary von Chris Ohk
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
Chris Ohk10.5K views
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기 von Chris Ohk
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk6.8K views
[C++ korea] effective modern c++ study item8~10 정은식 von 은식 정
[C++ korea] effective modern c++ study item8~10 정은식[C++ korea] effective modern c++ study item8~10 정은식
[C++ korea] effective modern c++ study item8~10 정은식
은식 정2.6K views
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ... von Seok-joon Yun
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
Seok-joon Yun3K views
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23 von Seok-joon Yun
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
[C++ korea] Effective Modern C++ 신촌 Study Item20,21,23
Seok-joon Yun1.5K views
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne... von Seok-joon Yun
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
Seok-joon Yun3.1K views
[C++ Korea] Effective Modern C++ Study item 24-26 von Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item 24-26[C++ Korea] Effective Modern C++ Study item 24-26
[C++ Korea] Effective Modern C++ Study item 24-26
Seok-joon Yun1.8K views
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ... von Seok-joon Yun
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Seok-joon Yun1.4K views
[C++]2 variables andselectionstatement von Junyoung Jung
[C++]2 variables andselectionstatement[C++]2 variables andselectionstatement
[C++]2 variables andselectionstatement
Junyoung Jung80 views
C++ 타입 추론 von Huey Park
C++ 타입 추론C++ 타입 추론
C++ 타입 추론
Huey Park2.1K views
Nexon Developers Conference 2017 Functional Programming for better code - Mod... von Isaac Jeon
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Isaac Jeon3.9K views
[C++ Korea] Effective Modern C++ Study item14 16 +신촌 von Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Seok-joon Yun2.8K views
C Language For Arduino von 영욱 김
C Language For ArduinoC Language For Arduino
C Language For Arduino
영욱 김694 views
Javascript - Function von wonmin lee
Javascript - FunctionJavascript - Function
Javascript - Function
wonmin lee1.4K views
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기 von Chris Ohk
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
Chris Ohk11.8K views
[C++ korea] effective modern c++ study item 17 19 신촌 study von Seok-joon Yun
[C++ korea] effective modern c++ study item 17 19 신촌 study[C++ korea] effective modern c++ study item 17 19 신촌 study
[C++ korea] effective modern c++ study item 17 19 신촌 study
Seok-joon Yun1.2K views

Destacado

월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법 von
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법tcaesvk
1.6K views33 Folien
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉 von
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉tcaesvk
855 views82 Folien
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템 von
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템tcaesvk
4.9K views79 Folien
NDC 11 자이언트 서버의 비밀 von
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
4.4K views71 Folien
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부 von
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부Eunseok Yi
8.8K views82 Folien
NDC 2014, 피할 수 없는 문자열의 세계 von
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계tcaesvk
12.4K views67 Folien

Destacado(20)

월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법 von tcaesvk
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전 기법 세미나, C++ 게임 개발자를 위한 C# 활용기법
tcaesvk1.6K views
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉 von tcaesvk
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
NDC 2012, Gamification 001: 실전 감량 사례로 알아보는 메카닉
tcaesvk855 views
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템 von tcaesvk
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
tcaesvk4.9K views
NDC 11 자이언트 서버의 비밀 von 승명 양
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
승명 양4.4K views
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부 von Eunseok Yi
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 1부
Eunseok Yi8.8K views
NDC 2014, 피할 수 없는 문자열의 세계 von tcaesvk
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
tcaesvk12.4K views
About Visual C++ 10 von 흥배 최
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
흥배 최1.5K views
KGC2015 - 이 게임을 만든 사람들은 누구인가요 von 영욱 오
KGC2015 - 이 게임을 만든 사람들은 누구인가요KGC2015 - 이 게임을 만든 사람들은 누구인가요
KGC2015 - 이 게임을 만든 사람들은 누구인가요
영욱 오4.6K views
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기 von Wonha Ryu
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
Wonha Ryu1.3K views
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점 von Wonha Ryu
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
현업 엔지니어의 시각에서 본 알고리즘 공부의 장점과 단점
Wonha Ryu4.5K views
NDC 2015 마비노기 듀얼 패치 시스템 von tcaesvk
NDC 2015 마비노기 듀얼 패치 시스템NDC 2015 마비노기 듀얼 패치 시스템
NDC 2015 마비노기 듀얼 패치 시스템
tcaesvk924 views
NDC 2010, 패킷 지옥으로부터 탈출 von tcaesvk
NDC 2010, 패킷 지옥으로부터 탈출NDC 2010, 패킷 지옥으로부터 탈출
NDC 2010, 패킷 지옥으로부터 탈출
tcaesvk1K views
NDC 2011, C++ 프로그래머를 위한 C# von tcaesvk
NDC 2011, C++ 프로그래머를 위한 C#NDC 2011, C++ 프로그래머를 위한 C#
NDC 2011, C++ 프로그래머를 위한 C#
tcaesvk963 views
마비노기듀얼 이야기-넥슨 김동건 von 강 민우
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
강 민우2K views
Cross linking Presentation von peredelcampo
Cross linking PresentationCross linking Presentation
Cross linking Presentation
peredelcampo2.4K views
[NDC] 인디 게임 개발사의 콘솔도전기 von Seokho Lee
[NDC] 인디 게임 개발사의 콘솔도전기[NDC] 인디 게임 개발사의 콘솔도전기
[NDC] 인디 게임 개발사의 콘솔도전기
Seokho Lee11.3K views
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012 von devCAT Studio, NEXON
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부 von Eunseok Yi
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
Eunseok Yi8K views
임태현, MMO 서버 개발 포스트 모템, NDC2012 von devCAT Studio, NEXON
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012

Similar a NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서

20201121 코드 삼분지계 von
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
138 views20 Folien
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기 von
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
4.8K views100 Folien
[shaderx6]8.2 3d engine tools with c++cli von
[shaderx6]8.2 3d engine tools with c++cli[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli종빈 오
562 views22 Folien
강의자료 2 von
강의자료 2강의자료 2
강의자료 2Young Wook Kim
1.1K views45 Folien
Hoons 닷넷 정기세미나 von
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나병걸 윤
794 views24 Folien
코드 생성을 사용해 개발 속도 높이기 NDC2011 von
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011Esun Kim
6.3K views83 Folien

Similar a NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서(20)

20201121 코드 삼분지계 von Chiwon Song
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
Chiwon Song138 views
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기 von Jaeseung Ha
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
Jaeseung Ha4.8K views
[shaderx6]8.2 3d engine tools with c++cli von 종빈 오
[shaderx6]8.2 3d engine tools with c++cli[shaderx6]8.2 3d engine tools with c++cli
[shaderx6]8.2 3d engine tools with c++cli
종빈 오562 views
Hoons 닷넷 정기세미나 von 병걸 윤
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
병걸 윤794 views
코드 생성을 사용해 개발 속도 높이기 NDC2011 von Esun Kim
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
Esun Kim6.3K views
Effective c++(chapter 5,6) von 문익 장
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
문익 장726 views
불어오는 변화의 바람, From c++98 to c++11, 14 von 명신 김
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김161 views
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019 von min woog kim
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim3.2K views
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료) von KH Park (박경훈)
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)
3일차-닷넷 분산 기술의 이해 (인피니트 강의자료)
KH Park (박경훈)2.5K views
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계 von Sungkyun Kim
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
Sungkyun Kim17.4K views
[NDC 2016] 유니티, iOS에서 LINQ 사용하기 von Daehee Kim
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
Daehee Kim9.5K views
Gpg gems1 1.3 von david nc
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
david nc393 views
C언어 세미나 - 함수 von SeungHyun Lee
C언어 세미나 - 함수C언어 세미나 - 함수
C언어 세미나 - 함수
SeungHyun Lee340 views
[NDC2016] TERA 서버의 Modern C++ 활용기 von Sang Heon Lee
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
Sang Heon Lee6.8K views
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호) von Sang Don Kim
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim2.7K views
20150212 c++11 features used in crow von Jaeseung Ha
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
Jaeseung Ha5.9K views
카사 공개세미나1회 W.E.L.C. von Ryan Park
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
Ryan Park1.3K views
Going asynchronous with netty - SOSCON 2015 von Kris Jeong
Going asynchronous with netty - SOSCON 2015Going asynchronous with netty - SOSCON 2015
Going asynchronous with netty - SOSCON 2015
Kris Jeong2K views

NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서

  • 1. 네트워크 비동기 통신, 합의점의 길목에서 ㈜넥슨 신규개발3본부 개발1실 GTR팀 성능연구유닛 김재석
  • 2. 다룰 내용 네트워크 프레임워크 프레임워크 개발 목표 및 구현 시기별 시도 방법 및 쟁점 시연
  • 3. 연관 강연 NDC2010 패킷 지옥으로부터 탈출 NDC2011 마비노기 영웅전 자이언트 서버의 비밀 C++ 프로그래머를 위한 C#
  • 4. 용어 서비스 : 비동기 요청을 처리하는 주체 IDC의 그것이 아님 클라이언트 : 비동기로 요청을 보내는 주체 고객 시스템에 배포되는 그것이 아님
  • 5. 책임연구원 2010/2011, 마비노기2 2006/2009, 마비노기 영웅전 테크니컬 디렉터 2004/2005, 마비노기 2003/2004, 프로젝트 T2 2001/2003, Oz World [ɡ̊ɪm̚ ʨæːsɤk̚] /ɡim ɟɛːzʌɡ/
  • 6. 목적 네트워크 코딩에 스트레스 받지 말자 사용하는데 지나치게 지식을 요구하지 말 것
  • 7. 문제 네트워크 통신 ≠ 비즈니스 로직
  • 8. 네트워크 통신≠ 비즈니스 로직 비동기 로직을 꼼꼼하게 처리하면 좋겠다. 모든 송수신은 우아하고 효과적으로. 네트워크 또는 비동기?
  • 9. 네트워크 통신 ≠ 비즈니스 로직 필요한 정보가 요구되는 시점에 즉시 계산될 수 있는 것으로 생각하고 싶다.
  • 10. 또 다른 문제 C++ / C# 두 언어를 잘 지원할 것
  • 11. 방향 우아하고 효과적인 네트워크 코드는 “생성” C++ / C# 두 언어에서 상호 운용이 되도록 생성되는 코드가 논리의 흐름을 끊지 말 것 기반수준에서 기술되는 고급지식은 숨길 것
  • 12. 상충하는 설계 목표 시스템 프로그래머 혹은 응용 프로그래머
  • 15. 상충하는 설계 목표 시스템 프로그래머 혹은 응용 프로그래머
  • 17. 메시지 생성 및 프토토콜 반복기 1차 시기
  • 18. 메시지 생성 C# : LCG (Lightweight Code Generation) 4.0에서는 Expression Trees로 대체 가능 var dm = new DynamicMethod(…); var il = dm.GetILGenerator(); … @delegate = dm.CreateDelegate(…); C++ : Visual Studio 매크로 또는 하드 코딩
  • 19. 쟁점 좋은 점 • C#은 데이터 형식만 만들면 직렬화 코드를 작성할 필요가 없다. 나쁜 점 • C++ 코드 생산성 • C# 형식의 가변성 / 제네릭 처리
  • 20. 프로토콜 반복기 (client) var op = new Operation() { … }; op.OnComplete += _ => { … }; // ② op.OnFail += _ => { … }; // ②’ RequestOperation(loc, op); // ①
  • 21. 프로토콜 반복기 (service) IEnumerable<object> Run() { var op = Operation; var info = …; yield return info.ID; yield return info.Name; }
  • 22. 쟁점 좋은 점 • 연관 코드가 가까이 있음 (클라이언트) 나쁜 점 • 반복자 때문에 서비스 코딩 난이도가 높음 • C++에 사용 불가 • 중간 처리가 필요한 비동기 작업이 드묾
  • 24. 대리자 기반 C# 대리자를 IDL (Interface Definition Language)로 사용 [OperationContract] public delegate bool Authenticate(string credential); ref T, out T
  • 25. 코드 생성 C++ Client / CLI Service를 가정하고 C++ / CIL 코드 생성 Hindley-Milner 형식 유추 불변성 : ref 가변성 공변성 : out, return 반공변성 : in
  • 26. 코드 사용 (C++ client) channel->BeginAuthenticate( credential, endAuthenticate, object); void EndAuthenticate(IAsyncResult* asyncResult) { bool result = channel-> EndAuthenticate(asyncResult); }
  • 27. 코드 사용 (CLI server) public void Handle( long clientID, ref AuthenticateInvoke arg) { var response = new AuthenticateReturn( ref arg, Validate(arg.Credential)); Server.Current.Return( clientID, ref response); }
  • 28. 쟁점 좋은 점 C#에서 패킷을 기술하면 클래스 자동 생성 나쁜 점 프로토콜의 연관성을 기술할 방법이 없음 클라이언트/서비스 코드의 대칭성 없음 높은 요구 배경 지식  Copy&Paste 유지보수성 (C++ / CIL)
  • 30. 인터페이스 기반 C# 인터페이스를 IDL로 사용 [ServiceContract] public interface IServiceProvider { [OperationContract] bool SampleMethod(int arg1, ref float arg2, out string arg3); [OperationContract(IsOneWay = true)] void SampleOneWayMethod(); [OperationContract] long SampleProperty { get; set; } [OperationContract] event EventHandler SampleEvent; }
  • 31. 코드 생성 Client / Service 코드를 CodeDOM으로 C++ / CIL 양쪽에 대칭으로 생성 Asynchronous Programming Design Patterns 권고를 따라 생성 자명한 Serializable 형식은 C++에 복제 (열거형 등)
  • 32. 코드 사용 (열거형, C++) // [System::SerializableAttribute()] struct Facing : public System::ValueType { enum EnumType { Front = 0, Back = 1 }; typedef Int32 UnderlyingType; static const EnumType MinValue = Front; static const EnumType MaxValue = Back; static const std::vector<Facing>& GetValues() { … } static bool TryParse(const String& s, /*out*/Facing& result) { … } static Facing Parse(const String& s) { … } Facing() { … } Facing(EnumType value) { … } explicit Facing(UnderlyingType value) { … } operator EnumType() const { … } bool operator==(const Facing& value) const { … } bool operator==(EnumType value) const { … } String ToString() { … } const String& ToString() const { … } … };
  • 33. 코드 사용 (client) public void SampleMethodAsync(int arg1, ref float arg2); public void SampleMethodAsync(int arg1, ref float arg2, object userState); public event SampleMethodCompletedEventHandler SampleMethodCompleted; protected IAsyncResult BeginSampleMethod(int arg1, ref float arg2, AsyncCallback callback, object @object); protected bool EndSampleMethod(IAsyncResult asyncResult, out float arg2, out string arg3);
  • 34. 코드 사용 (client) // C# client.SampleMethodAsync(arg1, ref arg2, e => { try { string arg3; var result = e.Return( out arg2, out arg3); … } catch (CommunicationException) { … } });
  • 35. 코드 사용 (client) // C++ using namespace IServiceProviderEvents; … client->SampleMethodCompleted() += new SampleMethodCompletedEventHandler(*this, &OnSampleMethodCompleted); … client->SampleMethodAsync(arg1, arg2); void OnSampleMethodCompleted(Object* sender, SampleMethodCompletedEventArgs* e) { try { float arg2; String arg3; bool result = e->Return(arg2, arg3); … } catch (const Pointer<Exception>&) { … } }
  • 36. 코드 사용 (server) // C# public override bool SampleMethod( int arg1, ref float arg2, out string arg3) { … } // C++ bool SampleMethod(int arg1, float& arg2, /*out*/String& arg3) { … }
  • 37. 쟁점 좋은 점 작업을 위해 필요한 코드의 자동 생성으로 실제 개발에 투하되는 시간을 확보 C++ / CLI 양 쪽에서 일관성 있게 작업 나쁜 점 상속을 사용해서 생기는 제약