RMI

ProudNet์€ ์ž์ฒด ๊ฐœ๋ฐœ๋œ Remote Method Invocation(RMI) ์‹œ์Šคํ…œ์œผ๋กœ, ๊ธฐ์กด์— ํ†ต์šฉ๋˜๋Š” IDL ํ˜•์‹์ด๋‚˜ RMI ์‹œ์Šคํ…œ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šฐ๋ฉฐ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ๋Š” 'ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฆฌํ„ด๊ฐ’'์„ ๋น„๋™๊ธฐ RMI๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

RMI ํ•จ์ˆ˜ ๊ทธ๋ฃน

0๊ฐœ ์ด์ƒ์˜ RMI ํ•จ์ˆ˜ ์ง‘ํ•ฉ์œผ๋กœ, PIDL ํŒŒ์ผ์—์„œ๋Š” global ๊ตฌ๋ฌธ ๋ธ”๋Ÿญ์˜ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

global SimpleC2S
{
    ...;
}

Proxy์—์„œ RMI ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ฆ‰์‹œ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  RMI ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ Proxy ์ธก์—์„œ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋ฐ›์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค.

RMI ๋ฉ”์„œ๋“œ ์ธ์ž ์†์„ฑ

๋ฉ”์„œ๋“œ ์ธ์ž์—๋Š” ์†์„ฑ ์ •์˜๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉฐ ๊ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋งˆ๋‹ค ํ•œ ๊ฐœ ์ด์ƒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

in : ์ž…๋ ฅ ํ˜•์‹์˜ ์ธ์ž์ž„์„ ์˜๋ฏธํ•˜๋ฉฐ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฒ„์ „์—์„œ๋Š” 'out'์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

// ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด RMI ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉด 
Test([in] Proud::String a,[in] int b,[in] float c);

// ๋‹ค์Œ๊ณผ ๊ฐ™์€ C++ code๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
Test(Proud::HostID remote, Proud::RmiContext& rmiContext, const Proud::String& a, const int& b, const float& c);

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ RMI ๋ฉ”์„œ๋“œ์˜ ์ธ์ž์˜ ์†์„ฑ์€ in ๋งŒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

- byval ์†์„ฑ

์ธ์ž๊ฐ€ by value๋กœ ์ „๋‹ฌ๋จ์„ ์˜๋ฏธํ•˜๋ฉฐ ์ด๊ฒƒ์ด ์‚ฌ์šฉ๋˜๋ฉด C++ proxy ๋ฐ stub์—์„œ ์ธ์ž ํ˜•์‹์— & ๋ถ€ํ˜ธ๊ฐ€ ์ƒ๋žต๋ฉ๋‹ˆ๋‹ค. int๋‚˜ float ๋“ฑ ์ธ์ž ํ˜•์‹์— ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ํ˜•์‹์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

// RMI ํ•จ์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ ์„ ์–ธํ•˜๋ฉด,
Foo([in] int a);

// ์ƒ์„ฑ๋˜๋Š” C++ Proxy and Stub์—๋Š” ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ by reference๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. 
// ์•„๋ž˜ const int& a๊ฐ€ ๊ทธ๊ฒƒ์ž…๋‹ˆ๋‹ค.
SimpleC2S.Foo = [](Proud::HostID from, Proud::RmiContext& rmiContext, const int& a) = { ... };

// RMI ํ•จ์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ byval ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์„œ ์„ ์–ธํ•˜๋ฉด,
Foo([in, byval] int a);

// ์ด๋ ‡๊ฒŒ by value๋กœ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
SimpleC2S.Foo = [](Proud::HostID from, Proud::RmiContext& rmiContext, int a) = { ... };

- mutable ์†์„ฑ

์ธ์ž๊ฐ€ const type์ด ์•„๋‹˜์„ ์˜๋ฏธํ•˜๋ฉฐ ์ด๊ฒƒ์ด ์‚ฌ์šฉ๋˜๋ฉด C++ proxy ๋ฐ stub์—์„œ ์ธ์ž ํ˜•์‹์— const ํ‚ค์›Œ๋“œ๊ฐ€ ์ƒ๋žต๋ฉ๋‹ˆ๋‹ค. RMI stub์—์„œ ๋ฐ›์€ ์ธ์ž์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•  ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

// ์ด๋ ‡๊ฒŒ mutable ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์‹œ๋ฉด
Foo([in, mutable] int a);

// ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. const๊ฐ€ ์‚ฌ๋ผ์ ธ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
SimpleC2S.Foo = [](Proud::HostID from, Proud::RmiContext& rmiContext, int& a) = { ... };

์ด์ข… ์–ธ์–ด๋กœ ๋œ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ํ†ต์‹ ํ•˜๊ธฐ

