Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 6958|Vastaus: 1

Monisäikeinen skaalautuvuus ajaa umpikujaan

[Kopioi linkki]
Julkaistu 6.12.2014 22.21.58 | | |
Tämä on artikkeli Python-maailmasta, mutta se pätee silti koko ohjelmointialalle, vaikka monisäikeinen mahdollistaa pyyntöjen nopeamman käsittelyn, mutta siinä on myös katto, vihreät (mikrosäikeiset) säikeet ovat ratkaisu.

Monisäikeinen ohjelmistokehitys ratkaisee suuren määrän ongelmia, erityisesti verkkokeskeisille sovelluksille, jotka vaativat vaativaa suorituskykyä vastatakseen nopeasti käyttäjille. Valitettavasti monisäikeisyys ei riitä ratkaisemaan laajamittaisia ongelmiaSamanaikaisuusseksuaaliset ongelmat.

Näiden ongelmien ratkaiseminen vaatii ohjelmointimallien muuttamista, asynkronisten tapahtumien ja takaisinkutsupohjaisten mekanismien käyttöä. Druvalla loimme python-pohjaisen kirjaston nimeltä Dhaga ratkaisemaan laajamittaisia ongelmiaSamanaikaisuus, kun taas ohjelmointimalli ei vaadi merkittäviä muutoksia.

Ohjelmistokehittäjät asuvat yhdessäSamanaikaisuusmaailmaa. Säikeet ovat nykyään ensiluokkaisia kansalaisia, erityisesti kehityksen aikana, erityisesti silloin kun sovelluksesi suorittaa intensiivisiä verkkotoimintoja, kuten inSync-järjestelmä (verkon turvallisuuden synkronointituote) kuten Druva. Monisäikeisyys auttaa verkkotoimintojen ohjelmointikoodin sujuvaa ja järjestelmällistä virtaamista. Kun sovelluksemme tarvitsee suorituskyvyn parannuksia tai parannuksia, sitä voidaan parantaaJoustavuus, voimme lisätä säikeiden määrää.

Mutta kun kyse on tuhansista vaa'oistaSamanaikaisuusPyynnöt ja ketjut eivät riitä.

Huomasimme, että monisäikeistyksellä on seuraavat haitat:
1. inSync-järjestelmäasiakkaan täytyy varmuuskopioida suuri määrä tiedostoja palvelimelle verkon RPC-kutsujen kautta. Tyypillinen tapa kehittäjille nopeuttaa asioita on käyttää säikeitä. Monisäikeisyyden tuoma suorituskyky kuitenkin nostaa muistin ja suorittimen kustannuksia; Kehittäjien täytyy säilyttää tasapaino nopeuden ja säikeiden määrän välillä.

2. Palvelimiemme täytyy käsitellä inSync-järjestelmän ja tuhansien asiakkaiden välilläSamanaikaisuusYhteydet ja ilmoitukset. Yhteyksien tehokkaaksi käsittelemiseksi käytämme säikeitä pyyntöjen käsittelyyn. Mutta kasvava määrä inSync-järjestelmän asiakkaita tarkoittaa myös, että säikeiden määrän on jatkuvasti lisättävä, mikä kuluttaa paljon palvelinmuistia ja prosessoria.

3. Verkkopalvelimemme täytyy käsitellä tuhansia rinnakkaisia HTTP-pyyntöjä. Suurin osa työstä kohdistuu verkkoliittimiin, jotka vastaanottavat ja lähettävät dataa ja välittävät sen inSync-järjestelmän taustalle. Se saa useimmat säikeet odottamaan verkkotoimintoja. C10K-ongelman syynä on se, että kun web-palvelimelle on tuhansia synkronisia pyyntöjä, säikeen luominen jokaiselle pyynnölle on melko skaalaamattomia (Scale).

Asynkronisten kehysten rajoitukset
Monet asynkroniset kehykset, kuten Twisted, Tornado Tornado ja asyncore, voivat auttaa kehittäjiä siirtymään pois suosituista tapoja käyttää säikeitä. Nämä kehykset perustuvat ei-estäviin soketteihin ja takaisinkutsumekanismeihin (samankaltaisia kuin Node.js). Jos käytämme näitä kehyksiä sellaisenaan, Druva-koodimme pääosat täytyy refaktoroida. Se ei ole sitä, mitä haluamme tehdä. Koodin refaktorointi pidentää kehitys- ja testaussyklejä, estäen meitä täyttämästä mittakaavavaatimuksiamme. Koska tuotteen useiden osien täytyy olla massiivisia, jokaisen meistä täytyy refaktoroida ne – siksi kaksinkertaistaminen tai kolminkertaistuminen vaatii vaivaa.

