2017-08-21 1 views
0

Ich suche stundenlang, wie ich vorgehen soll, wenn wir einen RPC-Aufruf an einen Server machen, der online ist, aber den RPC-Server nicht ausführt.Wie versucht man, einen RPC-Aufruf an einen Offline-RPC-Server abzufangen?

Das einzige, was ich in meinem Code tue, ist Ping unserer Failover-IP-Adresse, um zu überprüfen, ob der Server läuft, aber wenn ich einen RPC-Aufruf mit meiner C# -Anwendung mache, stürzt es ab.

die RPC-Aufruf Funktion:

public string Call(string message) 
{ 
    var corrId = Guid.NewGuid().ToString(); 
    var props = channel.CreateBasicProperties(); 
    props.ReplyTo = replyQueueName; 
    props.CorrelationId = corrId; 

    var messageBytes = Encoding.UTF8.GetBytes(message); 
    channel.BasicPublish(exchange: "", routingKey: "rpc_queue", basicProperties: props, body: messageBytes); 

    while(true) 
    { 
     var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); 
     if(ea.BasicProperties.CorrelationId == corrId) 
     { 
      return Encoding.UTF8.GetString(ea.Body); 
     } 
    } 
} 

Hat jemand eine Lösung?

PS: RabbitMQ gesteht diese folgenden Probleme nicht lösen zu tun:

Unser Code immer noch ziemlich simpel ist und nicht versucht, komplexere (aber wichtige) Probleme zu lösen, wie:

Wie sollte der Client reagieren, wenn keine Server laufen?

Sollte ein Client eine Art Timeout für den RPC haben?

Danke.

+0

Haben Sie Paxos Fault Tolerant Algorithmus lesen? Wenn nicht, bitte gehen Sie es durch. –

+0

Sorry ... bearbeitet! Ich lese Paxos, aber es sieht kompliziert aus :) –

Antwort

0

Für diejenigen, die dieses Problem haben, löste ich diese wie:

try 
{ 
    var task = Task.Run(() => rpcClient.Call(data_encoded)); 
    if (task.Wait(TimeSpan.FromSeconds(3))) 
    { 
     response = task.Result; 
    } 
    else 
    { 
     throw new Exception("Timed out"); 
    } 
    Console.WriteLine("RESPONSE : " + response); 
} 
catch (Exception e) 
{ 
    // Some code here ... 
} 
Verwandte Themen