See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 6958|Vastuse: 1

Mitmelõimeline skaleeritavus viib tupikusse

[Kopeeri link]
Postitatud 06.12.2014 22:21:58 | | |
See on artikkel Python'i maailmast, kuid kehtib siiski kogu programmeerimisvaldkonnas, kuigi mitmelõimeline süsteem võimaldab meil päringuid kiiremini töödelda, kuid on olemas ka lagi, rohelised (mikrolõimed) lõimed on lahendus.

Mitmelõimeline tarkvaraarendus lahendab suure hulga probleeme, eriti võrgukesksete rakenduste puhul, mis vajavad nõudlikku jõudlust, et kasutajatele kiiresti reageerida. Kahjuks ei piisa mitmelõimelisest lahendusest suuremahuliste probleemide lahendamiseksSamaaegsusseksuaalsed probleemid.

Nende probleemide lahendamiseks on vaja muuta programmeerimismudeleid, kasutades asünkroonneid sündmusi ja tagasikõnedel põhinevaid mehhanisme. Druvas lõime Pythonil põhineva teegi nimega Dhaga, et lahendada suuremahulisi probleemeSamaaegsus, samas kui programmeerimismudel ei nõua olulisi muudatusi.

Tarkvaraarendajad elavad ühesSamaaegsusmaailma. Lõimed on tänapäeval esmaklassilised kodanikud, eriti arenduse ajal, eriti kui rakendus teostab intensiivseid võrgutoiminguid, nagu inSync süsteem (võrgu turvalisuse sünkroniseerimise toode) nagu Druva. Multithreading aitab võrgutoimingute programmeerimiskoodi sujuvalt ja korrapäraselt voolata. Kui meie rakendus vajab jõudluse parandamist või täiustusi, saab seda parandadaElastsus, saame suurendada lõimede arvu.

Aga kui rääkida tuhandetest kaaludestSamaaegsusSoovid, teemad ei ole piisavad.

Leidsime, et mitmelõimelisel on järgmised puudused:
1. inSync süsteemiklient peab varundama suure hulga faile serverisse võrgu RPC kõnede kaudu. Tüüpiline viis arendajatel asju kiirendada on kasutada lõime. Kuid mitmelõimelise töö jõudlus suurendab mälu ja protsessori maksumust; Arendajad peavad hoidma tasakaalu kiiruse ja lõimede arvu vahel.

2. Meie serverid peavad toimima inSync süsteemi ja tuhandete klientide vahelSamaaegsusÜhendused ja teavitused. Ühenduste tõhusaks haldamiseks kasutame päringute haldamiseks lõime. Kuid inSynci süsteemi klientide kasvav arv tähendab ka seda, et peame jätkuvalt suurendama lõimede arvu, mis kulutab palju serveri mälu ja protsessorit.

3. Meie veebiserver peab käsitlema tuhandeid paralleelseid HTTP-päringuid. Enamik tööst toimub võrgupesadele, mis andmeid vastu võtavad ja saadavad ning edastavad neid inSync süsteemi taustasüsteemi. See paneb enamik lõime ootama võrgutoiminguid. C10K probleemi põhjustab see, et kui veebiserverile on tuhandeid sünkroonseid päringuid, on iga päringu jaoks lõime genereerimine üsna mitteskaleeritav (Scale).

Asünkroonsete raamistikude piirangud
Paljud asünkroonsed raamistikud, sealhulgas Twisted, Tornado Tornado ja asyncore, aitavad arendajatel eemalduda populaarsetest lõimede kasutamise viisidest. Need raamistikud tuginevad mitteblokeerivatele soklidele ja tagasikõnemehhanismidele (sarnaselt Node.js-le). Kui kasutame neid raamistikke sellisena, nagu on, tuleb meie Druva koodi põhiosad refaktoreerida. See pole see, mida me tahame teha. Koodi refaktoreerimine pikendab arendus- ja testimistsükleid, takistades meil täita oma skaala nõudeid. Arvestades, et mitmed toote osad peavad olema massiivsed, peab igaüks meist need refaktoreerima – seetõttu tuleb kahekordistada või kolmekordistada.