Jotta koodia ei muutettaisi niin paljon, jouduimme luopumaan nykyisestä kehyksestä suoraan. Onneksi löysimme hyödyllisiä työkaluja.

Koska haluamme hallita koodin suoritusta verkon I/O:ssa, tarvitsemme tavan jakaa säie mikrosäikeisiin. Löydämmevihreät。 Se tarjoaa ei-implisiittisen mikrosäikeiden ajoituksen, jota kutsutaan co-routine-korutiiniksi. Toisin sanoen. Se on hyödyllinen, kun haluat hallita koodiasi käynnissä. Voit rakentaa mikrosäikeitä mukautettuihin aikatauluihin, koska voit hallita, milloin greenletit aiheuttavat taukoja. Tämä sopii meille täydellisesti, koska se antaa meille täyden hallinnan koodimme ajoitukseen.

Tornado on yksinkertainen, estämätön web-palvelinkehys, joka on kirjoitettu Pythonilla ja suunniteltu käsittelemään tuhansia asynkronisia pyyntöjä. Käytämme sen ydinkomponenttia, IOLoop IOStreamia. IOLoop on ei-estävä socket-I/O-tapahtumasilmukka; Se käyttää epollia (Linuxissa) tai jonoja (BSD ja Mac OS X), muuten valitse (Windowsissa), jos ne ovat saatavilla. IOStream tarjoaa ei-blokkaavia liittimiä, kuten kätevän pakkauksen lukemiseen ja kirjoittamiseen. Delegoimme kaikki socket-toiminnot Tornadolle ja käytämme sitten callback-toimintoja kooditoimintojen suorittamiseen (banq-huom: hyvin samanlainen kuin Node.js mekanismi).

Se on hyvä alku, mutta tarvitsemme enemmän. Jos käytämme yllä olevaa moduulia suoraan koodissamme, suuri osa RPC-koodista joutuu muuttamaan: aikatauluttamaan RPC:n vihreät läpi, varmistamaan, etteivät vihreät letit tukkeudu (jos vihreät tukkeutuvat, se tukkeuttaa koko säikeen ja kaikki muut), hoidetaan tornadon takaisinkutsutoimintoja.

Tarvitsemme abstraktion hallitsemaan ja järjestämään vihreitä lehtiä, jotta ne eivät tukkeudu ulkoisilla kutsuilla, ja tämä abstraktio voi olla valtavasti skaalautuva säikeiden ulkopuolelle. Tämä abstraktio on Dhaga, joka mahdollistaa sovelluskoodin kulun ohjelmoinnin perinteisen synkronisen sekvenssin tavoin, mutta suoritus on asynkroninen.

Dhaga (hindistä, joka tarkoittaa lankaa) on suorituskehys kevyelle säikeelle, jonka abstrahoitamme. Dhaga-luokka on johdettu greenletsistä ja käyttää pinovaihtoa suorittaakseen useita koodivirtoja yhdessä käyttöjärjestelmäsäikeessä. Yhden käyttöjärjestelmän säikeet suorittavat useita dhagaseja yhteistyöaikataulutuksen avulla. Aina kun dhaga odottaa (lähinnä odottaen RPC-kutsun paluuta), se antaa ohjauksen vanhemmalle tasolle (eli käyttöjärjestelmätason säikeen suorituskontekstille, joka sen loi). Vanhemmat tasot aikatauluttavat toisen dhagan valmiiksi juoksuun. RPC-kutsu välitetään tornado-verkkopalvelimelle, joka kirjoittaa Socketin asynkronisesti, ja rekisteröi takaisinsoiton sen palattua, ja kun tämä RPC palaa, odottava dhaga lisätään suoritettavaan jonoon ja vanhemmassa säikeessä se noudetaan. (Banq-huomautus: samankaltainen kuin node.js periaate)

Voimme käyttää Dhagaa säikeiden sijaan korkean viiveen operaatioihin, ja käytämme 512 dhagaa yhdessä säieessä, kun säikeiden määrä ylittää kohtuullisen läpimenon rajan.







Edellinen:MVC-kehysmalli on kuollut
Seuraava:MVC-kehysten edut ja haitat:
Julkaistu 7.12.2014 17.22.55 |
Lukeminen ja takaisin kirjoittaminen on hyve
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com