2016-10-10 98 views
0

< 라우터 설정이 NetMQ v4입니다. 여기서 아무 문제없이 모든 방향으로 비동기식으로 메시지를 보내고받을 수 있습니다. 서버 (라우터가) 들어오는 메시지를 수신 곳ZeroMQ 또는 NetMQ의 라우터 소켓에서 송수신하는 방법은 무엇입니까?

는 지금 추상화에 그것을 공식화 할뿐만 아니라 연결된 클라이언트 (딜러) 중 하나에 수요 방송 메시지에 대한 필요가있다.

구독자가 서버에 메시지를 보내야하므로 펍 < -> 하위 소켓을 사용하지 않는 것이 좋습니다. 달성하고자하는 가장 가까운 패턴은 WebSocket 클라이언트 - 서버 통신입니다.

클라이언트의 메시지를 듣고의 첫 번째 부분은 같은에서 수행됩니다

이제 소켓 - 안전 스레드되지 않습니다, 나는 (메시지를 방송 할 수있는 방법을 찾는 데에서 오는에 부착하고 주어진
using (var server = new RouterSocket("@tcp://*:80")) 
{ 
    var addresses = new HashSet<string>(); 
    while (true) 
    { 
     var msg = server.ReceiveMultipartMessage(); 

     var address = Encoding.UTF8.GetString(msg[0].Buffer); 
     var payload = Encoding.UTF8.GetString(msg[2].Buffer); 
     Console.WriteLine("[Server] - Client: {0} Says: {1}", address, payload); 

     var contains = addresses.Contains(address); 
     if (!contains) { addresses.Add(address); }    

     msg.Clear(); 
     msg.Append(address); 
     msg.AppendEmptyFrame(); 
     msg.Append("Reply for: " + address); 
     server.SendMultipartMessage(msg); 
    } 
} 

요구에 따라 다른 스레드)를 모든 클라이언트에 제공합니다.

루프에서 메서드를 대신 사용할 수 있습니다. 설정 시간 초과로 인해 브로드 캐스트 메시지의 큐를 확인한 다음 해당 메시지를 보내는 각 클라이언트를 반복 할 수 있습니다. 같은 뭔가 : 어떻게 든

using (var server = new RouterSocket("@tcp://*:80")) 
{ 
    var addresses = new HashSet<string>(); 

    var msg = new NetMQMessage(); 
    while (true) 
    { 
     var clientHasMsg = server.TryReceiveMultipartMessage(TimeSpan.FromSeconds(1), ref msg); 
     if (!clientHasMsg) 
     { 
      // Check any incoming broacast then loop through all the clients 
      // sending each the brodcast msg 
      var broadMsg = new NetMQMessage(); 
      foreach (var item in addresses) 
      { 
       broadMsg.Append(item); 
       broadMsg.AppendEmptyFrame(); 
       broadMsg.Append("This is a broadcast"); 
       server.SendMultipartMessage(broadMsg); 
       broadMsg.Clear(); 
      } 

      // Go back into the loop waiting for client messages 
      continue; 
     } 

     var address = Encoding.UTF8.GetString(msg[0].Buffer); 
     var payload = Encoding.UTF8.GetString(msg[2].Buffer); 
     Console.WriteLine("[Server] - Client: {0} Says: {1}", address, payload); 

     var contains = addresses.Contains(address); 
     if (!contains) { addresses.Add(address); } 

     msg.Clear(); 
     msg.Append(address); 
     msg.AppendEmptyFrame(); 
     msg.Append("Reply for: " + address); 
     server.SendMultipartMessage(msg); 
    } 
} 

이 바로 주로 인해 생각하지 않습니다

  • 좋은 값은 시간 제한에 대한 어떤 가치인가? 1 초, 100 ms 등;
  • 이 프로그램은 초당 수천 개의 메시지를 보내는 데 100k + 클라이언트를 연결하는 데 사용되므로 가장 효율적이며 성능이 우수한 솔루션입니까?

가장 좋은 방법은 무엇입니까?

답변

1

다중 생성자 단일 소비자 대기열 인 netmqqueue를 사용할 수 있습니다. NetMQPoller에 추가하고 잠금없이 여러 스레드에서 대기열에 추가 할 수 있습니다.

+0

'Device'에서 블로그를 읽었을 때'Queue'를 언급하기 전까지는 좋은 선택이 될 것이라고 생각했습니다 :-) http : //netmq.readthedocs의 몇몇 행을 제외하고 어딘가에 예제가 있습니까? io)? – MaYaN

+0

그래, 추가 예제없이이 작업을 할 수 있다고 생각 하나, NetMQQueue 과 NetMQSscheduler의 차이점은 무엇입니까? v4에서 스케줄러가 쓸모 없습니까? – MaYaN

+0

NetMQScheduler는 더 이상 사용되지 않으며 (NetMQPoller의 일부 임), 어쨌든 NetMQScheduler는 작업 대기열이며, NetMQQueue는 모든 유형의 대기열입니다. – somdoron

0

나는 PUB/SUB가 100k + 클라이언트의 요구 사항에 대한 적절한 접근 방법이라고 생각합니다. 그럼에도 불구하고 서버로 다시 통신 할 수 없다는 의미는 아닙니다. DEALER/ROUTER를 사용하십시오. 이 솔루션이 왜 받아 들일 수 없다고 생각합니까?

+0

정확하게 이해하고 있는지 잘 모르겠습니다. 위의 솔루션을 기반으로하는 Dealer/Router를 사용하여 Pub/Sub를하는 것이 합리적인 것처럼 보입니까? – MaYaN