2014-05-14 1 views
0

나는 여러 작업자 컴퓨터에서 무거운 컴퓨팅 작업을 병렬 처리하려고합니다.이 작업자는 서로간에 데이터를 공유해야합니다. 나는 모든 근로자들이 연결되어 그들의 "이웃들"에 대한 정보를 얻는 서버를 가지고있어서 그들과 연결하고 데이터를 교환 할 수있다. 다음은 내가 염두에 두었던 구조의 그림입니다. system structureZeroMQ가 서로에 대해 알리는 클라이언트

모든 노드에는 4 개의 이웃이 있습니다 (그림에서 더 그리기를 원하지 않음). 나는 소켓 유형에서 전혀 고쳐지지 않는다, 나는 그들이 선택할 최선이 될 것이라고 생각했다.

그러나 ZeroMQ는 한 연결에 대한 연결 정보를 다른 연결에 전달할 방법이 없습니다. 이것이 실제로는 매우 일반적인 일이라고 생각하기 때문에 이에 대한 해결책이 있어야합니다. 네트워크 유형은 다양 할 수 있습니다. 표준 tcp/ip 네트워크 일 수도 있고 라우터를 통해 연결된 많은 컴퓨터가있을 수도 있고 infiniband를 통해 연결된 클러스터 일 수도 있습니다. 그래서 기본적으로 내가 원하는 것은 connect() 또는 bind()에 하나의 클라이언트에 간단하게 삽입 할 수있는 문자열이고 프로토콜과 네트워크 유형 및 모든 내용에 대해 걱정할 필요가 없습니다. 제로 맷이 성취하려고 시도하는 것을 정확하게 이해합니다. .

미리 답변 해주세요. :)

편집 :

WorkerMiddle.sendToServer("Hey server, please tell me my neighbours") 
Server.sendToWorkerMiddle(Worker.top.connectionInfo()) 
WorkerMiddle.connectTo(WorkerTop) 
Server.sendToWorkerMiddle(Worker.bottom.connectionInfo()) 
WorkerMiddle.connectTo(WorkerBottom) 
Server.sendToWorkerMiddle(Worker.left.connectionInfo()) 
WorkerMiddle.connectTo(WorkerLeft) 
Server.sendToWorkerMiddle(Worker.right.connectionInfo()) 
WorkerMiddle.connectTo(WorkerRight) 
+0

