Press "Enter" to skip to content

GOTO 2016 • Building Low Latency Microservices & Monoliths in Java • Peter Lawrey


Buon pomeriggio, mi chiamo Peter Lorre
e sarò parlando di micro-servizi
ma all’interno di un contesto di applicazioni
progettati per alte prestazioni I
Sono uno sviluppatore Java me stesso e lo faccio
consulenza e ho lavorato con hedge
fondi e banche di investimento per circa
otto anni nello spazio a bassa latenza e
circa ventitré anni di lavoro in IT I
Sono abbastanza attivo su Stack Overflow e in
Infatti qualcuno ieri sera ha commentato che io
sembra che sia disposto a rispondere praticamente
qualsiasi domanda sebbene ci fosse un
domanda stamattina che non ho fatto
rispondi perché ha detto come faccio a moltiplicare
stringhe in Java e anche io sono stato perplesso
abbiamo una piccola azienda di software che abbiamo
tre sviluppatori a tempo pieno oltre
me stesso e di solito impegniamo un nuovo
cliente iniziando con una settimana
laboratorio in cui sviluppiamo un nuovo sistema
cercando di incorporare le migliori pratiche –
entro i limiti del tipo di
decisioni tecnologiche della tua azienda
già fatto anche muovendo il mio primo
il computer era una cosa chiamata NEC PC
uno e infatti è andato a cinque veri
megahertz rispetto al PC IBM che
correva solo a quattro virgola sette sette
megahertz e aveva 128 kilobyte di
RAM e io l’ho usato per molti anni come
adolescente prima usando il codice macchina per
due anni è stata la mia prima lingua
che se hai letto qualcuno del mio codice java
questo probabilmente ha senso per te e
in seguito usa il turbo pascal e in tutto questo
tempo non ho mai trovato un buon uso per tutti
128 kilobyte di RAM
da dove provengono le micro superfici
ci sono molti principi di micro
i servizi sono in giro da qualche tempo
alcuni di loro sono più nuovi ma in gran parte
è un termine collettivo per alcuni dei migliori
pratiche ora qualcuno mi ha parlato
ieri che loro che avevano sentito
che i micro servizi vengono effettivamente
nell’area della finanza ma dal
la ricerca che ho fatto è stata effettivamente breve
i micro servizi Web originariamente erano i
termine originale quindi penso in generale più
persone quando parlano di micro
servizio che pensano di servizi web e
quindi tendono a pensare al genere
di vincoli e tecnologie che il web
i servizi in genere usano tuttavia molto
questi principi non sono specifici per nessuno
data tecnologia e tu no
necessariamente limitato a quelli
tecnologie e può ancora essere utile
ora il motivo per cui i servizi Web il fatto
che proviene dal servizio web o un sacco
di persone pensano che i servizi Web siano
importante è che quando si tratta di una GUI
applicazione c’è un inerente
soglia di un requisito di prestazione
che è la velocità con cui un umano può vedere un?
aggiornamento perché qualsiasi aggiornamento è quale è
troppo veloce perché l’umano non lo veda
importa davvero quanto sia veloce e in effetti
la maggior parte dei film infatti è uno dei primi grandi
film per passare da 24 fotogrammi al secondo
a 48 frame al secondo era in realtà Lord
degli Anelli quindi è relativamente recente
che hanno persino cambiato film importanti da
24 a 48 ma sarete d’accordo che la maggior parte
film che hanno una frequenza di 24 fotogrammi
che hai visto che non vedi il
fattori di sfarfallio effettivamente citati in
il Guinness dei primati che lì
le persone possono vedere lo sfarfallio perché
possono vedere cambiamenti così veloci e loro
trovare film che guardano fastidiosi ma di 24
i frame al secondo sono in realtà 40
millisecondi quindi tutto ciò che è sotto i 40
millisecondi
probabilmente non importa perché un umano
non posso dire la differenza comunque
questo è come una soglia e da allora
in fondo non ci preoccupiamo dei ritardi
che si accumulano a meno di 40
millisecondi un’altra cosa sul web
le applicazioni sono come i computer
sempre più potente c’è a
tendenza a renderli le pagine web
più ricco e più ricco e più dettagliato
più dati più informazioni quindi tendono
semplicemente crescere per adattarsi al supplementare
potenza di elaborazione delle vostre macchine
e in effetti almeno secondo uno
sito web è la dimensione media di una pagina web
ora la dimensione del destino dell’intera gang
doom originariamente spedito come 2.3 megabyte
di nuovo quello era il tutto e in
infatti la pagina web media è intorno a quello
anche le dimensioni così ogni volta che sei
stai guardando una pagina web completamente nuova
in realtà il download dell’intero doom
o qualcosa di quelle dimensioni ora che ho
parlato di micro-servizi in un numero
di banche e otteniamo lo stesso tipo di
la reazione è fondamentalmente la prima reazione
bene microservizi è una parola di moda e a
questa banca non facciamo parole d’ordine che è
abbastanza giusto ci sono buone buone ragioni
non per il motivo che lo trovo un po ‘
strano è perché ciò che accade è così
entrano in esso un po ‘più in dettaglio
in realtà iniziano a realizzare l’attesa a
tutto questo suona molto familiare a noi
fai molte di queste cose già così
se ne sono andati , non lo faremo mai
in realtà lo facciamo già molto
e poi in effetti scoprono che lo sono
effettivamente facendo la maggior parte di queste tecniche
già e molto di quello che io
in realtà lo fanno con i clienti è in realtà
rebranding quello che fanno già così
prendendo alcune delle tecniche che loro
li ho appena rimessi in discussione e così è
in una certa misura un termine di marketing e uno
la cosa del marketing è che è molto
flessibile si può effettivamente riorganizzare cosa
hai e dargli un nuovo nome, ma cosa
il vantaggio di fare questo non lo è
i cambiamenti completamente vuoti sono questo
può aiutare a contrapporre
cosa puoi cambiare facilmente
migliorare bene, quindi dove sono i rapidi
vince e infine può aiutarti a darti un
direzione su dove si desidera
essere a medio termine con un minimo di
il rischio è qualcosa che è in realtà
realizzabile quindi questo è un grafico che ho fatto
recentemente con un cliente inizialmente
stavano pensando bene che il micro servizio non lo è
davvero per noi ma c’è un sacco di Drive
per spingerci in quella direzione o abbiamo bisogno
per trovare una risposta per il motivo per cui siamo
non facendo micro servizi e poi io
iniziato a parlare con loro o cosa sei
facendo e infatti in realtà molto in a
molte aree che stavano già facendo
queste cose sono così buone da essere in grado di farlo
reali stessi come micro servizi
non significava che dovevano cambiare
tutto quello che stavano facendo e in effetti
questo non è realistico, comunque
non dovrebbe tentare di cambiare
tutto o fare e così siamo appena arrivati
con un semplice numero di stelle e abbiamo anche
quindi identificato dove pensavamo il
vittorie veloci erano quindi questa era l’ iniziale
progetto in realtà gli ultimi tre erano i
quelli che hanno deciso che avrebbero fatto
sottolineare a breve termine che è
messaggistica trasparente che si sta facendo
cambiare la struttura in modo che le squadre possano
lavorare in modo più indipendente e lamda
architettura quindi quali sono i vantaggi di
introducendo tecniche da micro
servizi in sistemi di trading bene uno
altra cosa uno dei driver chiave per
i sistemi di formazione è quel time to market
è molto importante il costo della perdita
l’opportunità è in realtà può essere molto alta
quindi qualsiasi tecnica che ti permetta di ottenere
le tue soluzioni più velocemente non solo
risparmiare denaro ma in realtà aiutare l’azienda
fare più soldi può renderli più facili
per mantenere tutto il tempo che stai facendo
alcune scelte sensate e può anche
semplifica i tuoi modelli di programmazione
non ti può dare una struttura e
un linguaggio comune alla tecnica
che stai usando siamo microservizi
tende a lottare e in effetti questo è
qualcosa che i sistemi di trading sono stati
fare per lungo tempo è come possiamo affrontare
con la messaggistica asincrona come facciamo noi
testarli come facciamo con il profilo e il debug
loro e microservizi tendono ad essere a
molto bene basiamo su riposo che
è sincrono in genere ma è possibile
anche usare WebSockets è un po ‘come oh
e puoi farlo anche se davvero
non ci sono molte buone pratiche
intorno a messaggistica asincrona mentre
i sistemi di trading sono stati basati su
messaggistica asincrona da molto tempo
questo è generalmente come loro realmente
operare e influenzare la messaggistica sincrona
tende ad essere più l’ eccezione che è
solo usato davvero per i gooeys anche per il trading
i sistemi hanno un sacco di tecniche in giro
come si costruisce deterministico e
sistemi altamente riproducibili che puoi
prova ancora e ancora e ottieni lo stesso
risultati ogni volta ora bassa latenza è un
termine che compare abbastanza spesso ma io
pensa che valga la pena provare a metterne un po ‘
definizione intorno ad esso perché in realtà
fornisce un po ‘ di contrasto con cosa
molte persone pensano a quando pensano
servizi web e questo è quello con basso
latenza che dovrebbe essere la prima definizione
davvero essere la definizione più ampia è
che hai effettivamente una visione di come
molto il tuo tempo di risposta costa il tuo
affari ora che quello che potrebbe essere
potrebbe essere diverso ma ho sentito persone
parlando di tutto ciò abbiamo bisogno di una bassa latenza
e dicono bene quanto costerebbe
tu che differenza faresti
in realtà non hanno un’idea chiara
in realtà sono solo una specie di volontà
gli utenti si lamentano che Layton ci vede
vorrebbe che gli utenti si lamentino di meno
questa è davvero l’estensione del pensiero
mentre se puoi avere un po ‘ più chiaro
vedere che hai effettivamente qualificato
perché è davvero importante per te
avere determinate soglie sotto certi
ora hai uno SLA dietro
per i miei scopi bassa latenza in realtà
significa che ti preoccupi delle latenze che non puoi
vedere
e questo fa la differenza perché tu
è necessario disporre di un set di strumenti che possa aiutare
registri quelle latenze perché tu
non posso vedere visivamente che oh, beh, questo è
ora sta andando più veloce perché in effetti il tuo
potrebbero essere le tue agenzie inaccettabili
ancora troppo veloce per vederlo, lasciami fare
darti un esempio che abbiamo avuto di recente
una banca d’investimento che in realtà loro
in realtà ha rifiutato di accettare il nostro prodotto
ad un certo punto perché i nostri cinque-nove
il peggiore in centomila latenze
era quattrocentocinquanta microsecondi
quello era troppo alto per loro ora che è un
la latenza non si può ancora dire così è il
peggio uno centomila ma tu
non posso vederlo ora ci sono voluti alcuni giorni
di investigazione per capire di cosa si tratta
è risultato che era correlato all’analisi
data e ora con data e ora locale
dopo abbiamo cambiato il codice siamo riusciti a
aggiustarlo e noi eravamo eravamo sotto i loro
requisito che è 35 microsecondi così
questi sono i tipi di questo è un equo
esempio estremo la maggior parte dei nostri clienti
non stanno spingendo per questo tipo di numeri
ma è possibile che ti interessi davvero
Layton vede che anche in casi estremi
non sono ancora apprezzabili per un umano così
hai bisogno di avere strumenti e in effetti noi
finito per dover sviluppare uno strumento solo
per risolvere questo problema, ecco perché
ci ha portato così tanto tempo e potrebbe essere un
soggetto per un altro strumento è aperto
fonte a proposito quindi chiedimi se lo sei
interessato va bene così uno dei più semplici
modi per accelerare un sistema è di fare di meno
lavoro se togli il lavoro dal tuo sistema
quindi può funzionare più velocemente e in particolare
tornando al modello di dati privato di
un micro servizio migliorerai molto
prestazioni se il vostro processo spenderà
la maggior parte del tempo nella sua cache locale
rimanendo sul proprio cache locale
non c’è meno contesa tra
fili diversi e otterrete
migliore scalabilità perché ogni thread
ora funziona in modo completamente indipendente
ora questi numeri sono le cache
in realtà piuttosto piccoli ce ne sono 32
kilobyte per i dati nella cache L1 256
kilobyte nella tua cache l2 che questo
fa una grande differenza per il
prestazioni dell’applicazione perché se
accedi alla tua cache L3 allora tu
in realtà può richiedere 10 volte di più e
che quel fattore di 10 è spesso più di
un miglioramento delle prestazioni quindi puoi
raggiungere solo mettendo fuori lotti e
molte macchine così da scrivere in piccolo
componenti di servizi single threaded
unità di lavoro che siederanno su un nucleo
e non accedere al di fuori del nucleo che puoi
ottenere maggiori miglioramenti nelle prestazioni
piuttosto che lanciare un sacco di macchine a
il problema e questo tende a soddisfare
sistemi di trading molto più di quanto non faccia
salva per le applicazioni web con il loro web
le applicazioni il problema principale è
throughput non latenza tanto a lungo
come le latenze sono troppo piccole per a
umano per vedere il prossimo problema più grande è
rendimento ma per i sistemi di trading voi
necessità di ridurre al minimo la latenza e il lancio
molte scatole al problema in realtà
semplicemente aumenta la latenza che può
aumentare il rendimento ma anche
aumenta la latenza quindi in realtà tu
vuoi avere un minimo di scatole che vuoi
per ottenere il massimo da ognuno di
quelle macchine e un modo semplice di fare
quello di avere servizi che o
componenti che utilizzano una piccola quantità di
dati privati ​​privati ​​di tali aree
dove i micro servizi e la formazione
i sistemi si sovrappongono che si desidera avere
semplice design basato sui componenti come ho detto
puoi ancora avere un componente basato
progettare in un modello se non c’è niente
fermarti
avendo questo ma essenzialmente micro
i servizi non funzioneranno a meno che tu non abbia
chiare separazioni di responsabilità
tra i componenti chiaramente meno
livelli di astrazione in un monolite
non sei davvero tenuti a farlo
ed è molto spesso facile per le persone
mettere in piccole soluzioni semplici che
in realtà finiscono per causare una grande rete di
dipendenze tra i tuoi componenti
mentre Microsoft è solo per te
non lavorare
lavoro se lo fai nei sistemi di trading
si usa molto la messaggistica asincrona
più credo che sia considerato il migliore
pratica in termini di prestazioni con
micro servizi anche se non tutti
lo vuoi avere automatico e
Automatizzazione dinamica di servizi voi
per motivi di prestazioni non solo per
mantenendo la responsabilità semplice che vuoi
avere set di dati privati tanto quanto
possibile ora un’area importante è ciò che io
credi sia una messaggistica trasparente ora
questo è dove il debug di un distribuito
il sistema è reso molto più facile se puoi
effettivamente vedere i messaggi che puoi
in realtà controllali tu stesso perché
che rende immediatamente facile tagliare
il tuo problema a metà è il mio sistema
producendo il messaggio che è corretto
è esso produce correttamente o è
solo che il consumatore lo sta consumando
in modo errato e a quel punto puoi
divide immediatamente il tuo problema a metà
se riesci a leggere i messaggi anche da a
punto di vista delle prestazioni del sistema
potrebbe comportarsi correttamente, ma funziona
potrebbe generare molti più messaggi di
ne ha davvero bisogno, per esempio è così
abbastanza comune per i consumatori di ignorare
duplicare ma dire che il tuo produttore è
mandando tutto tre volte giusto a te
esegui il tuo test unitario esegui tutto il tuo
testare tutto funziona ancora perché
stanno ignorando tutti i duplicati ma
non appena guardi il messaggio tu
vai oh, tutto sta uscendo tre
volte in modo da poter vedere immediatamente
problemi che potrebbero non apparire nell’unità
test è vero inviando molti più dati che
ha bisogno di inviare campi
non cambia mai, ma sta inviando
loro ancora e ancora e ancora con
ogni record che inizi a vedere
opportunità di ottimizzazione se puoi
vedi i tuoi messaggi okay si sta passando
architettura lambda quindi uno dei modelli
di architettura lambda è quello che hai
una lista sempre crescente di eventi come input
a una funzione che è stateless e
allora questo ha una serie di risultati per
ogni evento di input ora è molto
il modello semplice in effetti non lo è in realtà
funziona in tutti i casi ma dove funziona
vuoi usarlo il più possibile
perché queste sono unità molto semplici di
lavoro molto facile da capire e io
Incoraggiare fortemente le persone a identificarsi
dove nel loro sistema possono usare
lambda funziona ed estrae quel lavoro
fuori così poi che rivela i componenti
che hanno ora cicli di vita più complessi
come una sorta di revisione di questo in questo
modellare ogni uscita è completamente
dipende da un messaggio dal suo input
ora c’è una leggera revisione di me
tendono a prendere quale è la prestazione
ragioni è che in questo caso il
la funzione è ora il risultato di tutto il
input è mai ricevuto giusto così dentro
teoria si potrebbe semplicemente ripetere ogni
messaggio per capire cosa dovrebbe fare
con un messaggio o puoi mantenere un
stato e quello stato deve essere in grado di
essere completamente ricostruito da tutti gli input
allora diventa solo un’ottimizzazione
quindi non puoi avere uno stato in un lambda
funzione
Credo che sia completamente
riproducibile da tutti i suoi input ora
come iniziamo a metterli insieme
beh potresti dire un motore fisso
con i dati che arrivano nei dati di mercato in arrivo
in e quindi è necessario normalizzare questo
dati fissi in un formato interno che
alcuni campi a cui non sei interessato
sono stati inviati a te ma tu no
interessato a lasciarli alcuni campi
devono essere tradotti forse alcuni dati
deve essere arricchito e tu produci a
formato normalizzato in modo che potrebbe essere
invia messaggi sempre crescenti poi lo farai
avere una sorta di componente stateful
che ora ha bisogno di prendere alcune decisioni
basato su tali input e può produrre
ordini per esempio e quegli ordini allora
andare a un responsabile degli ordini che prende
il tuo messaggio di ordine normalizzato e si trasforma
esso in fichi quindi quindi l’esterno
sistema l’uscita all’altra estremità è
appena risolto il problema con questo
questo è il tuo percorso critico e da a
punto di vista delle prestazioni che vuoi il tuo
percorso critico per essere il più breve possibile
in termini di latenza vuoi che sia come
il più veloce possibile e questo significa
scaricare lavoro su altri thread o
altri servizi che si desidera essere in grado di
prendere il lavoro fuori da questo percorso critico
tutto ciò che non ha bisogno di farti
ottenere qualcos’altro per farlo in modo che il tuo
la latenza end-to-end è più breve di
possibile e un modo per farlo è quello
passare il lavoro a un’attività asincrona o
un altro modo per dirlo è superarlo
a un altro terreno di funzionare che
funziona in un altro thread
i risultati dicono il tuo sistema di controllo
passarlo a una strategia oa un esterno
sistema o ne abbiamo uno quello
uno di questi componenti che in realtà
accede a un database JDBC JDBC può prendere un
molto tempo quindi quello che vorresti fare sei tu
invia un messaggio fuori dal tuo controllo
sistema dicendo che ho bisogno di questi dati va
passato a un gestore asincrono che
il conduttore quindi prende i risultati e
diventa l’input del tuo sistema di controllo
ora uno dei vantaggi dell’utilizzo di questo
il modello è che puoi riprodurre perché
tutto ciò che fa un sistema è
dipende dai suoi input puoi riprodurre
tutti questi input e ricreare il
stato di uno di questi componenti in qualsiasi
punto durante il giorno e in particolare
anche se dipendi da esterni
sistemi perché stai catturando il
risultati e passando attraverso di loro come
input non hai realmente bisogno di quelli
i sistemi esterni devono essere in quello stato o
anche disponibile più
quindi, ad esempio, hai fatto una query JDBC
è passato a una strategia e questo
dovrebbe essere chiamato gateway o qualcosa del genere
e chiede il database per alcuni
risultati che vengono passati come input
hai catturato ciò che risulta ciò che tu
Sapevo quando lo sapevi come un input quindi
quindi basta rivedere i messaggi in entrata
è tutto ciò che devi fare per ricreare il
stato di quel sistema in quel punto e
puoi misurare che puoi eseguire il debug e
prova completamente il tuo sistema di controllo
indipendente, autonomo
utilizzando gli input reali anche in tempo reale
se desideri così una delle cose che io
suggerire che le persone fanno è lavorare fuori
che tempismo è importante per loro dire
forse sono cento microsecondi quindi se
ci sono due eventi che sono meno di
A 100 microsecondi lo fai a
divario realistico se è più di un
cento microsecondi quindi solo tu
in realtà attendo un centinaio di microsecondi così
in questo modo puoi rivedere il valore di un giorno
dati con tempi realistici, ma lo fanno
entro meno di un’ora a seconda di
la tua spaziatura perché non vuoi
in realtà aspettare un giorno intero per eseguire il nostro
vale tutto il giorno dei dati che vuoi tu
volevo essere in grado di ottenere il tuo feedback
più veloce di quello così che cosa intendiamo per
un sistema distribuito generalmente quando
le persone parlano di sistemi distribuiti
stanno pensando a più macchine
ma in realtà ai tempi di basso livello
in realtà devi pensare a ciascuno
core come processore indipendente perché
vuoi che vengano eseguiti in modo indipendente come
possibile si desidera il ritardo stretto
tra i dati che vanno da uno per core a
un altro per essere il più efficiente possibile
e, in effetti, all’interno di un sistema è possibile
pensa anche a un sistema distribuito in
particolare se hai numeratori questo
diventa molto importante anche se lo sei
non parlando dello spazio a bassa latenza
se hai una JVM che attraversa Numa
le regioni in cui trovi i tuoi tempi di GC semplicemente soffiano
fuori fantasticamente perché è dentro
la realtà quando ne hai più
numeratori che hai in realtà multipli
macchine collegate da un bus ad alta velocità
quindi anche se è un bus ad alta velocità
non è veloce come la memoria diretta e in
realtà il sistema operativo in realtà farà abbastanza a
molto lavoro per te per assicurarti che a
processo rimane all’interno di una regione Numa ma
certamente se provi a creare una JVM
che attraversa più neumann
regioni che vedrai davvero
differenza così come ho detto che vuoi
modella la tua applicazione come
serie di processi macchina single core
che hanno i propri dati e possono essere eseguiti come
indipendentemente come
di tutti e quindi comunicano tramite il
l2 bus di coerenza facciamo un esempio
abbiamo in questo caso è simile a
l’esempio precedente che ho organizzato ho
vedrai questa sistemazione
perché, ma abbiamo ancora questa chiamata
sistema di routing che è in verde che abbiamo
ha dati sul mercato della data che sta alimentando
dati nel tuo sistema
gli unici output sono davvero dati che sono
vieni dal TCP hai un ordine
sistema di gestione che esce e tu hai
ha un numero di processi asincroni
che richiede un po ‘più di tempo un po’ più di CPU
non sono così sensibili alla latenza e
ognuno di questi thread o core
i processi per ogni core hanno il loro
dati locali quindi come si fa a confrontare
come una CPU è attualmente presentata
Dall’altra parte qui abbiamo quattro core
e sul fondo ne abbiamo un altro
quattro core tra noi abbiamo il l3
cache che è un bel po ‘di silicio
ma appena immediatamente sopra e
immediatamente sotto la cache l3 che abbiamo
le nostre cache l2 non sono sicuro esattamente dove
la cache l1 è ma potrebbe essere al
lasciato così come fa quella mappa al nostro processo
beh, in realtà possiamo organizzare il nostro
il programma funzionerà su silicio, così ora abbiamo
sappiamo esattamente quale sarà la causa
usato per ciascuno di questi individui
scopi è possibile utilizzare l’affinità del thread per
associare un processo o un thread a un
nucleo individuale e ora hanno solo bisogno
essere in grado di comunicare via condivisa
memoria o all’interno dello stesso processo e
il ritardo tra un salto e il
il prossimo è in realtà solo la velocità
bloccato il ritardo necessario per passare i dati
da una l3 alla cache ad un’altra cache L2
che è circa 20 cicli di clock non 20
nanosecondi così puoi ottenere un livello molto alto
connessione di velocità
ora non ho ancora detto tutto lì
sono questi diversi thread o questi
diversi processi perché nella realtà
non importa dovrebbe essere interamente
giù a voi per decidere voglio correre
questi in diversi processi o meno e
in realtà ciò che tende ad accadere è quello
i componenti più stabili è in realtà
più facile rilasciarli come un monolite
una volta che diventano stabili non lo sono
cambiando molto spesso non voglio essere
in grado di rilasciarli tutti in modo indipendente
non è solo troppo lavoro
ma ciò che tenderà ad accadere è come te
potrebbe portare un nuovo provider online in un nuovo
gateway di mercato che non è così stabile
Voglio essere in grado di riavviarlo in qualsiasi momento
puntare se muore non lo voglio
abbattere tutto il sistema, giusto io
non si fidano ancora così faccio che
forse è solo il secondo gateway del mercato
riavviabile o lo faccio che il
strategie m2s sono riavviabili perché
mantiene che il trader continua a cambiare il suo
pensa a ciò che vuole che non lo sia anche lui
sicuro che vuole essere in grado di riavviare che
uno così lo rendiamo riavviabile ma
tutto il resto può essere distribuito in una sola volta
come singola JVM o contemporaneamente come multiplo
jaebeum è tutto in realtà non dovrebbe importa voi
dovrebbe essere in grado di progettare un sistema dove
la tua scelta su quanti processi utilizzare
ciò che ha senso per te non lo è
non dovresti dover riscrivere il tuo codice
per farlo accadere
sta ripetendo in gran parte quello che ho appena detto
va bene così una delle sfide
micro-servizi come si esegue il test e il debug
loro perché test e debug
sistemi distribuiti è molto difficile e
non ci sono strumenti veramente buoni in
facendo questo così l’approccio che prendo
è vedere un microservizio in realtà è un
componente di un componente di business dovrebbe
davvero dire componente di business con a
trasporto e questo è ciò che lo rende un
servizio ma quel trasporto dovrebbe essere
facoltativo il trasporto non dovrebbe cambiare
il comportamento del tuo componente e così via
dovresti essere in grado di testare il tuo
componente standalone e infatti tu
dovrebbe essere in grado di testare due componenti
parlando tra di loro senza effettivamente
qualsiasi trasporto e se così facendo
ora hai ciò che è essenzialmente per
scopi di test un monolite o un’unità
scopo di test un monomero o per
scopi di debug ma poi una volta tutti voi
i tuoi componenti lavorano insieme e loro
comportamento corretto si può dire che in questo momento mi
vuoi distribuirlo a più thread
più macchine i componenti ancora
funziona allo stesso modo e quindi se ce n’è
problemi diventa perché ce ne sono alcuni
sorta di strana interazione tra il
fatto che ora è asincrono ma il
la funzionalità effettiva non dovrebbe avere
cambiato quindi proviamo un semplice esempio
diciamo che abbiamo un componente lambda che
al momento ha un solo evento in arrivo
in cui è un prezzo unilaterale così alcuni
fornitori di dati di mercato solo darvi
i letti tutte le offerte ma non entrambi
allo stesso tempo vogliamo scrivere a
componente che lo normalizza perché
internamente la maggior parte dei nostri fornitori dà come
in cima a un libro a cui non siamo interessati
ottenere singoli eventi è ciò che noi
voglio così abbiamo un componente che prende
come un input prezzi lati e produce
un’uscita superiore dei prezzi dei libri che hanno
entrambi così potrebbe essere il nostro modello di dati
questo abbiamo una classe chiamata astratta
multiplo che effettivamente implementa
cose come il codice hash di due stringhe uguali
tutto il serialize a
e deserializzazione ma questo modello funziona
indipendentemente dal fatto che tu abbia o
non
così come un esempio per la serializzazione di un
due stringhe effettivamente serializziamo come
llamo di default il beneficio di Yama
su Jason è che è progettato per essere
leggibile dall’uomo e supporta i tipi e
un’altra caratteristica che usiamo molto è i commenti
usiamo abbiamo messo un sacco di commenti da aggiungere
aiuti tracciati e uno degli altri
benefici è che possiamo prendere qualcosa da un
log o un output e in realtà D maresciallo
e ricreare così quegli oggetti esatti
ricreando oggetti che escono
la produzione è molto semplice anche se lo sono
davvero complesso quindi sappiamo che no
l’informazione è andata perduta se può essere d
marshalling quindi diamo un’occhiata a questo
esempio abbiamo un prezzo laterale e
va e cerca di trovare il top pertinente
del prezzo del libro che avrebbe dovuto essere
aggiornato e quindi diciamo se qualcosa ha
cambiato quindi attiviamo un evento così noi
avere un componente molto semplice ora
può prendere i prezzi di Sider e trasformarli in
eventi che hanno il meglio del libro come facciamo
prendi in giro bene il nostro componente, in realtà è così
davvero banale perchè in effetti il ​​nostro
componente implementa un’interfaccia che possiamo
basta prendere in giro l’interfaccia ok, quindi come possiamo
prova il nostro componente bene di nuovo noi stessi
le uscite sono solo un’interfaccia, quindi possiamo
prendi in giro le uscite diciamo che queste sono le
uscite che ci aspettiamo di ottenere da noi create
il nostro componente ci nutriamo negli input e
quindi verifichiamo che otteniamo tutti i risultati
mi aspettavo quindi di scrivere un semplice test unitario
per questo non è molto complicato dove
diventa ancora più interessante dove
hai una serie di componenti così il
output di uno perché abbiamo usato un
architettura lambda l’output di uno è
l’input di un altro così in questo caso
non stiamo solo chiamando il combinatore
direttamente ma possiamo anche chiamare l’ordine
manager quindi non dobbiamo nutrire
tutto come input fin dall’inizio
possiamo prendere input per altri componenti
Ora la cosa importante è
puoi vedere che qui non solo noi
può scrivere semplici test unitari all’avvio
e si spegne molto velocemente possiamo correre
molti di questi test possiamo fare molto
test guidati dai dati ma questo è molto
facile da debugare proprio così quando ho scritto questo
test ci sono stati bug e ho usato questo per
debug e tutto ciò che dovevo fare era rompere
puntualizza questa frase passo qui e qui
passi in questo codice fa qualcosa
e poi entra in quel codice e vado
lo stack e poi posso andare giù per la
stack e posso vedere tutte le mie variabili e
Sto solo facendo il debug come se fosse un
monolite ma in realtà questi sono
componenti autonomi che posso mettere a
trasporto tra di loro e ora ho un
micro servizio quindi aggiungere i trasporti ora
anche se avevo intenzione di aggiungere MPI a questo
elenco ma c’è molto di diverso
trasporti che potresti usare e dentro
Infatti io sono appassionato sostenitore che si dovrebbe
essere in grado di non avere alcun trasporto così
nell’esempio precedente non c’è
trasportare il comportamento dell’azienda
la logica dovrebbe essere la stessa indipendentemente da
se si tratta di un trasporto o non ora il
quello che so di più è la cronaca
in coda soprattutto perché l’ho scritto così io
passerò un po ‘di tempo a parlare
a questo proposito è open source in modo da poter
leggi il codice ed è apache2
quindi non c’è alcun costo di licenza per il suo utilizzo
quale apache è una coda di cronaca
che è una coda illimitata legata è
una coda persistente illimitata che significa
che ha rotto una lista che ha molto basso
la latenza è possibile ottenere meno di 10
microsecondi il 99% delle volte lo è
persistito in modo da poter facilmente copiare
i file dalla produzione al test e
ripeti i dati di un’intera giornata di dati
uno qualsiasi di questi servizi è possibile
prendere gli input per quel servizio e
riprodurli registrando assolutamente
ogni input che è completamente ricreare
abbu non ti serve tanto loggarti
solo quasi bisogno di registrazione per davvero
cose eccezionali che semplicemente non fai
aspetto di succedere
abbiamo avuto un utente provare questo
inizialmente sono diplomatici
sistema di valutazione che stavano ottenendo 35
microsecondi end to end in genere e
dopo aver messo in coda la cronaca loro
in realtà mi sono reso conto che stavano facendo
alcuni lavori ridondanti quindi dopo averli inseriti
coda di cronaca e rimozione del
lavoro ridondante è andato le latenze
sceso a 23 microsecondi in genere così
una delle cose che le persone chiedono è
bene se stai persistendo tutto
non ti rallenterà
ma in realtà la nostra esperienza è avendo
maggiore trasparenza e migliori test
in realtà acceleri la tua applicazione
quindi che aspetto ha ora
questo è qualcosa su cui abbiamo lavorato abbastanza
molto è renderlo trasparente come
possibile e in effetti puoi scaricarlo
fuori senza alcuna conoscenza del
applicazione perché i messaggi possono essere
decodificato in llaman così sono in a
forma binaria per le prestazioni ma questo
binario può essere convertito in Yammer per
leggibilità ho preso un sacco di
formattazione per adattarlo a questa diapositiva ma
questo è tutto ciò che sono
prodotto da quell’esempio precedente e
puoi vedere l’intestazione che è una specie di
sono tutti metadati di cui non hai veramente bisogno
per saperlo ma puoi vedere che l’on
idea d’ordine che era il messaggio che
è stato chiamato in precedenza che è nel
il mezzo qui viene chiamato con questi valori
e in effetti questo è ciò che ottieni perché
è un formato binario la posizione del
messaggio questo è un offset di byte di quello
il messaggio conta davvero e questo è
questo è dove questo è un commento che
entra così come si forma
fatto con un Microsoft jmh che è un
ottimo strumento per fare micro
benchmark una delle cose che non fa
fare così bene è la messaggistica asincrona
ed è per questo che abbiamo finito per scrivere il nostro
chiamato benchmark Java latency harness
ma per fare semplici test è molto
utile e come puoi vedere quattro nove è
meno di 20 microsecondi è il cinque nove
molto più alto ma in realtà era dovuto a
il sistema operativo ho davvero bisogno di aggiornare il mio
nocciolo
non lo fa su un molto più pulito
macchina così una delle cose controverse
che penso sia in realtà abbastanza importante
è di nuovo la maggior parte dei sistemi di messaggistica
provenienti dallo spazio web sono tutti
assumendo che tu voglia il controllo del flusso e il flusso
il controllo è molto potente e molto utile
il controllo del flusso blocca il tuo consumatore
essere sovraccaricato dal tuo
produttore e come utente della GUI che è il
l’ultima cosa che vuoi perché non puoi essere
inviare troppi dati a un utente della GUI
perché non possono vederlo comunque e
rallenterà solo loro
macchina quindi è completamente inutile
tuttavia ci sono molte situazioni
in particolare nei sistemi di trading e
sistemi di conformità in cui il controllo del flusso è
l’ultima cosa che vuoi così per il mercato
dati che non puoi dire allo scambio hey
Sto avendo difficoltà a tenere fuori può voi
rallentare per me non è solo non andando a
succede o nei sistemi di conformità è
di solito qualcosa che altri reparti
viene detto che devono avere ma loro
non vogliono essere rallentato dalla
sistema di conformità stesso
quindi cos’è la coda della cronaca
implementato come un enorme buffer e
quindi non è necessario avere il controllo del flusso
quindi non spinge mai indietro sul produttore
per dire che non posso mantenere il consumatore
può ottenere sempre più indietro ma
il consumatore non ha nemmeno bisogno di essere
in esecuzione perché la coda appena
scrive sempre di più in un file che
cresce e quindi il consumatore potrebbe essere
riavviato o continua da dove è attivo
a e perché è tutto usando il fuoco spento
memoria non c’è problema con esso
a corto di spazio heap o addirittura principale
spazio di memoria una delle cose che testiamo
è quello che succede quando il consumatore è
oltre la memoria principale dietro il
produttore scopriamo che effettivamente lo fa
prestazione male , ma continua a
corri così dove posso provare questo abbiamo alcuni
esempi esempi più completi di
codice che ho appena mostrato sul mio repository blog
il vero codice sorgente di Chronicle Q
e alcune delle altre cose che ho menzionato
sono tutti aperti e per darti un
piccola idea di alcuni dei prodotti
abbiamo tutto in verde
opensource quello più rilevante
a questo discorso c’è Q che è persistente
tutto modello
Sono un filo di Q banner quello che sta girando
rivela sempre più utile permette
è una API standard che ti permette di
scrivere in molti formati diversi e
in particolare ti permette di ottimizzare
il formato per un particolare caso d’uso
senza dover cambiare il tuo codice così dentro
il microservice di riepilogo non significa questo
devi fare tutto diversamente quindi
Sono molto più a favore dell’evoluzione
piuttosto che la rivoluzione è un possibile
vedilo come un obiettivo che puoi
decidere che alcune di queste migliori pratiche
sono per te
alcuni di loro non sono probabilmente il
quelli che sono più rilevanti per te
le cose che stai già facendo ma
forse non così bene come potresti farlo
in effetti se non sei già un
sistema distribuito in un certo senso del
parola quindi trasformando l’applicazione in
un sistema distribuito potrebbe non essere il
giusta decisione ma se sei già un
sistema distribuito, come un sacco di
i sistemi di trading devono passare
forse lavorare tra più thread
ci sono alcune cose nei micro servizi
ciò può aiutarti a migliorare le tue pratiche
già e sì sono un grande fan di lambda
architettura anche se riconosco che a
molte applicazioni del mondo reale no
adattarsi bene completamente ma è possibile
fai esercizi e trasformali in a
architettura lambda

Please follow and like us: