2012-09-12 2 views
2

나는 리소스가 너무 적어 한 노드에 머물고있는 얼랑 애플리케이션을 가지고있다. 저는 gen_servers를 한 프로세스에서 다른 프로세스로 이동시키는 과정에 있습니다. 비교적 쉽게 진행됩니다. 나는 마지막 장벽에 서있다. 이러한 gen_servers를 생성하는 팩토리 프로세스를 가져 와서 로컬 노드 대신 원격 노드에 생성한다. start_link의 기본 동작은 로컬에서만 시작하는 것이 분명하지만이를 변경하는 옵션이 없습니다.Erlang gen_server는 다른 노드에서 gen_server를 어떻게 시작합니까?

나는 솔루션으로 독창성을 발휘해야하며, 이미 성공한 사람이 이미 이와 같은 것을 구현했는지 알고 싶었습니다. IOW, 추천 솔루션은 무엇입니까?

편집

나는 호출에 의해 트리거되는 통화의 사슬에서 찾고 있어요 :

gen_server:start_link(?Module, Args, []) 

gen_server를 :/3 START_LINK :

start_link(Mod, Args, Options) -> 
    gen:start(?MODULE, link, Mod, Args, Options). 

세대가 : 시작/5 :

start(GenMod, LinkP, Mod, Args, Options) -> 
    do_spawn(GenMod, LinkP, Mod, Args, Options). 

세대는 : do_spawn/5 :

do_spawn(GenMod, link, Mod, Args, Options) -> 
    Time = timeout(Options), 
    proc_lib:start_link(?MODULE, init_it, 
         [GenMod, self(), self(), Mod, Args, Options], 
         Time, 
         spawn_opts(Options)); 

proc_lib는 :/5 START_LINK : 마지막으로 흥미로운 비트 우리를 얻을 수

start_link(M,F,A,Timeout,SpawnOpts) when is_atom(M), is_atom(F), is_list(A) -> 
    Pid = ?MODULE:spawn_opt(M, F, A, ensure_link(SpawnOpts)), 
    sync_wait(Pid, Timeout). 

합니다.는 일치하는 spawn_opt/4가된다

spawn_opt(Node, M, F, A, Opts) when is_atom(M), is_atom(F), is_list(A) -> 
    ... 
    ... 

그것은이 노출되지 않도록 내 마음을 놀라게한다 : 실제로 나에게 유용 할 것 중 하나가

spawn_opt(M, F, A, Opts) when is_atom(M), is_atom(F), is_list(A) -> 
    ... 
    ... 

하지만가. 부주의 한 프로그래머가 gen_server를 시도 할 위험이 있다는 것을 알았습니다 : 화성에서 실행되는 erlang 노드의 프로세스를 start_link하면서 30 분 동안 통화를 차단하지만 프로그래머의 경계가 확실합니다. OTP 수정이나 임시 방편을 쓰는 데 정말로 어려움이 있습니까?

답변

6

start_link 원격 노드의 서버를 직접 지정하지 않습니다. 좋은 프로그램 구조와 단순성을 위해 원격 노드에서 별도의 응용 프로그램을 시작하고 원격 응용 프로그램에서 실행중인 특정 프로세스에 원격 프로세스 생성을 위임합니다.

프로세스 연결은 주로 감독 또는 모니터링 목적이므로 원격 프로세스 대신 로컬 감독자와 연결하는 것이 좋습니다. 원격 프로세스의 활성 상태가 필요한 경우 erlang:monitorerlang:demonitor을 권장합니다.

전형적인 분산 설정 :

Node1 
+---------------+       Node2 
| App1   |       +---------------+ 
| Supervisor1 | Proc Creation Request | App2   | 
|  Processes | -----------------------> | Supervisor2 | 
|  ...... |       |  | 
|  ...... |       |  | Create Children 
|  ...... |  Monitor   |  V 
|  ...... | -----------------------> |  Processes | 
+---------------+       |  ...... | 
              +---------------+ 
1

rpc 모듈이 도움이 될 수 있습니다. 특히 async_call 기능.

관련 문제