이것은 매우 광범위하므로 자세한 정보없이 유용한 답변을 드릴 수 없습니다. 우선, [docs (http://zguide.zeromq.org/page:all)를 읽으면서, 그들은 매우 유익하고 찾고있는 일을 성취 할 수있는 많은 연결 패턴을 포함합니다. 보다 유용한 정보를 제공하려면 a) 네트워크의 토폴로지 (물리적으로 배치/연결되는 방법 b) 사용중인 프로토콜 c) 사용중인 소켓 유형 pub/sub, rep/req 등) d) 누가 바인딩하고 누가 연결하는지, 그리고 종점은 어떻게 명명 되나요? – Jason

+0

Jason에게 감사드립니다. 이미했습니다. 하지만 그것은 누군가가 솔루션으로 제공하는 것에 따라 소켓 유형을 선택하기 때문에 내가 말할 수있는 모든 것입니다. 하지만 그것을 명확히하려고 노력하겠습니다 :) – wlfbck

+1

질문에 대한 훌륭한 업데이트! 필자는 당신이 문서를 읽었다 고 말했고, 4, 7, 8 장은 좀 더 복잡한 피어 투 피어 토폴로지에서 얻을 수있는 몇 가지 개념을 제공하고 거기에 링크되어있는 오픈 소스 통신 패턴의 저장소가 도움이 될 수 있습니다. 그러나 이러한 것들을 설계하는 것은 확실히 복잡합니다. 부분 응답을 게시하고 나중에 소켓 선택과 의사 소통 전략을 가지고 시간을 할애 해 보겠습니다. – Jason

답변

2

당신은 다소 ZMQ 소켓 유형, 프로토콜 및 주소 오해하고 있습니다 : 여기에 내가 마음에 가지고 있던 예시적인 통신입니다. 나는 그 문제를 해결하려고 노력할 것입니다.

ZMQ는 TCP와 같은 네트워크 프로토콜을 사용하는 세부적인 사항을 절대적으로 추상화하지만 네트워크를 통해 통신 할 때 TCP를 사용하도록해야합니다. 좋은 IP 주소 나 DNS 이름을 사용하여 동료를 서로 연결합니다.

따라서, 각 작업자 노드에는 IP 주소 및/또는 DNS 이름이 있습니다. 이러한 시간을 미리 알고 있다면 서버/마스터에 요청할 필요조차 없습니다. 한 명의 작업자와 다른 작업자의 IP 주소에 즉시 연결할 수 있습니다. 서버/마스터에이 정보가 있고 작업자가 시작 시간에 응답하지 않으면 작업자가 IP 주소 목록을 요청할 수 있으며 마스터가이를 보낼 수 있습니다. 그러면 IP 주소로 연결됩니다. 예를 들어 피어가 마스터에 연결할 때처럼 피어가됩니다.

서버

// obviously this code will change depending on the language/binding that you use 
// this is psuedo-code 
server = new zmq.socket('ROUTER'); 
server.bind('tcp://10.20.30.40:55555'); 

worker1에

worker1 = new zmq.socket('REQ'); 
worker1.connect('tcp://10.20.30.40:55555'); 

worker2에

worker2 = new zmq.socket('REQ'); 
worker2.connect('tcp://10.20.30.40:55555'); 

은 ... 당신은 PAIR 소켓 노동자를 연결하는 당신에게 가장 의미가 보였다을 나타냅니다 만, 이들은 단일 멀티 스레드 응용 프로그램 내에서의 통신에만 적합합니다 n 하나의 스레드에서 다른 스레드로, 그래서 그것은 당신이 여기에서 찾고있는 것이 아닙니다.대신, 당신은 아마 각 근로자가 자신의 라우터 소켓을하고, 필요가 각 피어에 연결하는대로 새 REQ 소켓을 만들 수 있습니다 원하는 :

worker1에

worker1 = new zmq.socket('REQ'); 
peer1 = new zmq.socket('ROUTER'); 
peer1.bind('tcp://10.20.30.41:44444'); 
worker1.connect('tcp://10.20.30.40:55555'); 

peers = worker1.send('tell me my peers'); 
for (i=0; i<peers.length; i++) { 
    peer_array[i] = new zmq.socket('REQ'); 
    peer_array[i].connect('tcp://' . peers[i]); 
} 

worker2에

worker2 = new zmq.socket('REQ'); 
peer2 = new zmq.socket('ROUTER'); 
peer2.bind('tcp://10.20.30.42:33333'); 
worker2.connect('tcp://10.20.30.40:55555'); 

peers = worker2.send('tell me my peers'); 
for (i=0; i<peers.length; i++) { 
    peer_array[i] = new zmq.socket('REQ'); 
    peer_array[i].connect('tcp://' . peers[i]); 
} 

. 여기서 일어나는 일은 각 작업자가 서로 다른 작업자의 라우터에 연결하기위한 요청 소켓을 설정한다는 것입니다. 서버는 ipaddress : port 형식의 문자열 목록을 다시 전송합니다.

어떤 유형의 정보가 서버에서 작업자로 또는 작업자에서 작업자로 전달되는지 알지 못하는 사이에 어떤 소켓을 선택할 지보다 나은 조언을 제공하는 것은 불가능하지만, 최소한 클라이언트/서버 요청/응답 시스템 유형.

관심이있는 경우 왜 이러한 특정 선택을해야하는지에 대해 더 깊이 이해할 수 있습니다. 또는 여전히 고민 중이라면 댓글로 알려주세요.

+0

매우 상세한 답변을 보내 주셔서 감사합니다! 제기 한 몇 가지 질문에 대답하려면 : 나는 사전에 네트워크를 모른다. 그래서 내가 왜 여기서하고 싶은지 발견 할 수있다. 그 후 네트워크는 변경되지 않습니다. 그리고 전송 될 유일한 것은 많은 수의 수레입니다 (유체 시뮬레이션을하고 있습니다). – wlfbck

+0

그냥 내 마음에 온 또 다른 한가지 : 노동자 - 작업자 연결을 위해 PAIR 소켓을 사용하는 것은 "나쁜 스타일"인가 아니면 다른 단점이 있습니까? 나는 근로자 관계가 절대로 바뀌지 않았기 때문에 각각의 논리와 잠재적 인 오류를 저장하기 때문에 각자 PAIR 소켓을 사용할 수도 있다고 생각했다. – wlfbck

+1

글쎄, PAIR은 문서에서 스레드 간 통신 이외의 다른 것에 대해서는 명시 적으로 권장하지 않습니다. 필자는 왜 그 이유에 관해서 그들이 얼마나 자세한 설명을했는지는 기억하지 못합니다. : 연결이 끊어지는 네트워크 문제가있는 경우 PAIR이 자동으로 소켓을 다시 연결하는 ZMQ "마법"을 잃습니다. 그것은 그 자체로는 설계된 것 이외의 것을 피하는 이유입니다. – Jason

관련 문제