ハリウッドは、スピードと低下のアプリケーションのための超高速アクターエンジンビルドです。ゲームサーバー、広告ブローカー、トレーディングエンジンなどについて考えてみてください。1秒未満で1,000万メッセージを処理できます。
Actorモデルは、非常に同時および分散されたシステムを構築するために使用される計算モデルです。 1973年にCarl Hewittが複雑なシステムをよりスケーラブルで誤りのある方法で処理する方法として紹介しました。
俳優モデルでは、基本的なビルディングブロックは俳優であり、ハリウッドのレシーバーと呼ばれることもあります。これは、メッセージを交換することで他の俳優と通信する独立した計算単位です。各俳優には独自の状態と行動があり、メッセージを送信することによってのみ他の俳優と通信することができます。このメッセージを通過するパラダイムは、他の俳優が失敗したり利用できなくなったとしても、俳優が独立して動作し続けることができるため、非常に分散型で断層耐性システムを可能にします。
俳優は階層に編成でき、高レベルの俳優は低レベルの俳優を監督し、調整することができます。これにより、優雅で予測可能な方法で障害とエラーを処理できる複雑なシステムを作成できます。
アプリケーションでActorモデルを使用することにより、多数の同時ユーザーと複雑な相互作用を処理できる非常にスケーラブルで障害耐性システムを構築できます。
アクターの失敗に関する保証されたメッセージ配信(バッファメカニズム)
Fire&forgedまたはRequired&Responseメッセージ、またはその両方
輸送層としての高性能DRPC
反射せずに最適化されたプロトバッファー
軽量で高度にカスタマイズ可能
分散型の自己発見俳優を書くためのクラスターサポート
make bench
spawned 10 engines spawned 2000 actors per engine Send storm starting, will send for 10s using 20 workers Messages sent per second 3244217 .. Messages sent per second 3387478 Concurrent senders: 20 messages sent 35116641, messages received 35116641 - duration: 10s messages per second: 3511664 deadletters: 0
go get github.com/anthdm/hollywood/...
ハリウッドにはゴランバージョン
1.21
必要です
ローカルで実行されるいくつかの例を書くことから始めることをお勧めします。コンパイラが使用されるタイプを把握できるため、ローカルで実行するのは少し簡単です。リモートで実行するときは、コンパイラにProtobuffer定義を提供する必要があります。
Hello Worldメッセージを見てみましょう。完全な例は、Hello Worldフォルダーで利用できます。メインから始めましょう:
エンジン、err:= actor.newengine(actor.newengineconfig())
これにより、新しいエンジンが作成されます。エンジンはハリウッドの中核です。俳優を産み、メッセージを送信し、俳優のライフサイクルを処理する責任があります。ハリウッドがエンジンの作成に失敗した場合、エラーが返されます。開発のためには、エンジンにオプションを渡すために使用しないようにして、nilを渡すことができます。後でオプションを見ます。
次に、俳優を作成する必要があります。これらは、実装する必要があるインターフェイス後にReceivers
と呼ばれる場合があります。メッセージを受け取ったときにメッセージを印刷する新しい俳優を作成しましょう。
pid:= engine.spawn(newhelloer、 "hello")
これにより、エンジンはID「Hello」で俳優を生成します。俳優は、提供された機能newHelloer
によって作成されます。 IDは一意でなければなりません。 PIDへのポインターを返します。 PIDはプロセス識別子です。それは俳優にとってユニークな識別子です。ほとんどの場合、PIDを使用して俳優にメッセージを送信します。リモートシステムに対してIDを使用してメッセージを送信しますが、ローカルシステムではPIDを主に使用します。
newHelloer
関数とそれが返す俳優を見てみましょう。
タイプhelloer struct {} func newhelloer()actor.receiver {return&helloer {} }
簡単です。 newHelloer
関数は新しい俳優を返します。俳優は、actor.receiverを実装する構造体です。 Receive
方法を見てみましょう。
タイプメッセージstruct {} func(h *helloer)受信(ctx *actor.context){switchsg:= ctx.message()。(type){case actor.Initialized:fmt.println( "hello has initialized")ケースactor.started:fmt.println( "helloer start")case actor.stopped:fmt.println( "helloer has停止 ")ケース *メッセージ:fmt.println(" hello world "、msg.data) } }
メッセージ構造を定義していることがわかります。これは、後で俳優に送信するメッセージです。受信方法は、他のいくつかのメッセージも処理します。これらのライフサイクルメッセージはエンジンから俳優に送信されます。これらを使用して俳優を初期化します
エンジンは、actor.contextをReceive
メソッドに渡します。このコンテキストには、メッセージ、送信者のPID、および使用できるその他の依存関係が含まれます。
さて、俳優にメッセージを送りましょう。 message
送信しますが、必要なメッセージを送信できます。唯一の要件は、俳優がメッセージを処理できる必要があることです。メッセージがワイヤーを横切ることができるようにするには、シリアル化可能でなければなりません。 Protobufがメッセージをシリアル化できるようにするためには、ポインターである必要があります。ローカルメッセージは任意のタイプにすることができます。
最後に、俳優にメッセージを送りましょう。
Engine.send(pid、 "hello world!")
これにより、俳優にメッセージが送信されます。ハリウッドはメッセージを正しい俳優にルーティングします。俳優はコンソールにメッセージを印刷します。
例フォルダーは、ハリウッドをさらに学び、探索するのに最適な場所です。
俳優を生み出したとき、新しい俳優を返す関数を提供する必要があります。俳優が生成されるため、提供できるいくつかの調整可能なオプションがあります。
e.spawn(newfoo、 "myactorname")
俳優コンストラクターに議論を渡したい場合があります。これは、閉鎖を使用して実行できます。リクエストの例には、この例があります。コードを見てみましょう。
デフォルトのコンストラクターは次のようになります:
func newnameresponder()actor.receiver {return&nameresponder {name: "noname"} }
名前の新しい俳優を構築するには、次のことを行うことができます。
FUNC NewCustomNameResponder(name string)actor.producer {return func()actor.receiver {return&nameresponder {name} } }
その後、次のコードで俳優を生成できます。
pid:= engine.spawn(newcustomnameresponder( "anthony")、 "name-responder"))
E.Spawn(Newfoo、 "myactorname"、Actor.WithMaxRestarts(4)、Actor.WithinBoxsize(1024 * 2)、Actor.Withid( "Bar")、 )) ))
オプションはかなり自明でなければなりません。再起動の最大数を設定できます。これは、パニックの場合に指定されたアクターを再起動する回数、受信トレイのサイズを指示することができます。ブロックする。
国家のない俳優は、迅速かつシンプルなので、関数として生じることができます。
e.SpawnFunc(func(c *actor.context){switch msg:= c.message()。(type){case actor.started:fmt.println( "start")_ = msg } }、 "foo")
アクターは、リモートパッケージを使用してネットワークを介して互いに通信できます。これは、地元の俳優と同じように機能しますが、「Over the Wire」です。ハリウッドは、Protobufとのシリアル化をサポートしています。
remote.new()は、リッスンアドレスとremote.config structを取得します。
次のコードで新しいリモコンをインスタンス化します。
tlsconfig:= tlsconfig:&tls.config {証明書:[] tls.certificate {cert}、 } config:= remote.newconfig()。 ))
詳細については、リモートアクターの例とチャットクライアントとサーバーをご覧ください。
生産システムでは、最終的には問題が発生します。俳優はクラッシュし、マシンが失敗し、メッセージはデッドレターキューになります。イベントストリームを使用して、これらのイベントを優雅で予測可能な方法で処理できるソフトウェアを構築できます。
イベントストリームは、依存関係なく柔軟でプラグ可能なシステムを構築できる強力な抽象化です。
俳優をシステムイベントのさまざまなリストに購読する
カスタムイベントをすべてのサブスクライバーにブロードキャストします
俳優によって処理されないイベントは削除されることに注意してください。イベントを受信するために、俳優がイベントストリームを購読する必要があります。最低限、 DeadLetterEvent
処理する必要があります。ハリウッドが俳優にメッセージを配信できなかった場合、イベントストリームにDeadLetterEvent
送信します。
actor.LogEvent
インターフェイスを満たすイベントは、 actor.LogEvent
log()
メソッドによって設定されたイベントの重大度、メッセージ、および属性を使用して、デフォルトのロガーにログに記録されます。
actor.ActorInitializedEvent
、俳優は初期化されましたが、そのactor.Started message
actor.ActorStartedEvent
、俳優が始めました
actor.ActorStoppedEvent
、俳優が停止しました
actor.DeadLetterEvent
、メッセージは俳優に配信されませんでした
actor.ActorRestartedEvent
、俳優はクラッシュ/パニックの後に再起動しました。
actor.RemoteUnreachableEvent
、到達不可能なリモコンにワイヤーを介してメッセージを送信します。
cluster.MemberJoinEvent
、新しいメンバーがクラスターに参加します
cluster.MemberLeaveEvent
、新しいメンバーがクラスターを去りました
cluster.ActivationEvent
、新しい俳優がクラスターでアクティブ化されます
cluster.DeactivationEvent
、俳優はクラスターで無効にされます
イベントストリームの使用方法を示すイベントストリーム監視の例があります。 2人の俳優が特徴です。1人は不安定で、毎秒クラッシュします。他の俳優はイベントストリームに登録されており、クラッシュなどのさまざまなイベントのためにいくつかのカウンターを維持しています。
アプリケーションは数秒間実行され、毒は不安定な俳優です。その後、リクエストでモニターを照会します。俳優がエンジンの内側に浮かんでいるので、これがあなたがそれらと対話する方法です。メインはクエリの結果を印刷し、アプリケーションは終了します。
関数オプションパターンを使用しています。すべての関数オプションはアクターパッケージにあり、「EngineOpt」で名前を開始します。現在、唯一のオプションはリモコンを提供することです。これはによって行われます
r:= remote.new(remote.config {ristenaddr:addr})エンジン、err:= actor.newengine(actor.engineoptremote(r))
ADDRは、フォーマット「HOST:PORT」を備えた文字列です。
レシーバーにカスタムミドルウェアを追加できます。これは、 actor.Started
actor.Stopped
レシーバーのメトリックの保存、保存、ロードデータを保存し、ロードするのに役立ちます。
カスタムミドルウェアの実装方法の例については、例のミドルウェアフォルダーをご覧ください
ハリウッドにはいくつかの組み込みロギングがあります。 log/slog
パッケージからデフォルトのロガーを使用します。 slog.SetDefaultLogger()
使用してデフォルトのロガーを設定することにより、ロガーを好みに合わせて構成できます。これにより、ログレベル、フォーマット、出力をカスタマイズできます。詳細については、 slog
パッケージをご覧ください。
これらのイベントがactor.LogEvent
インターフェイスを満たすため、 DeadLetterEvent
やActorStartedEvent
など、一部のイベントがデフォルトのロガーにログに記録される場合があることに注意してください。詳細については、上のEventstreamセクションを参照してください。
make test
2000人以上のメンバーと一緒に不一致コミュニティに参加して、質問と素敵なチャットをご覧ください。
このプロジェクトは現在、次の組織/プロジェクトによって生産に使用されています。
Sensora IoT
ハリウッドはMITライセンスの下でライセンスされています。