2017-12-21 4 views
0

Auf der Suche nach ein bisschen weiser Beratung bitte.Verwenden von AKKA FSM mit vielen gleichzeitigen Instanzen

Ich habe eine einfache Auftragsverwaltung FSM mit einem halben Dutzend Staaten. Ich spezifiziere mein System, um 10K Bestellungen pro Stunde zu unterstützen. Jede Bestellung dauert zwischen 10 und 120 Sekunden, um die FSM zu durchlaufen. Einige Übergänge rufen APIs von Drittanbietern auf. Es gibt auch einen persistenten Datenspeicher, der Informationen über die Reihenfolge und den Fortschritt enthält.

Ich denke an AKKA FSM mit einer Instanz der FSM pro gleichzeitige Bestellung. Bevor ich zu viel Zeit mit diesem Projekt verbringe, suche ich nach einem Plausibilitätscheck und wenn nicht eine alberne Idee, würde ich mich über Hinweise freuen, auf die ich besonders achten sollte.

Danke für jede Hilfe!

+0

Und was ist die Frage? –

Antwort

2

Die Darstellung jeder Bestellung als FSM-Akteur sollte in Ordnung sein. Mein "bisschen Ratschlag" ist, dass, wenn einer der API-Aufrufe von Drittanbietern blockiert oder lang andauernd ist, diese Aufrufe an andere Akteure delegiert werden, die auf einem dedizierten Dispatcher laufen, wie beschrieben here.

Zum Beispiel macht die folgenden Schauspieler einen blockierenden Aufruf, die Verwendung eines Drittanbieter-API simuliert, und sendet das Ergebnis dieses Aufrufs an den Absender:

class LegacyApiActor extends Actor { 
    implicit val executionContext: ExecutionContext = 
    context.system.dispatchers.lookup("my-blocking-dispatcher") 

    def receive = { 
    case MakeApiCall => 
     val currentSender = sender() 

     Future { 
     Thread.sleep(10000) 
     currentSender ! ApiResult("result") 
     } 
    } 
} 

Und der folgende Text ist ein Auszug aus ein FSM Schauspieler, die einen Staat hat, die für das Ergebnis des API-Aufrufs wartet, wo legacyActor ist ein Verweis auf einen LegacyApiActor:

onTransition { 
    case SomeState -> WaitForLegacyApiResult => 
    legacyActor ! MakeApiCall 
    case ... 
} 

when(WaitForLegacyApiResult) { 
    case Event(ApiResult(res), ...) => // response from legacyActor 
    goto(DifferentState) ... 
} 

den Punkt um es zu wiederholen, machen Sie nicht blockieren oder lang laufenden Anrufe in Ihrem Ordnung/FSM Schauspieler; Isolieren Sie diese Anrufe in anderen Akteuren, die dedizierte Dispatcher verwenden.

+0

danke für die Antwort. –

Verwandte Themen