XRPCを使用して.NETコアは、リモートインタフェースオブジェクト俳優を作成します

Actorそれは、それぞれが、高度並列処理モデルであるActorビジネス・プロセスの場合には、より効率的な処理の可能性を達成するように、ロックするためのメカニズムを開発する必要がありませんので、自身の状態は、メッセージ処理機構を命じました。XRPCコールベースのリモートインターフェースであるRPCコンポーネント、それは簡単に高性能のリモートインターフェース呼び出しを達成することができます。XRPCあなたは、対応するためのインタフェースの作成サポートするリモートインタフェースの作成時にActorインスタンスを。あなたがインターフェイスを作成するとActor、この例のすべてのケースのためのクライアントは、Actorすべてのメソッド呼び出し整然としたプロセスです。以下は、方法について説明しXRPC作成して使用しますActor

どのような場面に適用されますActor

それぞれがあるのでActor、ビジネス関連これらの利点のために展開することができ、自身の状態と注文処理機構を持つ、チェスゲーム内のテーブルであってもよいActor、各車がすることができ、チケットActorごとのスパイクこれは、商品の一種ですActorこれらの中でActorすべての操作の規則的な行為があり、そこにはロックが不要取引は、ありません(EventSourcingで保護する)とデッドロックを生成しませんが、全体のデータメモリ動作を変更し、大幅にこのを通じて事業の処理性能を向上させることができます。

参考XRPC

インストール・パッケージBeetleX.XRPC

定義ActorRPCサービスの

XRPC・サポート・Actorサービスが上に構築されEventNext、その利点のトップは、行動が直接インタフェースでActor作成するのではなく、プラスのメッセージを受信するための伝統的な方法なので、非常に便利で柔軟なアプリケーション設計で呼び出して。次に、簡単な定義Actorサービスを

  • インタフェース定義
    1つの   パブリック インターフェースIAmountService
     2    {
     3        タスク< INT >利益(INTの量)。
    4        タスク< INT >支払い(INTの量)。
    5        タスク< 整数 > を取得();
    6    }
    上記は、行動変化の記録を維持するためのシンプルなインターフェイスです
  • インターフェイスを実装します

    1    [サービス(typeof演算(IAmountService))]
     2    パブリック クラスAmountService:ActorState、IAmountService
     3    {
     4  
    5        プライベート INT mAmount。
    6  
    7        公共 オーバーライドタスクActorInit(文字列ID)
     8        {
     9            リターン ベース.ActorInit(ID)。
    10        }
     11  
    12        公衆タスク< INT > プレゼント()
     13        {
     14            リターンmAmount.ToTask()。
    15       }
     16  
    17        公衆タスク< INT >利益(INTの量)
     18        {
     19            mAmount + = 量。
    20            リターンmAmount.ToTask()。
    21        }
     22  
    23        公衆タスク< INT >支払い(INTの量)
     24        {
     25            mAmountは- = 量を、
    26            リターンmAmount.ToTask()。
    27        }
     28    }
  • 対応するRPCサービスを開始

          プライベート 静的XRPCServer mXRPCServer。
    
          静的 ボイドメイン(文字列[]引数)
          { 
              mXRPCServer = 新しいXRPCServer()。
              mXRPCServer.ServerOptions.LogLevel = LogType.Error。
              mXRPCServer.Register(typeof演算(プログラム).Assembly)。
              mXRPCServer.Open(); 
              Console.Read(); 
          }

    上記のコードは、デフォルトのポートで9090のバインディングRPCサービス、あなたはケースを実行して、ログサービスが開始さを表示することができます

リモート作成Actor呼び出しを

  • 作成RPCクライアント
    1つのクライアント= 新しい XRPCClient(" 192.168.2.18 "9090 );
    2 client.Connect()。
    このコードは、作成することですRPC、それを通してクライアントCreate使用すると、インタフェースエージェントを作成することができますが
  • 俳優のインスタンスは、インターフェイスを作成するには
    IAmountServiceヘンリー= client.Create <IAmountService>(" ヘンリー" )。
    IAmountServiceケン = client.Create <IAmountService>(" ケン")。
    これらは、のためにされているIAmountService2つの作成Actorオブジェクトは、これらの2つのオブジェクトの操作は、お互いを乱すことなく互いに分離され、各Actorメソッドオブジェクトは同時実行に並べられ、スレッド安全性の問題を発生しないので、さまざまな方法で画像データメンバの操作は、データのセキュリティを確保するためにロックを必要としません。

テスト

検証するためにActor分離および同時実行の安全性を、単に並行試験

1              ためint型 i = 0 ; iは<同時、iは++ 2              {
 3                  VARのタスク= Task.Run(非同期()=>
 4                  {
 5                      ためのint型のk = 0 ; K <リクエストあり、k ++ 6                      {
 7                          待つヘンリー.Income(10 );
 8                          System.Threading.Interlocked.Increment(REF MCOUNT);
 9                      }
 10                  });
11                 tasks.Add(タスク)。
12                  タスク= Task.Run(非同期()=>
 13                  {
 14                      のためのint型 K = 0、K <リクエスト; kは++ 15                      {
 16が                         待つ henry.Payout(10 );
 17                          System.Threading.Interlocked.Increment(REF MCOUNT );
 18                      }
 19                  });
20                  tasks.Add(タスク)。
21                  タスク= Task.Run(非同期()=>
 22                  {
 23                      のためのint型のk = 0 ; <リクエストをk個あり、k ++ 24                      {
 25が                         待つ ken.Income(10 )。
26                          System.Threading.Interlocked.Increment(REF MCOUNT)。
27                      }
 28                  });
29                  tasks.Add(タスク)。
30                  タスク= Task.Run(非同期()=>
 31                  {
 32                      のためにINTK = 0K <リクエスト。K ++ 33                      {
 34が                         待つ ken.Payout(10 )。
35                          System.Threading.Interlocked.Increment(REF MCOUNT)。
36                      }
 37                  });
38                  tasks.Add(タスク)。
39              }
 40が             待つTask.WhenAll(tasks.ToArray())。
41              ダブル useTime = EventCenter.Watch.ElapsedMilliseconds - スタート。
42              Console.WriteLineを($ "完了数:{MCOUNT} |利用時間:{useTime} |は、RPS:{(MCOUNT / useTime * 1000D):### 00。} |ヘンリー:{henry.Get()を待つ}、ケンは:{ken.Getを待ちます()} ");

11万RPS約50同時の場合には、ビットを実行するマシンで、同時に2つのプログラム

サービスActorの分離

サービスインターフェースは異なる名前でインスタンス化されActor、より一層同じサービスClient名同時にActor作成したサービスは、その一意性を保証することができます。

完全なコード例

https://github.com/IKende/XRPC/tree/master/Samples/Actors

おすすめ

転載: www.cnblogs.com/smark/p/10941819.html