Actor
それは、それぞれが、高度並列処理モデルであるActor
ビジネス・プロセスの場合には、より効率的な処理の可能性を達成するように、ロックするためのメカニズムを開発する必要がありませんので、自身の状態は、メッセージ処理機構を命じました。XRPC
コールベースのリモートインターフェースであるRPC
コンポーネント、それは簡単に高性能のリモートインターフェース呼び出しを達成することができます。XRPC
あなたは、対応するためのインタフェースの作成サポートするリモートインタフェースの作成時にActor
インスタンスを。あなたがインターフェイスを作成するとActor
、この例のすべてのケースのためのクライアントは、Actor
すべてのメソッド呼び出し整然としたプロセスです。以下は、方法について説明しXRPC
作成して使用しますActor
どのような場面に適用されますActor
それぞれがあるのでActor
、ビジネス関連これらの利点のために展開することができ、自身の状態と注文処理機構を持つ、チェスゲーム内のテーブルであってもよいActor
、各車がすることができ、チケットActor
ごとのスパイクこれは、商品の一種ですActor
。これらの中でActor
すべての操作の規則的な行為があり、そこにはロックが不要取引は、ありません(EventSourcingで保護する)とデッドロックを生成しませんが、全体のデータメモリ動作を変更し、大幅にこのを通じて事業の処理性能を向上させることができます。
参考XRPC
インストール・パッケージBeetleX.XRPC
定義Actor
RPCサービスの
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>(" ケン")。
IAmountService
2つの作成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 = 0。K <リクエスト。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
作成したサービスは、その一意性を保証することができます。