アッカとは?
リアルタイムのスケーラブルな分散トランザクション処理
正しく、並列で、フォールトトレラントでスケーラブルなアプリケーションを作成するのは難しいと考えています。
ほとんどの場合、これは間違ったツールと間違ったレベルの抽象化を使用しているためです。 Akkaはそれを変更するために作成されました。
アクターモデルを使用して、抽象化のレベルを上げ、スケーラブルで復元力のある柔軟なアプリケーションを作成するためのより良いプラットフォームを提供します(詳細については、 Reactive Manifestoを参照)。
フォールトトレランスを確保するために、電気通信業界で大成功を収めて使用されている自己修復アプリケーションとシステムを作成し、停止することのない「let it fall」モデルを使用しています。 また、アクターは、配布の透過的な抽象化レベルと、真にスケーラブルで復元力のあるアプリケーションの基盤を提供します。
Akka.NETはオープンソースプロジェクトであり、 Apache 2ライセンスの下で利用可能です- ここで説明します 。
ユニークなハイブリッド
俳優
俳優はあなたに与えます:
- 競争力と並行性のためのシンプルで高レベルの抽象化。
- 非同期、非ブロッキング、および高性能のイベント駆動型プログラミングモデル。
- 非常に軽いイベントプロセス( ヒープ上のGBあたり数百万のアクター)。 C#またはF#のセクションを参照してください。
耐障害性
- 「let it fall」のセマンティクスを持つ管理階層。
- 管理階層は複数の仮想マシンにまたがって、真のフォールトトレラントシステムを提供できます。
- 自己修復が可能で、停止することのない回復力の高いシステムを作成するのに最適です。 フォールトトレランスを参照してください。
透明な配置
Akkaのすべては、分散環境で動作するように設計されています。アクター間のやり取りはすべてシンプルなメッセージングを使用し、すべてが非同期です。
クラスタリングのサポートは現在ベータ版です。 詳細はこちらをご覧ください 。
持続性
Akka.Persistenceは現在ベータ版であり、非常に活発に開発されています。 (ドキュメント内のアイテムのリンクは壊れていますが、githubでは「 まだ実装されていません 」とだけ書かれています )。
なぜアッカなのか?
競合他社に対するAkka.NETの利点は何ですか?
Akka.NETは、スケーラブルな分散リアルタイムトランザクション処理を提供します。
Akka.NETは、以下のための単一のランタイムおよびプログラミングモデルです。
- 垂直スケーリング(競合)
- 水平スケーリング(リモート)
- 耐障害性
Akka.NETは非常にスケーラブルなソフトウェアです。 パフォーマンスのコンテキストだけでなく、それが使用されるアプリケーションのサイズにおいても同様です。 Akka.NETのコアであるAkka.NET-actorは非常に小さく、非同期を必要とする既存のプロジェクトに簡単に配置でき、競争力を妨げません。
Akka.NETを使用する良い例ですか?
Akka.NETは、さまざまな業界の多くの大規模な組織でどのように使用されているかがわかります。
- 投資銀行
- 小売業
- ソーシャルメディア
- モデリング
- ゲームと賭け
- 自動車およびモーション制御システム
- ヘルスケア
- データ分析など。 高帯域幅と低遅延が必要なシステムは、Akka.NETを使用するのに適した候補です。
アクターを使用すると、障害(マネージャー)を管理し、ワークロード(棚上げ戦略、タイムアウト、プロセス分離)を管理できるだけでなく、水平および垂直のスケーラビリティ(コアを追加したり、マシンを追加したりできます)。
これはAkkaユーザーの何人かが言うことです。
Akka.NETを使い始める
このチュートリアルは、Akka.NETの使用の概要です。 これにより、C#を使用して簡単なGreeter(Welcoming)アクターが作成されます。
プロジェクトのセットアップ
Visual Studioを起動して、新しいC#コンソールアプリケーションを作成します。 次に、パッケージマネージャーコンソールを開き、次のように入力します。
PM> インストール-パッケージAkka
NuGetを使用することもできます
次に、次を使用して追加する必要があります。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; // using Akka; using Akka.Actor; namespace ConsoleApplication11 { class Program { static void Main(string[] args) { } } }
最初の俳優を作成する
最初のステップは、アクターが応答するメッセージのタイプを作成することです。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Akka; using Akka.Actor; namespace ConsoleApplication11 { // () , public class Greet { public Greet(string who) { Who = who; } public string Who { get;private set; } } class Program { static void Main(string[] args) { } } }
メッセージタイプを取得したら、アクターを作成できます。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Akka; using Akka.Actor; namespace ConsoleApplication11 { public class Greet { public Greet(string who) { Who = who; } public string Who { get;private set; } } // public class GreetingActor : ReceiveActor { public GreetingActor() { // // Greet () Receive<Greet>(greet => Console.WriteLine("Hello {0}", greet.Who)); } } class Program { static void Main(string[] args) { } } }
次に、アクターにメッセージを送信します。 これを行うには、
ActorSystem
を使用して
ActorSystem
を呼び出し
ActorOf
。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Akka; using Akka.Actor; namespace ConsoleApplication11 { public class Greet { public Greet(string who) { Who = who; } public string Who { get;private set; } } public class GreetingActor : ReceiveActor { public GreetingActor() { Receive<Greet>(greet => Console.WriteLine("Hello {0}", greet.Who)); } } class Program { static void Main(string[] args) { // ( ) var system = ActorSystem.Create("MySystem"); // . // "ActorRef", // , // . var greeter = system.ActorOf<GreetingActor>("greeter"); // greeter.Tell(new Greet("World")); // // , // . Console.ReadLine(); } } }
したがって、アクターは、任意の数の呼び出しスレッドから送信されたメッセージを受信する準備ができています。
必須のHello World!
この例は、C#およびF#でアクターを定義および使用する方法を示しています。
C#APIを使用したHello World
メッセージ定義:
// () , public class Greet { public Greet(string who) { Who = who; } public string Who { get;private set; } }
ReceiveActor
APIを使用してアクターを定義します:
// public class GreetingActor : ReceiveActor { public GreetingActor() { Receive<Greet>(greet => Console.WriteLine("Hello {0}", greet.Who)); } }
...または
TypedActor
APIを使用:
public class GreetingActor : TypedActor , IHandle<Greet> { public void Handle(Greet greet) { Console.WriteLine("Hello {0}!", greet.Who); } }
使用法:
// ( ) var system = ActorSystem.Create("MySystem"); // . // "IActorRef", // , // . var greeter = system.ActorOf<GreetingActor>("greeter"); // greeter.Tell(new Greet("World")); // // , // . Console.ReadLine();
以下も参照してください(元のアイテムは現在ありません):
- [[型指定されていない俳優]]
- [[入力された俳優]]
F#APIを使用したHello World:
// () , type Greet = Greet of string let system = ActorSystem.Create "MySystem" // Use F# computation expression with tail-recursive loop // to create an actor message handler and return a reference let greeter = spawn system "greeter" <| fun mailbox -> let rec loop() = actor { let! msg = mailbox.Receive() match msg with | Greet who -> printf "Hello, %s!\n" who return! loop() } loop() greeter <! Greet "World"
ユースケースと展開シナリオ:
コンソールアプリケーション
PM> install-package Akka
PM> install-package Akka.Remote
using Akka; using Akka.Actor; using Akka.Configuration; namespace Foo.Bar { class Program { static void Main(string[] args) { // configure remoting for localhost:8081 var fluentConfig = FluentConfig.Begin() .StartRemotingOn("localhost", 8081) .Build(); using (var system = ActorSystem.Create("my-actor-server", fluentConfig)) { // start two services var service1= system.ActorOf<Service1>("service1"); var service2 = system.ActorOf<Service2>("service2"); Console.ReadKey(); } } } }
地下室
この記事は、 非常に緩やかな翻訳ですAkka.NETの概要 。