Et vältida nii palju koodi muutmist, pidime loobuma olemasolevast raamistikust otse kasutamisest. Õnneks leidsime mõned kasulikud tööriistad.

Kuna tahame kontrollida koodi täitmist võrgu I/O peal, vajame viisi, kuidas lõime mikrolõimedeks jagada. Me leiameGreenlets。 See pakub mitte-kaudset mikrolõime ajastamist, mida nimetatakse korutiinseks korutiiniks. Teisisõnu. See on kasulik, kui tahad oma koodi töötamist kontrollida. Sa saad ehitada mikrolõime kohandatud ajakavade jaoks, sest saad kontrollida, millal rohelised pausid tekivad. See sobib meile ideaalselt, sest annab meile täieliku kontrolli oma koodi ajastamise üle.

Tornado on lihtne, blokeerimata veebiserveri raamistik, mis on kirjutatud Pythonis ja loodud tuhandete asünkroonsete päringute haldamiseks. Kasutame selle põhikomponenti, IOLoop IOStream. IOLoop on mitteblokeeriv pesa I/O sündmuste tsükkel; See kasutab epolli (Linuxis) või järjekordi (BSD ja Mac OS X), muidu vali (Windowsis), kui need on saadaval. IOStream pakub mitteblokeerivaid pesasid, näiteks mugavat pakendit lugemiseks ja kirjutamiseks. Delegeerime kõik sokli operatsioonid Tornado'le ja kasutame seejärel callback'e, et käivitada kooditoimingud lõpule viimiseks (banq märkus: väga sarnane Node.js mehhanismile).

See on hea algus, aga meil on vaja rohkem. Kui kasutame ülaltoodud moodulit otse oma koodis, peab suur osa meie RPC koodist muutuma, näiteks RPC ajastama roheliste värvide kaudu, veendumaks, et rohelised letid ei blokeeri (kui rohelised on ummistunud, ummistab see kogu lõime ja kõik teised), haldama tornaado tagasikõne funktsioone.

Meil on vaja abstraktsiooni, et hallata ja korraldada rohelisi lehti, et vältida nende ummistamist väliste kõnedega, ning see abstraktsioon võib olla tohutult skaleeritav väljaspool lõime. See abstraktsioon on Dhaga, mis võimaldab rakenduse koodivoogu programmeerida nagu traditsioonilist sünkroonset järjestust, kuid täitmine on asünkroonne.

Dhaga (hindi keelest, mis tähendab niit) on kerge lõime täitmisraamistik, mida me abstrakteerime. Dhaga klass on tuletatud rohelistest ja kasutab virna lülitusi, et täita mitut koodivoogu ühes operatsioonisüsteemi lõimes. Ühe operatsioonisüsteemi lõimed täidavad mitut dhagasi koostöögraafia abil. Iga kord, kui dhaga ootab (peamiselt ootab RPC kutse tagasitulekut), annab ta juhtimise vanemtasemele (st OS-taseme lõime täitmiskontekstile, mis selle lõi). Vanema tase ajastab seejärel teise dhaga, et see oleks valmis käivitamiseks. RPC kutse edastatakse tornado veebiserverile, et kirjutada Socket asünkroonselt, ning registreerib tagasikõne, kui see tagasi tuleb, ning kui see RPC tagasi tuleb, lisatakse ootav dhaga täidetava järjekorra ja seejärel võtab selle üles vanemlõim. (Banq märkus: sarnane node.js põhimõttele)

Me võime kasutada Dhagat lõimede asemel kõrge latentsusega operatsioonide jaoks ning 512 dhaga't ühes lõimes, kui lõimede arv kasvab üle mõistliku läbilaskevõime piiri.







Eelmine:MVC raamistikumuster on surnud
Järgmine:MVC raamistike eelised ja puudused:
Postitatud 07.12.2014 17:22:55 |
Lugemine ja postitamine on voorus
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com