Wednesday 8 November 2017

Erlang Trading System


25 Maggio 16 00 BST 15 00 UTC 17 00 08 00 PDT Sportrisq sono un broker e distributore di soluzioni per la gestione del rischio e di prodotti per l'industria dello sport Ascolta CTO Justin Worall descrivere il processo di migrazione di due componenti della piattaforma core di Python per Erlang sottostante problemi in questione, i vantaggi percepiti di Erlang in queste situazioni, il processo decisionale, i disegni di applicazione e il results. In questo webinar, è ll processo learn. The di migrazione di componenti Python bassa latenza per Erlang. The decisionale process. Application disegni e results. Learn qualche Erlang. Hey lì, il tuo Javascript non è attivato che s bene, il sito funziona senza di essa, tuttavia, si potrebbe preferire la lettura con evidenziazione della sintassi, che richiede Javascript. Rage Against The stati finiti macchine. una macchina FSM a stati finiti in realtà non è una macchina, ma ha un numero finito di stati io ho sempre trovato le macchine a stati finiti più facili da capire con grafici e diagrammi per esempio, il seguente sarebbe uno schema semplicistico per un tempo molto muto cane come uno stato machine. Here il cane ha 3 stati seduti, abbaiando o scodinzolando eventi o ingressi diversi possono costringerlo a cambiare il suo stato, se un cane è tranquillamente seduto e vede uno scoiattolo, inizierà ad abbaiare e ha vinto t fermerà fino a quando si accarezzarlo ancora Tuttavia, se il cane è seduto e si accarezzarlo, non abbiamo idea di quello che potrebbe accadere nel mondo Erlang, il cane potrebbe andare in crash e, infine, essere riavviato dal suo supervisore Nel mondo reale, che sarebbe un evento Freaky, ma il vostro cane sarebbe tornato dopo essere stato eseguito da una macchina, quindi non è tutto bad. Here sa gatto s diagramma di stato per un gatto comparison. This ha un unico stato, e nessun evento può mai cambiare lo stato it. Implementing gatto macchina in Erlang è un divertente e semplice task. We può provare il modulo di vedere che il gatto in realtà non dà mai un crap. The stesso può essere fatto per il cane FSM tranne più stati sono available. It dovrebbe essere relativamente semplice da abbinare ciascuno di gli stati e le transizioni a quello che era nel diagramma sopra Qui s la FSM in use. You può seguire con lo schema se si desidera che faccio di solito, aiuta la certezza che nulla s wrong. That davvero il cuore del FSM implementato come Erlang elabora ci sono cose che avrebbero potuto essere fatte stato diverso avremmo potuto passati negli argomenti delle funzioni statali in un modo simile a quello che facciamo con i server ciclo principale potremmo anche aggiunto un init e terminare funzioni, gestito aggiornamenti del codice, etc. Another differenza tra il cane e il gatto FSM è che gli eventi del gatto s sono sincroni e gli eventi del cane s sono asincrone in un vero e proprio FSM, entrambi potrebbero essere utilizzati in modo misto, ma sono andato per la rappresentazione più semplice per pura non sfruttato pigrizia ci sono altre forme di manifestazione gli esempi non mostrano eventi globali che possono accadere in qualsiasi esempio state. One di un tale evento potrebbe essere quando il cane ottiene una sniffata di cibo una volta l'evento cibo odore viene attivato, non importa quale sia stato il cane è, lui d andare a cercare la fonte di food. Now abbiamo vinto t spendere troppo tempo attuare tutto questo nella nostra FSM scritto-on-a-tovagliolo Invece abbiamo ll passare direttamente alla genfsm comportamento genfsm behaviour. The è alquanto simile a genserver in quanto è una versione specializzata di essa La grande differenza è che invece di gestire le chiamate e getta abbiamo ri gestione di eventi sincroni e asincroni Molto come nostri esempi di cani e gatti, ogni stato è rappresentato da una funzione Ancora, ll passare attraverso i callback nostri moduli hanno bisogno di implementare al fine di work. This è lo stesso init 1 come quello usato per i server generici, tranne i valori di ritorno accettati sono e The tuple fermata funziona nello stesso modo come per genserver s, e hibernate e Timeout mantenere la stessa semantics. What s nuovo qui è che NomeStato NomeStato variabile è un atomo e rappresenta la funzione di callback prossimo ad essere funzioni called. The NomeStato 2 e 3 NomeStato sono nomi segnaposto e si sono di decidere quali saranno sia s supporre la init 1 funzione restituisce la tupla Ciò significa che la macchina a stati finiti sarà in uno stato seduto Questo non è lo stesso tipo di stato come avevamo visto con genserver è piuttosto equivalente alla corteccia di sedersi e Ballerina stati del cane precedente FSM questi stati dettare un contesto in cui si gestisce un dato esempio event. An di questo sarebbe qualcuno ti chiama sul telefono Se sei in stato di dormire su un Sabato mattina, la vostra reazione potrebbe essere quella di urlare nel telefono Se il vostro stato sta aspettando un colloquio di lavoro, è probabile che si ll prendere il telefono e risponde educatamente D'altra parte, se sei in stato di morte, poi mi sorprende si può anche leggere questo testo in all. Back al nostro FSM il 1 funzione init detto che dovrebbe essere in stato seduto Ogni volta che il processo di genfsm riceve un evento, sia la funzione di seduta 2 o seduti 3 si chiamerà la funzione di seduta 2 si chiama per gli eventi asincroni e seduta 3 per gli argomenti ones. The sincroni per la seduta 2 o in generale NomeStato 2 sono eventi il ​​messaggio effettivo inviato come un evento, e StateData i dati che è stata effettuata nel corso degli chiamate seduti 2 può poi tornare tuple and. The argomenti per sedersi 3 sono simili, tranne che c'è un Da variabile tra evento e StateData The Da variabile viene usato esattamente allo stesso modo come per genserver s, compreso la risposta genfsm 2 le funzioni StateName 3 possono restituire il seguente tuples. Note che ci s alcun limite al numero di queste funzioni è possibile avere, purché siano esportati gli atomi restituiti come NextStateName nelle tuple determinerà se la funzione sarà chiamata o not. In l'ultima sezione, che ho citato eventi globali che potrebbero scatenare una reazione specifica, non importa in quale stato si ri nel cane odore cibo scenderà qualunque cosa sta facendo e che invece cerca di cibo per questi eventi che devono essere trattati allo stesso modo in ogni stato, il callback handleEvent 3 è ciò che si desidera che la funzione prende argomenti simili a NomeStato 2 con l'eccezione che accetta una variabile NomeStato tra di loro , che ti dice ciò che lo stato è stato quando l'evento è stato ricevuto restituisce gli stessi valori NomeStato 2. handlesyncevent 4 richiamata è quello di NomeStato 3 quello handleEvent 2 è quello di NomeStato 2 gestisce eventi globali sincroni, gli stessi parametri e restituisce lo stesso tipo di tuple come NomeStato 3.Now potrebbe essere un buon momento per spiegare come sappiamo se un evento è globale o se è destinata ad essere inviata a uno specifico stato per determinare questo possiamo guardare la funzione utilizzata per inviare un evento di gli eventi FSM asincroni volte a qualsiasi funzione NomeStato 2 vengono inviati con sendEvent 2 eventi sincroni per essere prelevati da NomeStato 3 devono essere inviati con syncsendevent 2-3.The due funzioni equivalenti per gli eventi globali sono sendallstateevent 2 e syncsendallstateevent 2-3 abbastanza una lunga name. This funziona esattamente come ha fatto per genserver s la differenza che accetta un parametro di stato in più quando viene chiamato come codechange OldVersion, NomeStato, dati, Extra e restituisce una tupla delle ricetta del colore deve, ancora una volta, agire un po ' come quello che abbiamo per i server generici terminare 3 dovrebbe fare l'opposto di tempo init 1.It s di mettere tutto questo in pratica molti tutorial Erlang su stati finiti macchine utilizzano esempi contenenti interruttori telefoniche e cose simili e 's la mia ipotesi che la maggior parte dei programmatori raramente hanno a che fare con gli interruttori di telefono per macchine a stati a causa di questo, noi stiamo andando a guardare un esempio che è più adatta per molti sviluppatori abbiamo ll progettare e implementare un sistema oggetto di scambio per un po 'di fantasia e non-esistente Game. The il video disegno che ho scelto è un po 'impegnativo Invece di utilizzare un broker attraverso il quale gli elementi giocatori di percorso e conferme che, francamente, sarebbe più facile, si sta andando ad implementare un server in cui entrambi i giocatori parlano tra loro direttamente, che avrebbe il vantaggio di essere distribuibile. perché l'implementazione è difficile, trascorrerò un bel po 'lo descrive, il tipo di problemi da affrontare e le modalità per risolvere them. First di tutto, dobbiamo definire le azioni che possono essere fatte dai nostri giocatori quando le negoziazioni la prima sta chiedendo per un commercio da istituire l'altro utente deve anche essere in grado di accettare che il commercio abbiamo vinto t dare loro il diritto di negare un mestiere, però, perché vogliamo mantenere le cose semplici sarà facile aggiungere questa funzionalità una volta il tutto è done. Once il commercio è impostato, i nostri utenti dovrebbero essere in grado di negoziare con l'altro Ciò significa che dovrebbero essere in grado di fare offerte e poi ritrarre se vogliono Quando entrambi i giocatori sono soddisfatti con l'offerta, possono ogni dichiarano se stessi come pronto a finalizzare il commercio i dati devono poi essere salvate da qualche parte su entrambi i lati in qualsiasi punto nel tempo, dovrebbe anche dare un senso per uno dei giocatori di annullare l'intero commercio Alcuni pleb potrebbe essere offerto solo gli elementi ritenuti indegni di l'altra parte che potrebbe essere molto occupato e quindi dovrebbe essere possibile rovescio loro con un meritato cancellation. In breve, le seguenti azioni dovrebbe essere possible. ask per un trade. accept un trade. offer items. retract un'offerta. dichiarare sé come ready. brutally annullare il trade. Now, con l'assunzione di ognuna di queste azioni, l'altro giocatore s FSM dovrebbe essere a conoscenza di esso Ciò ha senso, perché quando Jim racconta la sua FSM per inviare un elemento a Carl, Carl s FSM deve essere fatta a conoscenza di esso Questo significa che entrambi i giocatori possono parlare al proprio FSM, che parlare con l'altra s FSM Questo ci dà qualcosa di un po 'come this. The prima cosa da notare quando abbiamo due processi identici che comunicano gli uni con gli altra è che dobbiamo evitare chiamate sincrone più possibile la ragione di questo è che se Jim s FSM invia un messaggio a Carl s FSM e quindi attende risposta mentre allo stesso tempo Carl s FSM invia un messaggio verso Jim s FSM e attende la sua risposta specifica, sia finiscono per aspettare che l'altro senza mai rispondere questo blocca efficacemente sia FSM abbiamo una soluzione deadlock. One a questo è di aspettare per un timeout e poi andare avanti, ma poi non ci sarà messaggi avanzi in entrambi i processi cassette postali e il protocollo saranno incasinato Questo certamente è un vaso di Pandora, e così vogliamo evitare it. The modo più semplice per farlo è quello di evitare tutti i messaggi sincroni e asincroni andare completamente noti che Jim potrebbe ancora effettuare una chiamata sincrona alla sua FSM ci s alcun rischio qui perché il FSM ha vinto t bisogno di chiamare Jim e quindi non deadlock può verificarsi tra them. When due di queste FSM comunicare tra loro, l'intero scambio potrebbe apparire un po 'come this. Both FSM sono in uno stato di inattività Quando si chiede a Jim di commercio, Jim deve accettare prima che le cose si muovono in poi entrambi si può offrire oggetti o revocarli Quando si sia te stesso che dichiara pronto, il commercio può avvenire Questa è una versione semplificata di tutto ciò che può accadere e ci vedremo tutti i casi possibili con maggiore dettaglio nel prossimo paragraphs. Here viene la parte difficile definire il diagramma di stato e come le transizioni di stato accadere di solito un bel po 'di pensiero va in questo, perché si deve pensare a tutto le piccole cose che potrebbero andare male Alcune cose potrebbero andare male, anche dopo aver rivisto molte volte a causa di questo, i ll semplicemente messo quello che ho deciso di implementare qui e poi spiegare it. At prima, entrambe le macchine a stati finiti inizio nel stato di inattività a questo punto, una cosa che possiamo fare è chiedere qualche altro giocatore di negoziare con con noi entrare in modalità idlewait al fine di attendere una risposta dopo il nostro eventuale FSM ha trasmesso la richiesta una volta che l'altro FSM invia la risposta, la nostra può passare alla negotiate. The altro giocatore dovrebbe essere a negoziare stato dopo questo Ovviamente, se siamo in grado di invitare l'altra, l'altro ci può invitare Se tutto va bene, questo dovrebbe finire per assomigliare this. So questo è praticamente l'opposto come le due precedenti diagrammi di stato in bundle in una nota che ci aspettiamo che il giocatore ad accettare l'offerta, in questo caso cosa succede se per pura fortuna, chiediamo l'altro giocatore di commerciare con noi allo stesso tempo ci chiede di trade. What succede qui è che entrambi i clienti chiedono loro FSM di negoziare con l'altra appena i messaggi chiedere negoziare vengono inviati, entrambi FSM passare a idlewait stato allora essi saranno in grado di elaborare la domanda di negoziazione Se passiamo in rassegna i precedenti diagrammi di stato, si vede che questa combinazione di eventi è l'unica volta che abbiamo riceverai chiedere negoziare i messaggi, mentre nello stato idlewait di conseguenza, sappiamo che a ricevere questi messaggi in idlewait significa che abbiamo raggiunto la condizione di competizione e può assumere entrambi gli utenti vogliono parlare con l'altro possiamo spostare entrambi di negoziare stato Hooray. So ora noi stiamo negoziando Secondo l'elenco delle azioni che ho elencato in precedenza, dobbiamo sostenere gli utenti offrono oggetti e poi ritrarre il offer. All che fa è in avanti un messaggio il nostro cliente s per l'altro FSM entrambi macchine a stati finiti dovranno contenere un elenco di articoli offerti da entrambi i giocatori, in modo che possano aggiornare quella lista quando si ricevono tali messaggi Abbiamo soggiorno nello stato negoziare dopo questo forse l'altro giocatore vuole offrire elementi too. Here, il nostro FSM in fondo agisce in modo simile Questo è normale una volta che ci si stanca di offrire le cose e pensiamo di ri abbastanza generosi, dobbiamo dire che è pronti ad ufficializzare il commercio Perché dobbiamo sincronizzare entrambi i giocatori, abbiamo ll deve usare uno stato intermedio, come abbiamo fatto per minimo e idlewait. What che facciamo qui è che, non appena il nostro giocatore è pronto, il nostro FSM chiede Jim s FSM se lui s pronto attesa della sua risposta, il nostro FSM cade nel suo stato di attesa La risposta ci arriveremo sarà dipendere da Jim s stato FSM se s in stato di attesa, è ll ci dicono che s pronta in caso contrario, ci dirò che non s ancora pronto That s esattamente ciò che il nostro FSM risponde automaticamente a Jim se ci chiede se siamo pronto quando a negoziare state. Our macchina a stati finiti rimarrà in modalità negoziare fino a quando il nostro lettore dice lui s pronto Sia s supporre che ha fatto e abbiamo ri ora in stato di attesa, tuttavia, Jim s non c'è ancora Ciò significa che quando noi abbiamo dichiarato come pronti, abbiamo ll chiesto a Jim se era anche pronto e la sua FSM avremo risposto non non yet. He s pronta, ma siamo possiamo t fare molto, ma continuare ad aspettare attesa dopo Jim, che s ancora negoziando tra l'altro, è possibile che egli cercherà di inviare più elementi o forse annullare la sua precedente corso offers. Of, vogliamo evitare Jim rimozione di tutti i suoi elementi e quindi facendo clic I m pronto, noi avvitamento sopra nel processo appena cambia gli articoli offerti, andiamo di nuovo nello stato di negoziare in modo che possiamo o modificare la nostra offerta, o esaminare quello attuale e decidere abbiamo ri Sciacquare pronti e repeat. At un certo punto, Jim sarà pronto a finalizzare il commercio troppo Quando questo accade , la sua macchina a stati finiti chiederà nostra se siamo ready. What nostro FSM fa è la risposta che siamo davvero pronti restiamo in stato di attesa e si rifiutano di passare allo stato pronto anche se Perché questo potenziale condizione di gara perché ci sa Imagine che la seguente sequenza di eventi si svolge, senza fare questo step. This necessarie è un po 'complessa, così ho ll spiegare causa del modo in cui i messaggi vengono ricevuti, potremmo forse solo elaborare l'offerta voce dopo abbiamo dichiarato noi stessi pronti e anche dopo Jim dichiarò se stesso come pronto Questo significa che, non appena si legge il messaggio offerta, si passa di nuovo per negoziare stato Durante questo periodo, Jim avrà ci ha detto che è pronto Se dovesse cambiare stati proprio lì e passare a pronti, come illustrato sopra , ha d essere catturati in attesa a tempo indeterminato, mentre noi wouldn t so cosa diavolo fare questo potrebbe anche accadere il contrario modo Ugh. One per risolvere questo problema è con l'aggiunta di uno strato di indirezione grazie a David Wheeler questo è il motivo per cui restiamo in attesa modalità e inviare pronto come indicato nel nostro precedente diagramma di stato Qui s come ci occupiamo di quel messaggio pronto, assumendo eravamo già in stato di pronto perché abbiamo detto la nostra FSM eravamo pronti beforehand. When che riceviamo pronti dall'altro FSM, inviamo pronto di nuovo questo è quello di fare in modo che abbiamo vinto t hanno la condizione della doppia gara di cui sopra questo creerà un messaggio pronto superflua in una delle due FSM, ma abbiamo ll semplicemente di ignorarlo in questo caso abbiamo quindi inviare un messaggio di ack e il Jim s FSM farà lo stesso prima di trasferirsi in stato di pronto il motivo per cui esiste questo messaggio ack è dovuto ad alcuni dettagli di implementazione sulla sincronizzazione dei clienti io ho metterlo nello schema per il gusto di essere corretto, ma ho vinto t spiegarlo solo più tardi Dimenticate per ora siamo finalmente riusciti a sincronizzare entrambi i giocatori Whew. So ora c'è s stato pronto Questo è un po 'speciale entrambi i giocatori sono pronti e hanno sostanzialmente dato le macchine a stati finiti tutto il controllo di cui hanno bisogno Questo ci permette di implementare una versione imbastardita di un commit a due fasi per assicurarsi che le cose vanno bene quando si effettua la versione commerciale official. Our come descritto sopra sarà piuttosto semplicistico Scrivi veramente corretta commit a due fasi richiederebbe molto più codice di quello che è necessario per a comprendere a stati finiti machines. Finally, abbiamo solo per consentire il commercio di essere cancellato in qualsiasi momento Questo significa che in qualche modo, non importa in quale stato abbiamo ri in, abbiamo ri andando ad ascoltare il messaggio annullare da entrambi i lati e uscire la transazione dovrebbe anche essere comune cortesia di lasciare che l'altro lato sappiamo che ri andato prima leaving. Alright si sa sacco di informazioni da assorbire in una sola volta Don t preoccupare se ci vuole un po 'per cogliere appieno lo C'è voluto un gruppo di persone a guardare oltre il mio protocollo per vedere se era giusto, e anche allora abbiamo tutti perso un paio di condizioni di gara che ho poi preso un paio di giorni dopo, al momento di rivedere il codice durante la scrittura di questo testo e 's normale aver bisogno di leggerlo più di una volta, soprattutto se non siete abituati a protocolli asincroni Se questo è il caso, sono pienamente vi incoraggio a cercare di progettare il proprio protocollo Poi chiedetevi che cosa accade se due persone lo fanno le stesse azioni molto veloci e se incatenano altri due eventi in fretta che cosa io che fare con i messaggi I don t gestire quando si cambiano gli stati si vedrà che la complessità cresce in fretta si potrebbe trovare una soluzione simile al mio, forse uno migliore fatemi sapere se questo è il caso Non importa il risultato, si Sa cosa molto interessante su cui lavorare e la nostra FSM sono ancora relativamente simple. Once si ve digerito tutto questo o prima, se sei un lettore di ribelli, si può andare alla sezione successiva, in cui implementiamo il sistema di gioco per il momento si può prendere un buon caffè rompersi se avete voglia di fare so. The prima cosa che deve essere fatto per implementare il nostro protocollo con OTP s genfsm è quello di creare l'interfaccia ci saranno 3 i chiamanti per il nostro modulo il giocatore, il comportamento genfsm e l'altro giocatore s FSM Noi sarà solo bisogno di esportare le funzioni funzione di lettore e genfsm, anche se questo è perché l'altro FSM sarà anche eseguito all'interno del modulo tradefsm e può accedere dal inside. So che s la nostra API potete vedere i m intenzione di avere alcune funzioni che sono sia sincrona e asincrona Questo è soprattutto perché vogliamo che il nostro cliente di chiamare in modo sincrono, in alcuni casi, ma l'altro FSM può farlo in modo asincrono Avere la sincrono cliente semplifica la nostra logica un bel po ', limitando il numero di messaggi contraddittorie che possono essere inviati uno dopo l'altra Noi ll arrivare sia s primo implementare l'API pubblico reale in base al protocollo definito above. This è piuttosto standard di tutte queste funzioni genfsm sono state coperte prima di iniziare ad eccezione di 3-4 e 3-4 StartLink che credo si può capire in questo chapter. Next abbiamo ll implementare il FSM di funzioni FSM I primi hanno a che fare con configurazioni commerciali, quando ci siamo vogliamo chiedere l'altro utente a unirsi a noi in una prima funzione trade. The chiede all'altro pid, se vogliono al commercio, e il secondo è usato per rispondere ad essa in modo asincrono, di course. We può quindi scrivere le funzioni da offrire e annullare le offerte secondo il nostro protocollo di cui sopra, questo è quello che dovrebbe essere like. So, ora che ci ho ottenuto queste chiamate fatte, dobbiamo concentrarci sul resto le restanti chiamate si riferiscono a essere pronti o meno e la manipolazione finale commettere Anche in questo caso, dato il nostro protocollo di cui sopra, abbiamo tre chiamate areyouready che può avere le risposte notyet o ready. The solo funzioni sinistra sono quelli che sono per essere utilizzato da entrambi i FSM quando si fa il commit nello stato pronto loro utilizzo preciso è esposta più in dettaglio più avanti, ma per ora, i nomi e il diagramma di stato di sequenza da prima dovrebbe essere sufficiente, tuttavia, è ancora possibile trascriverli per la propria versione di tradefsm. Oh e c'è anche la funzione di cortesia che ci permette di avvertire gli altri FSM abbiamo cancellato il trade. We può ora passare alla parte davvero interessante la genfsm callback il primo richiamo è init 1 Nel nostro caso , ci vorrà ogni FSM di tenere un nome per l'utente che rappresenta in questo modo, la nostra produzione sarà più bello nei dati si continua a trasmettere a se stesso che altro vogliamo tenere in memoria nel nostro caso, vogliamo che l'altro s pid, gli oggetti in vendita e le voci delle altre offerte che ri anche intenzione di aggiungere il riferimento di un monitor in modo che conosciamo per interrompere se l'altro muore e un campo da, usato per fare ritardare replies. In caso di init 1 si ll preoccupano solo il nostro nome per ora noti che abbiamo ll iniziamo nei inattività state. The prossimi callback da considerare sarebbero stati stessi Finora io ho descritto le transizioni di stato e le chiamate che possono essere fatte, ma abbiamo ll bisogno di un modo per assicurarsi che tutto va bene noi ll scrivere alcune funzioni di utilità first. And possiamo iniziare con lo stato inattivo per il bene della convenzione, I ll coprire la versione asincrona prima Questo shouldn t bisogno di prendersi cura di nulla, ma l'altro giocatore chiede un commercio dato il nostro giocatore, se si guardano le funzioni API, utilizzerà un monitor call. A sincrono è impostato per permetterci di gestire l'altro morire, e la sua ref viene memorizzato nei dati del FSM s insieme con l'altro s pid, prima di passare allo stato idlewait noti che ci riporterà tutti gli eventi imprevisti e ignorarli rimanendo nello stato eravamo già in possiamo avere un paio di messaggi banda qua e là, che potrebbe essere il risultato di condizioni di gara e 's di solito sicuro di ignorarli, ma siamo in grado di t ottenere facilmente liberarsi di loro si è proprio meglio non in crash l'intero FSM su questi sconosciuti, ma in qualche modo previsto messages. When nostro cliente chiede il FSM di contattare un altro giocatore per un commercio, esso invierà un evento sincrono il folle 3 callback sarà needed. We procedere in modo simile alla versione asincrona, tranne che abbiamo bisogno di chiedere in realtà dall'altra parte se vogliono negoziare con noi o non si noterà che non rispondiamo al cliente eppure questo è perché non abbiamo niente di interessante da dire, e vogliamo che il cliente bloccato e in attesa per il commercio per essere accettato prima di fare qualsiasi cosa la risposta saranno inviati solo se l'altra parte accetta una volta abbiamo ri in idlewait. When noi re lì, abbiamo a che fare con l'altro accettando di negoziare e l'altro chiedendo di negoziare il risultato di una condizione di competizione, come descritto nella protocol. This ci dà due transizioni allo stato negoziare, ma ricordate che dobbiamo utilizzare genfsm rispondere 2 risposta al nostro cliente per dire che s bene per iniziare ad offrire elementi ci s anche il caso del cliente il nostro FSM s accettando il commercio suggerita dagli altri party. Again, questo passa allo stato di negoziare Qui, dobbiamo gestire asincrono query per aggiungere e rimuovere elementi provenienti sia da parte del cliente e l'altro FSM Tuttavia, non abbiamo ancora deciso come memorizzare elementi perché io m un po 'pigro e presumo utenti vinto t commercio che molti elementi, gli elenchi semplici faranno per ora Tuttavia , potremmo cambiare la nostra mente in un momento successivo, in modo che sarebbe una buona idea di avvolgere le operazioni voce nelle proprie funzioni Aggiungere le seguenti funzioni nella parte inferiore del file con un preavviso di 3 e 2.Simple inaspettato, ma hanno il ruolo di isolare le azioni aggiungere e rimuovere elementi dalla loro implementazione utilizzando gli elenchi si potrebbe facilmente passare a proplists, array o qualunque struttura di dati senza interrompere il resto del code. Using entrambe queste funzioni, siamo in grado di implementare l'offerta e la rimozione è un items. This brutto aspetto dell'uso di messaggi asincroni su entrambi i lati una serie di messaggio ha la forma marca e ritrarre, mentre l'altro ha fare e disfare Ciò è del tutto arbitraria e solo utilizzato per distinguere tra comunicazioni player-to-FSM e FSM-to-FSM comunicazioni si noti che su quelli provenienti dalla nostra giocatore, dobbiamo dire dall'altra parte i cambiamenti abbiamo ri responsabilità making. Another è quello di gestire il messaggio areyouready di cui abbiamo parlato nel protocollo Questo è l'ultimo evento asincrono per gestire in stato di negoziare. Come descritti nel protocollo, ogni volta che non abbiamo ri nello stato di attesa e ricevere questo messaggio, dobbiamo rispondere con notyet erano anche trasmesso il segnale ai dettagli commerciali per l'utente in modo da una decisione può essere made. When tale decisione è presa e l'utente è pronto, l'evento pronto verrà inviato questo dovrebbe essere sincrona perché don t vuole l'utente a mantenere la modifica la sua offerta con l'aggiunta di elementi con la pretesa lui s ready. At questo punto una transizione verso lo stato di attesa dovrebbe essere fatto notare che solo in attesa per l'altro non è interessante salviamo il da variabile in modo da poter usare con genfsm risposta 2 quando abbiamo qualcosa da dire al client. The stato di attesa è un divertente bestia Nuovi elementi potrebbero essere offerti e retratti perché l'altro utente non potrebbe essere pronti ha senso, quindi, di rollback automaticamente allo stato negoziato sarebbe aspirare ad avere grandi articoli offerti da noi, solo per l'altra per eliminarli e dichiararsi pronto, rubando il nostro bottino Tornando alla negoziazione è una buona decisione. Ora che s qualcosa di significativo e abbiamo rispondere al giocatore con le coordinate che abbiamo memorizzato nella prossima serie di messaggi che abbiamo bisogno di preoccuparsi sono quelli relativi alla con la sincronizzazione sia FSM in modo che possano passare allo stato pronto e confermare il commercio per questo dovremmo davvero concentrarsi sul protocollo definito earlier. The tre messaggi potremmo avere sono areyouready perché l'altro utente solo si è dichiarato pronto, notyet perché abbiamo chiesto l'altro se era pronto e lui non era pronto e perché abbiamo chiesto l'altro se lui era pronto e lui was. We Inizieremo con areyouready ricordare che nel protocollo abbiamo detto che ci potrebbe essere una condizione di competizione nascosto lì l'unica cosa che possiamo fare è inviare il messaggio pronto con amready 1 e trattare con il resto later. We ll essere bloccato in attesa di nuovo, quindi non s vale la pena di rispondere al nostro cliente ma allo stesso modo, abbiamo vinto t risposta al cliente quando l'altro lato invia una notyet al nostro invitation. On D'altra parte, se l'altro è pronto, ci invia un extra messaggio di pronta per l'altro FSM, rispondere al nostro utente e quindi passare al pronto state. You potrebbe aver notato che io ho acktrans usati 1 In realtà, entrambi i FSM dovrebbe usarlo Perché questa per capire questo dobbiamo iniziare a guardare ciò che accade nel pronto state. When nello stato pronto, entrambe le azioni dei giocatori diventano inutili tranne l'annullamento abbiamo vinto t preoccuparsi nuovo elemento offre Questo ci dà una certa libertà in sostanza, sia FSM può liberamente parlare tra loro senza preoccuparsi del resto il mondo questo ci permette di implementare il nostro imbastardimento di un commit a due fasi per iniziare questa commettere senza uno dei due giocatori recitazione, abbiamo ll bisogno di un evento per attivare un'azione dal FSM l'evento ACK da acktrans 1 è utilizzato per che, non appena abbiamo ri nello stato di pronto, il messaggio viene trattata e messa in pratica la transazione può begin. Two fase commit richiedono comunicazioni sincrone, anche se questo significa che possiamo t avere entrambi FSM di avviare la transazione immediatamente, perché ll finiscono in fase di stallo il segreto è quello di trovare un modo per decidere che una macchina a stati finiti dovrebbe avviare il commit, mentre l'altro sarà sedersi e aspettare ordini dal primo one. It scopre che gli ingegneri e gli scienziati informatici che hanno progettato Erlang erano abbastanza intelligenti bene, sapevamo che già i PID di qualsiasi processo possono essere confrontati tra loro e risolto questo può essere fatto non importa quando il processo è stato generato, sia che si tratti ancora vivo o no, o se viene da un altro VM ci vedremo più su questo quando arriviamo in Erlang. Knowing distribuita che due PID possono essere confrontati e uno sarà maggiore rispetto agli altri, possiamo scrivere una funzione prioritaria 2, che avrà due pid e dire un processo che si tratti s stato eletto o not. and chiamando tale funzione, abbiamo può avere un processo che parte il commit e l'altro in seguito alla orders. Here s che cosa questo ci dà quando incluso nello stato pronto, dopo aver ricevuto la grande espressione try cattura message. This ACK è il principale FSM decidere come il commettere opere Entrambi askcommit 1 e doCommit 1 sono sincrono In questo modo il leader FSM li chiamano liberamente si può vedere che l'altro FSM va solo e aspettare sarà quindi riceverà gli ordini dal processo che ha portato il primo messaggio dovrebbe essere askcommit Questo è solo per assicurarsi che entrambe le FSM sono ancora non c'è niente di sbagliato è successo, si ri entrambi dedicati a completare il task. Once questo viene ricevuto, il processo che porta chiederà di confermare l'operazione con doCommit che s quando dobbiamo impegnare la nostra data. And una volta che s fatto, lasciamo il leader FSM riceverà ok come risposta e saprà impegnarsi sulla propria fine in seguito Questo spiega il motivo per cui abbiamo bisogno della grande cattura tentativo se la FSM rispondendo muore o il suo giocatore annulla l'operazione, le chiamate sincrone saranno in crash dopo un timeout il commit deve essere interrotta in questo case. Just in modo da sapere, ho definito la funzione di impegnarsi come follows. Pretty deludente, eh non s generalmente possibile fare un vero e proprio sicura impegnarsi con solo due partecipanti un terzo è di solito necessario per giudicare se entrambi i giocatori hanno fatto tutto giusto Se si dovesse scrivere un vera funzione commit, si deve contattare tale terzo a nome di entrambi i giocatori, e poi fare la scrittura di sicurezza a un database per loro o rollback l'intero scambio abbiamo vinto t andare in questi dettagli e la corrente impegniamo 1 la funzione sarà sufficiente per le esigenze di questo book. We non è ancora finito non abbiamo ancora coperto due tipi di eventi un giocatore annullando il commercio e l'altro giocatore s macchina a stati finiti schiantarsi il primo può essere affrontato utilizzando il handleEvent callback 3 e 4 handlesyncevent Ogni volta che l'altro utente annulla, si riceverai una e notification. When asincrona lo facciamo non dobbiamo dimenticare di raccontare l'altra prima di uscire ourselves. And voil l'ultimo evento di prendersi cura di è quando l'altro FSM va giù Fortunatamente , abbiamo impostato un monitor torna in stato di riposo possiamo abbinare su questo e reagire accordingly. Note che anche se il annullare o eventi GIÙ accadono mentre si ri nel commettere, tutto dovrebbe essere al sicuro e nessuno dovrebbe ottenere i suoi articoli stolen. Note abbiamo usato io formato 2 per la maggior parte dei nostri messaggi per lasciare le FSM comunicare con i propri clienti in una vera e propria applicazione mondo, potremmo desiderare qualcosa di più flessibile di quello un modo per farlo è quello di lasciare che il cliente invia in una Pid, ​​che sarà receive the notices sent to it That process could be linked to a GUI or any other system to make the player aware of the events The io format 2 solution was chosen for its simplicity we want to focus on the FSM and the asynchronous protocols, not the rest. Only two callbacks left to cover They re codechange 4 and terminate 3 For now, we don t have anything to do with codechange 4 and only export it so the next version of the FSM can call it when it ll be reloaded Our terminate function is also really short because we didn t handle real resources in this example. We can now try it Well, trying it is a bit annoying because we need two processes to communicate to each other To solve this, I ve written the tests in the file which can run 3 different scenarios The first one is mainab 0 It will run a standard trade and output everything The second one is maincd 0 and will cancel the transaction halfway through The last one is mainef 0 and is very similar to mainab 0 except it contains a different race condition The first and third tests should succeed, while the second one should fail with a crapload of error messages, but that s how it goes You can try it if you feel like it. If you ve found this chapter a bit harder than the others, I must remind you that it s entirely normal I ve just gone crazy and decided to make something hard out of the generic finite-state machine behaviour If you feel confused, ask yourself these questions Can you understand how different events are handled depending on the state your process is in Do you understand how you can transition from one state to the other Do you know when to use sendevent 2 and syncsendevent 2-3 as opposed to sendallstateevent 2 and syncsendallstateevent 3 If you answered yes to these questions, you understand what genfsm is about. The rest of it with the asynchronous protocols, delaying replies and carrying the From variable, giving a priority to processes for synchronous calls, bastardized two-phase commits and whatnot are not essential to understand They re mostly there to show what can be done and to highlight the difficulty of writing truly concurrent software, even in a language like Erlang Erlang doesn t excuse you from planning or thinking, and Erlang won t solve your problems for you It ll only give you tools. That being said, if you understood everything about these points, you can be proud of yourself especially if you had never written concurrent software before You are now starting to really think concurrently. In a real game, there is a lot more stuff going on that could make trading even more complex Items could be worn by the characters and damaged by enemies while they re being traded Maybe items could be moved in and out of the inventory while being exchanged Are the players on the same server If not, how do you synchronise commits to different databases. Our trade system is sane when detached from the reality of any game Before trying to fit it in a game if you dare , make sure everything goes right Test it, test it, and test it again You ll likely find that testing concurrent and parallel code is a complete pain You ll lose hair, friends and a piece of your sanity Even after this, you ll have to know your system is always as strong as its weakest link and thus potentially very fragile nonetheless. Don t Drink Too Much Kool-Aid While the model for this trade system seems sound, subtle concurrency bugs and race conditions can often rear their ugly heads a long time after they were written, and even if they ve been running for years While my code is generally bullet proof yeah , right , you sometimes have to face swords and knives Beware the dormant bugs. Fortunately, we can put all of this madness behind us We ll next see how OTP allows you to handle various events, such as alarms and logs, with the help of the genevent behaviour. Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution Non-Commercial No Derivative License. Porting the AlgoTrader Java code to Erlang to build a high-flexible framework to be used in the following scenarios. Backtest portfolio simulation. Portfolio risk monitoring. Algorithmic trading. Multi-user trading platform server-side. System Integration. This very nice and well-written project ported to Erlang will be a beautiful case on how you can modulate and scalate to multiple nodes, sharing responsability between processors, in a clean and elegant architecture. You can easily configure nodes to run in separate machines, so the Technical Analysis calculations could be done in other machines, and strategies only subscribes to receive signals. For the first phase of the erlang - trader, the focus is and can t be other to train ourselves on how does a flexible financial message based framework should be , but once we have it running, and more important, people feel that is fun to write strategies on it, we should go deep on the optimization level. The Services I suggest from this begining Every service should be an OTP application. Fix 4 4 Market Data Reader we can do 1 process per instrument. OMS The main order management system, spawn 1 process for every strategy. Strategy Manager Server Every Strategy starts it s own instrument server. Instrument Signal Server Read the market data from the Fix Adapter and broadcast for subscribed strategies. Portfolio Server Holds Real Time Positions. Sync Server Syncronize porfolio positions with the Broker Positions can be configured to do it every x minutes. Technical Analysis Signals 1 process for every instrument, send signals to the Trade Decision Server. Trade Decision Server receives signals from TA, events, economic reports, etc and send buy sell orders to the OMS. Fix 4 4 Order Server - Translates buy sell signals from the OMS to Fix protocol can be done in FPGA too. R and Matlab plug-in. Let s use the rebar tool to compile and leave this cool things listed below to be done after we have a small working prototype Optimization should be afterwards, let s make it run to see how beautiful an erlang algorithm can trade, and after how fast yeah yeah tons of processes. Since we are using a main file, it s worth to know how it manages dependencies. At Ita Asset Management, we go even further with the FIX Protocol We treat it as an important tool for integration between our internal systems Everyone remembers the traditional conflict between STP and modularity The FIX Protocol standardised and smoothed the path to modularity There is no need for creating and managing interfaces, APIs or even Enterprise Service Buses It is just necessary to include a FIX engine in your application and specify the communication details to every other application via an XML configuration file By Christian J Zimmer and Hellinton Hatsuo Takada, Ita Asset Management.

No comments:

Post a Comment