2012-12-10 3 views
1

저는 ZMQ에서 새롭고 NodeJS 바인딩으로 작업하고 있습니다. PUSH/PULL 소켓을 사용하는 응용 프로그램이 있습니다. 한 쪽에서 PULL 소켓을 통해 수신하고 처리하는 일부 노드에 대한 데이터는 PUSH입니다. 때로는 응용 프로그램의 하나 이상의 노드를 죽여야 할 수도 있습니다. 그리고 처리 할 소켓의 노드가 여전히 남아있을 수 있습니다. 이 데이터를 잃고 싶지 않아 ZMQ의 PULL 소켓 큐에 액세스하여 여전히 처리 할 메시지가 있는지 확인하는 방법이 있는지 궁금합니다.ZMQ 소켓 큐

ZMQ와 NodeJS 바인딩의 스펙에서 실제로 아무것도 찾을 수 없으므로 전체 개념이 잘못되었을 수 있습니다.

답변

0

발견 된 해결책을 게시하고 있습니다. QMQ 소켓을 사용하여 대기열에 더 이상 메시지가 없다는 것을 확인하는 것은 실제로 해결책이 아닙니다. 문제를 해결하기 위해 내 마음에 온 해킹/해킹 일뿐입니다. 큐 처리를 직접 작성하는 시간이 없으므로 문제를 해결하는 방법은 다음과 같습니다.

프로세스가 메시지를 수신 할 때마다 new Date().getTime()을 통해 타임 스탬프를 저장합니다. 프로세스를 종료해야 할 때마다 kill 메시지가 전송됩니다. 프로세스가 메시지를 수신하면 setInterval으로 제한 시간을 시작합니다. 모든 x 초 (10을 넣었거나 더 많을 수 있음) 시간 초과는 마지막으로받은 메시지가 오래되었는지를 확인하는 기능을 수행합니다 (타임 스탬프를 사용하고 마지막에 저장된 메시지를 빼고 결과가 더 큰 경우 y). , 나의 경우에는 100 초이다. 그것은 충분히 오래되었다). 그럴 경우 더 이상 메시지를받지 못했습니다 (대기열에 더 이상 메시지가 없습니다). 따라서 프로세스가 종료됩니다. 그렇지 않으면 아무것도 수행하지 않습니다.

0

프로세스를 종료하면 프로세스 버퍼의 데이터가 손실됩니다.

프로세스를 강제 종료하는 대신 프로세스를 정상적으로 종료 할 수있는 방법을 찾아야합니다. 여기에서 PULL 소켓에 "KILL"메시지를 보낼 수 있습니다. 프로세스는 그것을 읽고 그것을받을 때 종료 할 수 있습니다. 소켓 버퍼를 플러시 할 수 있다면 (다른 프로세스가 여전히 전송 중인지 여부에 따라 다름), 그렇게 할 수 있고 읽을 메시지가 더 이상 없을 때 종료 할 수 있습니다.

+0

글쎄, 고마워, 그게 내가 생각한거야. 내 질문은 "소켓을 죽이기 전에 여전히 처리 할 메시지가 있는지 어떻게 확인합니까?"입니다. – Masiar

+0

아키텍처에 따라 크게 달라집니다. 연속적으로 푸시 프로그램을 보내는 경우 대기열이 비어있는 것을 보장하지 않습니다. 푸셔가 세션이 끝날 때를 알면이를 알려주는 "kill"메시지를 추가 할 수 있습니다. –

+0

푸시 버튼은 물건을 계속 보내지 만, "강제 종료"절차를 시작할 때마다 푸시 버튼이 작업자로부터 바인딩 해제되므로 작업자는 더 이상 메시지를받지 못하고 일부는 여전히 대기열에서 처리되지 않을 수 있습니다. 대기열의 상태를 확인하고 프로세스를 종료 할 적절한 순간을 잡아야했습니다. – Masiar