2013-08-21 4 views
1

파일이 끊임없이 생성되는 많은 서버가 있습니다. 이러한 파일은 중앙 위치로 보내야합니다. 파일은 50MB를 초과 할 수 없습니다. ZeroMQ를 사용하여 이러한 파일 (메시지로 캡슐화 됨)을 보낼 계획이므로 중앙 위치에서 파일 쓰기가 동시에 발생하지 않습니다. 예를 들어 전송을 위해 scp를 사용하면 대상에서 많은 디스크 쓰기 프로세스가 시작됩니다.ZeroMQ 이해하기 : 여러 소스의 파일을 단일 싱크대로 보내는 방법은 무엇입니까?

생산자에
  1. 사용 REQ 소켓과 소비자의 단일 REP 소켓 :

    나는 ZeroMQ 함께 할 수있는 몇 가지 방법을 볼 수 있습니다. 이것은 효과가있을 수 있지만 공정한 대기열이 없기 때문에 느린 생산자가 굶어 죽을 것이라고 생각합니다. 또한 REP 소켓을 사용할 수없는 경우 REQ 소켓이 메시지를 삭제하는지 확신 할 수 없습니다.

  2. 생산자의 PUSH 소켓과 소비자의 PULL 소켓을 사용하십시오. 이것은 소비자에게 공정한 대기열을 가지고 있으며 문서에는 PUSH 소켓 never discard messages이 있다고합니다. 그러나 완전히 신뢰할 수 있습니까?

내 신뢰성 요구 사항은 다음과 같습니다 (내 경우 파일의)

  1. 메시지가 손실되지 않아야한다. 그래서 저는 소비자에게받은 각 메시지에 대한 생산자에 대한 인정이있는 방식으로 그것을 만들고 싶습니다.
  2. 특정 제작자의 메시지는 생성 된 순서와 동일한 순서로 수신해야합니다.
  3. 제작자는 출퇴근 할 수 있으며 일정 기간 동안 소비자가 이용할 수 없도록해야합니다.

어떤 종류의 소켓이 이러한 종류의 응용 프로그램에 적합합니까? 어떤 종류의 zmq 패턴을 가리키는 포인터가 좋을까요?

답변

0

메시지 수가 적고 높은 안정성이 필요하기 때문에 REQ/REP 방식이이 작업에 가장 적합합니다.

  1. 스토어 당신이 생산의 각각의 가장 오래된 파일을 선택해야 생성 순서 (DB에서 파일 이름이나 파일 인덱스 시간)
  2. 을 찾을 수있는 방법으로 생산의 각 파일에 보내 소켓과 ACK 응답을 기다린다. ACK시 파일을 삭제해야합니다 (또는 전달 된 마커).
  3. 소비자는 소켓에서 파일 내용을 읽고 디스크로 플러시 한 후 나중에 ACK 메시지를 보내야합니다.
  4. 제작자는 이전 파일에서 ack를받은 후에 만 ​​다음 파일을 보내야합니다.

여러 가지 제작자가 소비자의 네트워크 인터페이스를 홍수로 퍼뜨릴 수 있습니다. 소비자가 디스크를 집어 넣지 않거나 프로세스를 생성하지 않아도됩니다. 이것은 제작자가 시작한 파일 전송을 사용하는 모든 디자인에서 문제가되어야합니다. PUSH/PULL 소켓에도 같은 문제가 있습니다.

참고 사항 : ZeroMQ 메시지는 전체 메시지가 수신 될 때까지 메모리에 버퍼링됩니다. 따라서 50MB 파일을 보내는 20 명의 제작자는 최대 1GB RAM이 필요합니다.

대신에 나는 profucer에게 파일의 이름 만 보내고 파일을 순차적으로 가져 오는 것이 좋습니다.