Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 6958|Svar: 1

Multithreading sætter skalerbarhed i en blindgyde

[Kopier link]
Opslået på 06/12/2014 22.21.58 | | |
Dette er en artikel fra Python-verdenen, men den er stadig anvendelig for hele programmeringsfeltet, selvom multithreading gør det muligt for os at behandle forespørgsler hurtigere, men der er også et loft, grønne (mikro-tråd) tråde er løsningen.

Multithreaded softwareudvikling løser en lang række problemer, især for netværkscentrerede applikationer, der kræver krævende ydeevne for hurtigt at kunne reagere på brugerne. Desværre er multitrådning ikke nok til at løse storskalaSammenløbseksuelle problemer.

At løse disse problemer kræver ændring af programmeringsmodeller ved brug af asynkrone begivenheder og callback-baserede mekanismer. Hos Druva skabte vi et python-baseret bibliotek kaldet Dhaga for at løse storskalaSammenløb, mens programmeringsmodellen ikke kræver væsentlige ændringer.

Softwareudviklere bor i énSammenløbverden. Tråde er i dag førsteklasses borgere, især under udvikling, især når din applikation udfører intensive netværksoperationer, som inSync-systemet (netværkssikkerhedssynkroniseringsprodukt) som Druva. Multitråding hjælper med at programmere kode til netværksoperationer på en enkel og ordnet måde. Når vores applikation har brug for ydelsesforbedringer eller forbedringer, kan den forbedresElasticitet, vi kan øge antallet af tråde.

Men når det gælder tusindvis af skalaerSammenløbAnmodninger, tråde er ikke nok.

Vi fandt, at multithreading har følgende ulemper:
1. InSync-systemets klient skal tage backup af et stort antal filer til serveren via netværks-RPC-kald. En typisk måde for udviklere at fremskynde processen på er at bruge tråde. Dog øger den ydeevne, som multi-threading giver, omkostningerne til hukommelse og CPU; Udviklere skal opretholde en balance mellem hastighed og trådantal.

2. Vores servere skal håndtere inSync-systemet og tusindvis af kunderSammenløbForbindelser og notifikationer. For at håndtere forbindelser effektivt bruger vi tråde til at håndtere forespørgsler. Men det stigende antal inSync-systemkunder betyder også, at vi skal fortsætte med at øge antallet af tråde, hvilket bruger meget serverhukommelse og CPU.

3. Vores webserver skal håndtere tusindvis af parallelle HTTP-forespørgsler. Det meste af arbejdet foregår på netværkssockets, der modtager og sender data og sender dem videre til backenden af inSync-systemet. Det får de fleste tråde til at vente på netværksoperationer. Hvilket forårsager C10K-problemet, når der er tusindvis af synkrone forespørgsler til webserveren, er generering af en tråd for hver anmodning ret uskalerbar (Scale).

Begrænsninger ved asynkrone rammeværker
Mange asynkrone frameworks, herunder Twisted, Tornado Tornado og asyncore, kan hjælpe udviklere med at bevæge sig væk fra de populære måder at bruge tråde på. Disse frameworks er afhængige af ikke-blokerende sockets og callback-mekanismer (lignende Node.js). Hvis vi bruger disse frameworks som de er, skal hoveddelene af vores Druva-kode refaktoreres. Det er ikke det, vi ønsker. Refaktorering af kode øger udviklings- og testcyklusserne, hvilket forhindrer os i at opfylde vores skaleringskrav. Da flere dele af produktet skal være massive, skal hver af os refaktorere dem – derfor er det nødvendigt at fordoble eller tredoble.

For at undgå at ændre så meget kode måtte vi gå væk fra at bruge det eksisterende framework direkte. Heldigvis fandt vi nogle nyttige værktøjer.

Fordi vi ønsker at kontrollere udførelsen af kode på netværkets I/O, har vi brug for en måde at opdele en tråd i mikrotråde. Vi finderGrønlinger。 Den tilbyder en ikke-implicit mikrotrådsplanlægning kaldet co-rutine coroutine. Med andre ord. Det er nyttigt, når du vil styre din kode, der kører. Du kan bygge mikrotråde til brugerdefinerede tidsplaner, fordi du kan kontrollere, hvornår greenlets giver pauser. Det er perfekt for os, fordi det giver os fuld kontrol over planlægningen af vores kode.

Tornado er et simpelt, ikke-blokerende webserver-framework skrevet i Python, designet til at håndtere tusindvis af asynkrone forespørgsler. Vi bruger dens kernekomponent, IOLoop IOStream. IOLoop er en ikke-blokkerende socket I/O-begivenhedsløkke; Den bruger epoll (på Linux) eller køer (BSD og Mac OS X), ellers vælger (på Windows), hvis de er tilgængelige. IOStream tilbyder ikke-blokerende sokler såsom praktisk indpakning til læsning og skrivning. Vi delegerer alle socket-operationer til Tornado og bruger derefter callbacks til at udløse kodeoperationer (banq-note: meget lig Node.js mekanisme).

Det er en god start, men vi har brug for mere. Hvis vi bruger ovenstående modul direkte i vores kode, skal meget af vores RPC-kode ændres, ved at planlægge RPC gennem greenlets, sørge for at greenlets ikke blokerer (hvis greenlets bliver tilstoppet, vil det tilstoppe hele tråden og alle de andre), håndtere callback-funktioner fra tornado.

Vi har brug for en abstraktion til at håndtere og arrangere greenlets for at undgå at tilstoppe dem med eksterne kald, og denne abstraktion kan være massivt skalerbar ud over tråde. Denne abstraktion er Dhaga, som tillader applikationskodens flow at blive programmeret som en traditionel synkron sekvens, men udførelsen er asynkron.

Dhaga (fra hindi, som betyder tråd) er et eksekveringsframework for en letvægtstråd, som vi abstraherer. Dhaga-klassen er afledt af greenlets og bruger stack switching til at udføre flere kodeflows i en enkelt tråd til operativsystemet. Tråde i ét operativsystem udfører flere dhagaser ved hjælp af samarbejdsplanlægning. Når en dhaga venter (primært venter på et RPC-kald), overgiver den kontrollen til forældre-niveauet (dvs. eksekveringskonteksten for den OS-tråd, der skabte den). Forældreniveauet planlægger derefter en anden dhaga, klar til at køre. RPC-kaldet vil blive sendt til tornado-webserveren for at skrive Socket asynkront, og derefter registrere et callback, når det vender tilbage, og når denne RPC vender tilbage, vil den ventende dhaga blive tilføjet til eksekverbare køen og derefter modtaget af forældretråden. (Banq-note: lignende node.js princip)

Vi kan bruge Dhaga i stedet for tråde til operationer med høj latenstid, og vi bruger 512 dhagas i en enkelt tråd, når antallet af tråde overstiger en rimelig grænse for gennemstrømning.







Tidligere:MVC-rammemønsteret er dødt
Næste:Fordele og ulemper ved MVC-frameworks:
Opslået på 07/12/2014 17.22.55 |
At læse og skrive tilbage er en dyd
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com