๋‘ ํ”„๋กœ๊ทธ๋žจ์ด ProudNet์œผ๋กœ ํ†ต์‹ ํ•˜๋˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ PIDL ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ์–ธ์–ด๋กœ ๋œ proxy์™€ stub์„ ์ƒ์„ฑํ•œ ํ›„ ๊ฐ ํ”„๋กœ๊ทธ๋žจ์€ ํ•„์š”ํ•œ ๊ฒƒ์„ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

int, double, string ๋“ฑ ๊ธฐ๋ณธ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋Š” ProudNet์˜ C++ ์™ธ์˜ ์–ธ์–ด๋ฅผ ์œ„ํ•œ ๋ž˜ํ•‘ ๋ชจ๋“ˆ์—์„œ ์ด๋ฏธ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์–ด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉด ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ์ด๋ฆ„์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ฌ๋ผ์ง€๊ธฐ ๋งˆ๋ จ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด C# ์€ ๋ฌธ์ž์—ด ํด๋ž˜์Šค๊ฐ€ System.String ์ธ๋ฐ, C++์—์„œ๋Š” std::string, std::wstring, ATL::CString, Proud::String์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PIDL ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•  ๊ฒฝ์šฐ ์ƒ์„ฑ๋˜๋Š” proxy, stub์—์„œ ๋ณ€์ˆ˜ ํƒ€์ž…์„ ํŠน์ • ์–ธ์–ด์— ํ•œํ•ด์„œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์‚ฌ์šฉ ์˜ˆ์ž…๋‹ˆ๋‹ค.

rename cs(TypeA,TypeB);     // 1
 
rename cpp(TypeC,TypeD);    // 2
 
global XXX 2000
{
    Foo([in]TypeA a);  // 3
    Goo([in]TypeC c);  // 4
}

RMI ๋ฉ”์‹œ์ง€ ๋ฒ”์œ„

๊ฐ RMI ํ•จ์ˆ˜ ์„ ์–ธ์€ 1๊ฐœ์˜ ๋ฉ”์‹œ์ง€ ํƒ€์ž…์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ProudNet์˜ ๋ฉ”์‹œ์ง€ ํƒ€์ž…์€ 6๋งŒ ์ดํ•˜์˜ ๋ฒ”์œ„์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ์ •ํ•˜๋ฉฐ ์ด ๋ฒ”์œ„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ .pidl ํŒŒ์ผ์„ ์ž‘์„ฑ์‹œ์— ํ•ฉ๋‹ˆ๋‹ค.

1.7.42965-master ๋ฏธ๋งŒ์˜ ๋ฒ„์ „์—์„œ๋Š” 1,300 ~ 60,000 ๋ฒ”์œ„์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์…”์•ผ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ RMI์˜ ๋ฉ”์‹œ์ง€ ํƒ€์ž… ๊ฐ’์˜ ์˜ˆ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

global SampleRMI 2000
{
    Foo1(...); // Assigned Message Type ID = 2001
    Foo2(...); // Assigned Message Type ID = 2002
    Foo3(...); // Assigned Message Type ID = 2003
}

๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋Š” ๋ฉ”์‹œ์ง€ ํƒ€์ž… ๊ฐ’์ด ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ ์–ธ๋œ RMI ํ•จ์ˆ˜์— ๋ฐฐ์ •๋œ ํƒ€์ž… ๊ฐ’๊นŒ์ง€๋ฅผ ๋ฉ”์‹œ์ง€ ๋ฒ”์œ„๋ผ๊ณ  ์นญํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ 2,000 ~ 2,003์ด SampleRMI๋ฅผ ์œ„ํ•œ ๋ฉ”์‹œ์ง€ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ Proxy์™€ Stub์„ Proud.CNetClient , Proud.CNetServer , Proud.CLanClient , Proud.CLanServer ์— attach ํ•˜๋ฉด ๊ฐ RMI function group ๋“ค์˜ ๋ฉ”์‹œ์ง€ ๋ฒ”์œ„๊ฐ€ Proud.CNetClient , Proud.CNetServer , Proud.CLanClient , Proud.CLanServer ์— ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ attach ํ•  proxy์™€ stub๋“ค์˜ ๋ฉ”์‹œ์ง€ ๋ฒ”์œ„๊ฐ€ ๊ฒน์น˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ์œผ๋ฉด AttachProxy() ๋‚˜ AttachStub() ์€ exception์„ ๋ฐœ์ƒ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

C#์—์„œ CNetClient -> NetClient

C#์—์„œ CNetServer -> NetServer


ํ™œ์šฉ

RMI ํ™œ์šฉ๋ฒ•

Last updated

Was this helpful?