E vacanze sò finite è simu di ritornu cù u nostru secondu postu in a serie Istio Service Mesh.
U tema di l'oghje hè Circuit Breaker, chì traduttu in l'ingegneria elettrica russa significa "circuit breaker", in lingua cumuni - "circuit breaker". Solu in Istio sta macchina ùn disconnect un circuitu in cortocircuiti o sovraccarichi, ma cuntenituri difettosi.
Cumu questu deve travaglià idealmente
Quandu i microservizi sò gestiti da Kubernetes, per esempiu in a piattaforma OpenShift, si scalanu automaticamente in up and down secondu a carica. Siccomu i microservizi funzionanu in pods, ponu esse parechje istanze di un microserviziu cuntainerizatu in un puntu finale, è Kubernetes indirizzerà e richieste è u bilanciu di carica trà elli. E - idealmente - tuttu questu duverebbe travaglià perfettamente.
Ricurdamu chì i microservizi sò chjuchi è effimeri. L'efimeralità, chì quì significa a facilità d'apparizione è di sparisce, hè spessu sottuvalutata. A nascita è a morte di un'altra istanza di un microserviziu in un pod sò cose abbastanza previste, OpenShift è Kubernetes trattanu questu bè, è tuttu funziona bè - ma dinò in teoria.
Cumu funziona veramente
Avà imaginate chì un esempiu specificu di un microserviziu, vale à dì un cuntinuu, hè diventatu inutilizabile: o ùn risponde micca (errore 503), o, ciò chì hè più sgradevule, risponde, ma troppu pianu. In altre parolle, diventa glitchy o ùn risponde micca à e dumande, ma ùn hè micca automaticamente eliminatu da a piscina. Cosa deve esse fattu in stu casu? Per ripruvà ? Deve sguassà da u schema di routing? E chì significa "troppu lento" - quantu hè in numeri, è quale li determina? Forse dà solu una pausa è pruvate di novu dopu? Sì cusì, quantu dopu?
Cosa hè Pool Ejection in Istio
È quì Istio vene in salvezza cù i so machini di prutezzione Circuit Breaker, chì sguassate temporaneamente i cuntenituri difettusi da a piscina di risorse di routing è di bilanciamentu di carica, implementendu a prucedura Pool Ejection.
Utilizendu una strategia di rilevazione di outlier, Istio detecta i podi di curve chì sò fora di linea è li elimina da u pool di risorse per una quantità specifica di tempu, chjamata finestra di sonnu.
Per dimustrà cumu funziona in Kubernetes nantu à a piattaforma OpenShift, cuminciamu cù una screenshot di i microservizi chì funzionanu normalmente da l'esempiu in u repository.
Preparate per un crash
Prima di fà Pool Ejection, avete bisognu di creà una regula di routing Istio. Diciamu chì vulemu distribuisce e dumande trà pods in un rapportu 50/50. Inoltre, aumenteremu u numeru di cuntenituri v2 da unu à dui, cusì:
oc scale deployment recommendation-v2 --replicas=2 -n tutorial
Avà avemu stabilitu una regula di routing per chì u trafficu hè distribuitu trà pods in un rapportu 50/50.
Eccu ciò chì u risultatu di sta regula pare:
Pudete truvà difettu cù u fattu chì sta schermu ùn hè micca 50/50, ma 14: 9, ma cù u tempu a situazione hà da migliurà.
Facendu un glitch
Avà disattivemu unu di i dui cuntenituri v2 in modu chì avemu un cuntainer v1 sanu, un cuntainer v2 sanu è un cuntainer v2 difettu:
Fixing the glitch
Allora, avemu un cuntinuu difettu, è hè u tempu di Pool Ejection. Utilizendu una cunfigurazione assai simplice, escluderemu stu containeru fallutu da qualsiasi schemi di routing per 15 seconde in a speranza chì tornerà à un statu sanu (o riavvia o restaurà u rendiment). Eccu ciò chì pare sta cunfigurazione è i risultati di u so travagliu:
Comu pudete vede, u cuntainer v2 fallutu ùn hè più utilizatu per e dumande di routing perchè hè statu eliminatu da a piscina. Ma dopu à 15 seconde, torna automaticamente à a piscina. In fatti, avemu appena dimustratu cumu funziona Pool Ejection.
Cuminciamu à custruisce l'architettura
Pool Ejection, cumminatu cù e capacità di monitoraghju di Istio, vi permette di cumincià à custruisce un framework per rimpiazzà automaticamente i cuntenituri difetti per riduce, se micca eliminà, i tempi di inattività è i fallimenti.
A NASA hà un mottu forte - U fallimentu ùn hè micca una opzione, l'autore di quale hè cunsideratu cum'è u direttore di u volu.
Istio, cum'è avemu scrittu sopra, implementa u cuncettu di circuit breakers, chì hà pruvatu bè in u mondu fisicu. È cum'è un interruttore di circuitu elettricu spegne una sezione problematica di un circuitu, u software Circuit Breaker d'Istio apre a cunnessione trà un flussu di richieste è un containeru di prublema quandu qualcosa hè sbagliatu cù l'endpoint, per esempiu, quandu u servitore s'hè lampatu o hà cuminciatu à sbattà. rallenta.
Inoltre, in u sicondu casu, ci sò solu più prublemi, postu chì i freni di un containeru ùn solu causanu una cascata di ritardi in i servizii chì accede à ellu è, in u risultatu, riduce u rendiment di u sistema in tuttu, ma ancu generanu ripetuti. dumande à un serviziu digià lento, chì aggrava solu a situazione.
Circuit Breaker in teoria
Circuit Breaker hè un proxy chì cuntrolla u flussu di richieste à un endpoint. Quandu stu puntu smette di travaglià o, sicondu i paràmetri specificati, cumencia à rallentà, u proxy rompe a cunnessione cù u cuntinuu. U trafficu hè allora redirettu à altri cuntainer, solu per via di l'equilibriu di carica. A cunnessione resta aperta per una data finestra di sonnu, dì dui minuti, è dopu hè cunsideratu mezzu apertu. Un tentativu di mandà a prossima dumanda determina u statu ulteriore di a cunnessione. Se tuttu hè bè cù u serviziu, a cunnessione torna in cundizione di travagliu è torna chjusu. Se ci hè ancu qualcosa di sbagliatu cù u serviziu, a cunnessione hè disconnected è a finestra di u sonnu hè riattivata. Eccu ciò chì pare un schema simplificatu di u statu di Circuit Breaker:
Hè impurtante di nutà quì chì tuttu questu succede à u livellu di l'architettura di u sistema. Dunque, in un certu puntu, duverete insignà à e vostre applicazioni à travaglià cù Circuit Breaker, per esempiu furnisce un valore predeterminatu in risposta o, se pussibule, ignurà l'esistenza di u serviziu. Un mudellu di bulkhead hè utilizatu per questu, ma hè fora di u scopu di stu articulu.
Circuit Breaker in pratica
Per esempiu, correremu duie versioni di u nostru microserviziu di ricunniscenza in OpenShift. A versione 1 hà da travaglià bè, ma in v2 custruiremu in un ritardu per simulà i rallentamenti in u servitore. Per vede i risultati, utilizate u strumentu
siege -r 2 -c 20 -v customer-tutorial.$(minishift ip).nip.io
Tuttu pare di travaglià, ma à chì costu? À u primu sguardu, avemu 100% dispunibilità, ma fate un ochju più vicinu - a durata massima di a transazzione hè quant'è 12 seconde. Questu hè chjaramente un collu di buttiglia è deve esse allargatu.
Per fà questu, useremu Istio per eliminà e chjama à i cuntenituri lenti. Questu hè ciò chì a cunfigurazione currispondente pare cù Circuit Breaker:
L'ultima linea cù u paràmetru httpMaxRequestsPerConnection signala chì a cunnessione cù deve esse disconnected when trying to create another - a second - connection in addition to the existing one. Siccomu u nostru cuntinuu simula un serviziu lento, tali situazioni surgiranu periodicamente, è tandu Istio torna un errore 503, ma questu hè ciò chì assediu mostrarà:
OK, avemu Circuit Breaker, chì hè dopu?
Cusì, avemu implementatu a spegnimentu automaticu senza toccu u codice fonte di i servizii stessi. Utilizendu Circuit Breaker è a prucedura Pool Ejection descritta sopra, pudemu caccià i cuntenituri di frenu da a piscina di risorse finu à ch'elli tornanu à u normale, è verificate u so status à una freccia specifica - in u nostru esempiu, questu hè dui minuti (parametru sleepWindow).
Nota chì a capacità di una applicazione per risponde à un errore 503 hè sempre stabilitu à u livellu di u codice fonte. Ci hè parechje strategie per aduprà Circuit Breaker, secondu a situazione.
In u prossimu postu: Parleremu di u tracciamentu è di u monitoraghju chì hè digià integratu o facilmente aghjuntu à Istio, è ancu di cumu per intruduce intenzionalmente errori in u sistema.
Source: www.habr.com