2017-08-21 7 views
0

私はオンラインでRPCサーバーを実行していないサーバーにRPC呼び出しを行うと、どのように処理を進めるのか検索しています。オフラインRPCサーバーへのRPC呼び出しの試行方法

私のコードで行っているのは、サーバーが実行しているかどうかを確認するためにフェールオーバーIPアドレスをpingするだけですが、C#アプリケーションでRPC呼び出しを行うとクラッシュします。

RPCコール機能:

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); 
     } 
    } 
} 

誰もが解決策を持っていますか?

PS:RabbitMQのは、これらの次のような問題を解決しないために告白:

私たちのコードはまだかなり単純化され、より複雑な(しかし重要な)問題を解決しようとしない、のように:

サーバーが稼働していない場合、クライアントはどのように反応すべきですか?

RPCには何らかの種類のタイムアウトが必要ですか?

ありがとうございます。この問題を持っている人のために

+0

あなたがパクシフォールトトレラントアルゴリズムについて読みましたか?そうでない場合は、それを通過してください。 –

+0

申し訳ありません...編集済み!私はPaxosを読むが、それは複雑に見える:) –

答えて

0

、私はこのように解決:

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 ... 
} 
関連する問題