2016-06-17 10 views
2

Als Neuling, Schreiben einer Spielzeug-Matching-Engine (Handel) mit gen_server.Erlang: gen_server - Antwort auf zwei Clients

Sobald ein Trade/Match auftritt, müssen beide Clients benachrichtigt werden.

Dokumentation sagt, dass:

reply(Client, Reply) -> Result 

Arten:

Client - see below 
Reply = term() 
Result = term() 

Diese Funktion kann durch eine gen_server verwendet werden explizit an einen Client eine Antwort zu senden, die call/2,3 oder multi_call/2,3,4, aufgerufen, wenn Die Antwort kann nicht im Rückgabewert Module:handle_call/3 definiert werden.

Client muss das Von-Argument für die Callback-Funktion sein. Antwort ist ein beliebiger Begriff, der als Rückgabewert von call/2,3 oder multi_call/2,3,4 an dem Client zurückgegeben wird. Der Rückgabewert Ergebnis wird nicht weiter definiert und sollte immer ignoriert werden.

Angesichts der oben genannten wie ist es möglich, eine Benachrichtigung an den anderen Client zu senden.

SAMPLE Folge von Aktionen

C1 -> Place order IBM,BUY,100,10.55 
    Server -> Ack C1 for order 
    C2 -> Place order IBM,SELL,100,10.55 
     Server -> Ack C2 for order 
      -> Trade notification to C2 
      -> Trade notification to C1 %% Can I use gen_server:reply() 
             %% If yes - How ? 

Antwort

1

Nun, können Sie nicht. Ihre ACK ist bereits eine Antwort. Und nur eine einzige Antwort ist akzeptabel von gen_server:callVertrag. Ich meine, gen_server:call wird nur auf eine Antwort warten.

Allgemeinen gen_server:reply kann wie

reply({Pid, Ref}, Result) -> 
    Pid ! {Ref, Result}. 

Das bedeutet, umgesetzt werden, dass, wenn Sie mehrere Antworten versuchen zu senden, die Sie gerade im Meldungsfeld des Anrufers Prozess einige weired Meldungen.

Vorschlag

Stattdessen glaube ich, sollten Sie jeden Handel mit einigen Referenz Associate senden, und mit dieser Referenz CX_Ref während der ACK Prozedur Nachricht an den Anrufer senden. Wenn Sie dann eine Benachrichtigung senden müssen, senden Sie einfach die Nachricht {C1_Ref, Payload} an C1 und {C2_Ref, Payload} an C2.

Auch möchten Sie vielleicht einige Überwachung vorstellen Broker Crashs behandeln.

+0

Danke zur Klarstellung, würde dies bedeuten, dass gen_server, ist nicht für eine Trading-Engine geeignet, würde es sinnvoll sein, die anderen gen_ * zu verwenden, die eine empfohlen wird. – CSP

+1

@CSP, ich sage nicht, dass gen_server ist unangemessen, ich sage nicht, es ist die beste Lösung. Ich glaube, Sie können damit beginnen, aber vielleicht möchten Sie diese Entscheidung später ändern. – Lol4t0