Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Alexey Naidenov, CEO ITooLabs, flet për zhvillimin e një platforme telekomunikacioni për operatorët e telekomit në gjuhën e programimit Go (Golang). Alexey gjithashtu ndan përvojën e tij të vendosjes dhe funksionimit të platformës në një nga operatorët më të mëdhenj të telekomit aziatik, i cili përdori platformën për të ofruar shërbime të postës zanore (VoiceMail) dhe Virtual PBX (Cloud PBX).

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Alexey Naydenov (në tekstin e mëtejmë - AN): - Pershendetje te gjitheve! Emri im është Alexey Naidenov. Unë jam drejtor i ITooLabs. Fillimisht do të doja të përgjigjem se çfarë po bëj këtu dhe si përfundova këtu.

Nëse shikoni Tregun Bitrix24 (seksioni "Telefonia"), atëherë 14 aplikacione dhe 36 që janë atje (40%) jemi ne:

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Më saktësisht, këta janë operatorët tanë partnerë, por pas gjithë kësaj qëndron platforma jonë (Platforma si Shërbim) - ajo që ne u shesim atyre për një qindarkë të vogël. Në fakt, do të doja të flisja për zhvillimin e kësaj platforme dhe si arritëm në Go.

Numrat për platformën tonë tani janë:

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

44 operatorë partnerë, përfshirë MegaFon. Në përgjithësi, ne na pëlqen të shkojmë në aventura dhe në fakt kemi akses në 100 milionë abonentë të 44 operatorëve këtu në Rusi. Prandaj, nëse dikush ka disa ide biznesi, ne jemi gjithmonë të lumtur t'i dëgjojmë ato.

  • 5000 kompani përdoruese.
  • 20 abonentë në total. Është e gjitha b000b - ne punojmë vetëm me kompani.
  • 300 thirrje në minutë gjatë ditës.
  • 100 milionë minuta telefonata vitin e kaluar (e festuam). Kjo pa marrë parasysh negociatat e brendshme që janë në platformën tonë.

Si filloi?

Si fillojnë djemtë e duhur të bëjnë platformën e tyre? Gjithashtu duhet pasur parasysh se kemi pasur një histori të zhvillimit të “ndërmarrjeve të forta” dhe madje në periudhën më të saktë të vitit për një sipërmarrje! Ishte ajo momenti i lumtur kur ju vini te klienti dhe i thoni: "Ne kemi nevojë për disa serverë të tjerë." Dhe klienti: “Po, pa dyshim! Ne kemi një dhjetë në raft.

Pra, ne bëmë Oracle, Java, WebSphere, Db2 dhe të gjitha këto. Prandaj, ne morëm, natyrisht, zgjidhjet më të mira të shitësve, i integruam ato dhe u përpoqëm të hiqnim dorë me të. Ata luajtën vetë. Do të ishte një startup i tillë i brendshëm.

Gjithçka filloi në vitin 2009. Që nga viti 2006, ne jemi përfshirë ngushtë në vendimet e operatorëve, në një mënyrë apo në një tjetër. Ne bëmë disa PBX virtuale me porosi (si ato që kemi tani me porosi): shikuam, vendosëm se ishte mirë dhe vendosëm të nxisnim një startup të brendshëm.

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Merrni VMWare. Meqenëse po ecnim vetë, na u desh të braktisnim menjëherë shitësin e lezetshëm Storage. Ne dimë gjithçka rreth tyre: që premtimet duhet të ndahen me 3, dhe kostoja duhet të shumëzohet me 10. Prandaj, ne bëmë DirDB e kështu me radhë.

Pastaj filloi të rritet. Kësaj iu shtua edhe shërbimi i faturimit, sepse platforma nuk e përballonte dot më. Pastaj serveri i faturimit nga MySQL u zhvendos në Mongo. Si rezultat, ne morëm një zgjidhje pune që përpunon të gjitha thirrjet që shkojnë atje:

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Por diku brenda, i njëjti produkt shitës po rrotullohet - ai kryesor, bërthamor, të cilin ne dikur e merrnim. Përafërsisht deri në fund të vitit 2011, ne e kuptuam vetë se pengesa kryesore për ne, natyrisht, do të jetë ky produkt i veçantë - ne do të hasim në të. Ne pamë një mur para nesh, në të cilin vrapuam me galop të plotë, ndërsa klientët ecnin, u shtuan.
Prandaj, ne duhej të bënim diçka. Sigurisht, ne bëmë mjaft kërkime për produkte të ndryshme - si ato me burim të hapur ashtu edhe ato të shitësve. Nuk do të ndalem në këtë tani - kjo nuk është çështja. Rikthimi i fundit për të cilin menduam ishte krijimi i platformës sonë.

Në fund të fundit, arritëm te ky opsion. Pse? Sepse të gjithë shitësit dhe produktet me burim të hapur u krijuan për të zgjidhur problemet 10 vjet më parë. Epo, nëse një 10-vjeçar, dhe disa më shumë! Zgjedhja është bërë e qartë për ne: ose i themi lamtumirë idesë sonë të shkëlqyer për një shërbim ideal (për partnerët, operatorët dhe veten tonë), ose bëjmë diçka tonën.

Ne vendosëm të bëjmë diçka ndryshe!

Kërkesat e platformës

Nëse bëni diçka për një kohë të gjatë (shfrytëzoni produktin e dikujt tjetër), atëherë në kokën tuaj formohet ngadalë mendimi: si do ta bëja vetë? Meqenëse ne jemi të gjithë programues në kompani (përveç shitësve, nuk ka joprogramues), kërkesat tona janë formuar për një kohë të gjatë, dhe ato ishin të qarta:

  1. Shpejtësi e lartë zhvillimi. Produkti i shitësit, i cili na mundonte, nuk na përshtatej në radhë të parë sepse gjithçka funksionoi për një kohë të gjatë dhe ngadalë. Ne donim shpejt - kishim shumë ide! Kemi ende shumë ide, por atëherë lista e ideve ishte e tillë që dukej si dhjetë vjet përpara. Tani vetëm për një vit.
  2. Përdorimi maksimal i hekurit me shumë bërthama. Kjo ishte gjithashtu e rëndësishme për ne, sepse pamë që do të kishte vetëm gjithnjë e më shumë bërthama.
  3. Besueshmëri e lartë. Ai që edhe ne qamë.
  4. Tolerancë e lartë ndaj gabimeve.
  5. Ne donim të përfundonim me një proces lëshimi të përditshëm. Për ta bërë këtë, na duhej një zgjedhje e gjuhës.

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Prandaj, nga kërkesat për produktin që kemi paraqitur për veten tonë, kërkesat për gjuhën rriten në një mënyrë qartësisht logjike.

  1. Nëse duam mbështetje për sistemet me shumë bërthama, atëherë kemi nevojë për mbështetje për ekzekutimin paralel.
  2. Nëse kemi nevojë për shpejtësi zhvillimi, na duhet një gjuhë që mbështet zhvillimin konkurrues, programimin konkurrues. Nëse dikush nuk e ka hasur ndryshimin, atëherë është shumë e thjeshtë:
    • programimi paralel ka të bëjë me mënyrën se si funksionojnë dy fije të ndryshme në bërthama të ndryshme;
    • ekzekutimi i njëkohshëm, më konkretisht mbështetja e konkurencës, ka të bëjë me mënyrën se si gjuha (ose koha e ekzekutimit, çfarëdo qoftë) ndihmon në fshehjen e të gjithë kompleksitetit që vjen nga ekzekutimi paralel.
  3. Stabilitet i lartë. Natyrisht, ne kishim nevojë për një grup dhe ishte më mirë se ajo që kishim në produktin e shitësit.

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Ne nuk kishim shumë mundësi, nëse ju kujtohet. Së pari, Erlang - ne e duam dhe e dimë, ishte i preferuari im personal, personal. Së dyti, Java nuk është as Java, por konkretisht Scala. Së treti, gjuha që në atë kohë nuk e dinim fare - Shko. Sapo ishte shfaqur atëherë, më saktë, kishte rreth dy vjet që ekzistonte, por ende nuk ishte lëshuar.

I mundur Go!

Historia e Go

Ne bëmë një platformë mbi të. Do të përpiqem të shpjegoj pse.

Një histori e shkurtër e Go. Filloi në 2007, u hap në 2009, versioni i parë u lëshua në 2012 (d.m.th., ne filluam të punojmë edhe para publikimit të parë). Iniciatori ishte Google, i cili donte të zëvendësonte, siç dyshoj, Java.

Autorët janë shumë të famshëm:

  • Ken Thomson, i cili ishte pas Unix, shpiku UTF-8, punoi në sistemin Plan 9;
  • Rob Pike, i cili projektoi UTF-8 me Ken, gjithashtu punoi në Planin 9, Inferno, Limbo në Bell Labs;
  • Robert Gizmer, të cilin ne e njohim dhe e duam për shpikjen e përpiluesit Java HotSpot dhe për punën në gjeneratorin në V8 (përkthyesi Javascript i Google);
  • Dhe mbi 700 kontribues, duke përfshirë disa nga arnimet tona.

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Shkoni me një shikim

Shohim që gjuha është pak a shumë e thjeshtë dhe e kuptueshme. Kemi lloje të dukshme: në disa raste ato duhet të deklarohen, në të tjera jo (që do të thotë se llojet gjithsesi konkludohen).

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Mund të shihet se është në modë të përshkruhen strukturat. Mund të shihet se kemi konceptin e një treguesi (ku është ylli). Mund të shihet se ka mbështetje të veçantë për deklarimin e inicializimit të vargjeve dhe vargjeve asociative.

Përafërsisht e kuptueshme - ju mund të jetoni. Duke u përpjekur të shkruaj përshëndetje, botë:

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Çfarë shohim? Kjo është sintaksë e ngjashme me C-në, pikëpresja është opsionale. Mund të jetë një ndarës për dy rreshta, por vetëm nëse këto janë dy konstruksione që janë saktësisht në të njëjtën linjë.

Ne shohim që kllapat në strukturat e kontrollit (në rreshtin e 14-të) janë opsionale, por ato kaçurrela kërkohen gjithmonë. Ne shohim që shtypja është statike. Koha në shumicën e rasteve shfaqet. Ky shembull është pak më i komplikuar se i zakonshmi Hello, world - vetëm për të treguar se ekziston një bibliotekë.

Çfarë tjetër shohim të rëndësishme? Kodi është i organizuar në paketa. Dhe për të përdorur paketën në kodin tuaj, duhet ta importoni duke përdorur direktivën e importit - kjo është gjithashtu e rëndësishme. Ne fillojmë - funksionon. E shkëlqyeshme!

Le të provojmë diçka më të komplikuar: Përshëndetje, botë, por tani është një server http. Çfarë shohim interesante këtu?

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Së pari, funksioni vepron si një parametër. Kjo do të thotë që funksioni që kemi është një “qytetar i klasit të parë” dhe me të mund të bësh shumë gjëra interesante në një stil funksional. Ne shohim të papriturën në vijim: direktiva e importit i referohet drejtpërdrejt depove të GitHub. Ashtu është, kështu është - për më tepër, kështu duhet bërë.

Në Go, identifikuesi universal i paketës është url-ja e depove të saj. Ekziston një mjet i veçantë Goget që shkon për të gjitha varësitë, i shkarkon, i instalon, i përpilon dhe i përgatit për përdorim nëse është e nevojshme. Në të njëjtën kohë, Goget di për html-meta. Prandaj, ju mund të mbani një direktori http, e cila do të përmbajë lidhje me depon tuaj specifike (siç bëjmë ne, për shembull,).

Çfarë tjetër shohim? Http dhe Json në bibliotekën e rregullt. Ka, padyshim, introspeksion - reflektim, i cili duhet të përdoret në kodimin / json, sepse ne thjesht zëvendësojmë një objekt arbitrar për të.

E ekzekutojmë dhe shohim që kemi 20 rreshta kodi të dobishëm që përpilon, ekzekuton dhe jep ngarkesën mesatare aktuale të makinës (në makinën në të cilën po funksionon).
Çfarë tjetër është e rëndësishme nga ajo që mund të shohim menjëherë këtu? Ai përpilohet në një binar statik (buinary). Ky binar nuk ka fare varësi, nuk ka biblioteka! Mund të kopjohet në çdo sistem, të ekzekutohet menjëherë dhe do të funksionojë.

Ne vazhdojmë.

Shko: metodat dhe ndërfaqet

Go ka metoda. Ju mund të deklaroni një metodë për çdo lloj të personalizuar. Për më tepër, kjo nuk është domosdoshmërisht një strukturë, por mund të jetë një pseudonim i një lloji. Ju mund të deklaroni një pseudonim për N32 dhe të shkruani metoda që ai të bëjë diçka të dobishme.

Dhe këtu për herë të parë biem në hutim... Rezulton se Go nuk ka klasa si të tilla. Ata që e njohin Go mund të thonë se ka përfshirje të tipit, por kjo është krejtësisht ndryshe. Sa më shpejt që zhvilluesi të ndalojë së menduari për atë si trashëgimi, aq më mirë. Nuk ka klasa në Go, dhe nuk ka as trashëgimi.

Pyetje! Çfarë na dha kompania e autorëve e drejtuar nga Google për të shfaqur kompleksitetin e botës? Na janë dhënë ndërfaqe!

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

Një ndërfaqe është një lloj i veçantë që ju lejon të shkruani metoda të thjeshta, nënshkrime të metodave. Më tej, çdo lloj për të cilin ekzistojnë (ekzekutohen) këto metoda do të korrespondojë me këtë ndërfaqe. Kjo do të thotë që thjesht mund të shkruani funksionin përkatës për një lloj, për një tjetër (që korrespondon me atë lloj ndërfaqeje). Më pas, deklaroni një variabël të llojit të kësaj ndërfaqe dhe caktoni ndonjë nga këto objekte në të.

Për fansat e fortë, mund të them se kjo variabël do të përmbajë në të vërtetë dy tregues: një për të dhënat, tjetri për një tabelë të veçantë përshkruesi që është specifike për këtë lloj të veçantë, për ndërfaqen e këtij lloji. Kjo do të thotë, përpiluesi bën tabela të tilla të përshkruesve në momentin e lidhjes.

Dhe ka, sigurisht, tregues për të anuluar në Go. Fjala ndërfaqe {} (me dy kllapa kaçurrelë) është një variabël që ju lejon të tregoni në parim çdo objekt fare.
Deri më tani, gjithçka është në rregull, gjithçka është e njohur. Asgjë për t'u habitur.

Shko: gorutina

Tani kemi ardhur tek ajo që na intereson: procese të lehta - gorutina (goroutines) në terminologjinë Go.

Alexey Naidenov. ITooLabs. Kuti zhvillimi në platformën telefonike Go (Golang). Pjesa 1

  1. Së pari, ato janë vërtet të lehta (më pak se 2 Kb).
  2. Së dyti, kostoja e krijimit të një gorutine të tillë është e papërfillshme: mund të krijoni një mijë prej tyre në sekondë - asgjë nuk do të ndodhë.
  3. Ata shërbehen nga programuesi i tyre, i cili thjesht transferon kontrollin nga një gorutinë në tjetrën.
  4. Në këtë rast, kontrolli transferohet në rastet e mëposhtme:
    • nëse haset një deklaratë go (nëse gorutina fillon gorutinën tjetër);
    • nëse aktivizohet një thirrje hyrëse/dalëse bllokuese;
    • nëse nxitet mbledhja e mbeturinave;
    • nëse fillon një operacion me kanale.

Kjo do të thotë, sa herë që një program Go ekzekutohet në një kompjuter, ai zbulon numrin e bërthamave në sistem, fillon aq threads sa nevojitet (sa bërthama ka në sistem, ose sa i keni thënë). Prandaj, planifikuesi do të ekzekutojë këto fije të lehta të ekzekutimit në të gjitha këto fije të sistemit operativ në secilën bërthamë.

Duhet të theksohet se kjo është mënyra më efikase për të përdorur hekurin. Përveç asaj që kemi treguar, ne bëjmë shumë më tepër. Ne bëjmë, për shembull, sisteme DPI që lejojnë shërbimin e 40 gigabit në një njësi (në varësi të asaj që ndodh në këto rreshta).

Atje, edhe para Go, ne përdorëm saktësisht të njëjtën skemë për këtë arsye: sepse ju lejon të ruani lokalitetin e cache-it të procesorit, të zvogëloni ndjeshëm numrin e çelsave të kontekstit të OS (gjë që kërkon gjithashtu një kohë shumë të gjatë). E përsëris: kjo është mënyra më efektive për të shfrytëzuar hekurin.

Ky shembull i thjeshtë me 21 rreshta është një shembull që thjesht bën echo-server. Në të njëjtën kohë, vini re se funksioni i shërbimit është jashtëzakonisht i thjeshtë, është linear. Nuk ka kthim thirrje, nuk ka nevojë të shqetësoheni dhe të mendoni... Ju vetëm lexoni dhe shkruani!

Në të njëjtën kohë, nëse lexoni dhe shkruani, në fakt duhet të bllokohet - kjo gorutinë thjesht vendoset në radhë dhe merret nga planifikuesi kur ekzekutimi bëhet i mundur përsëri. Kjo do të thotë, ky kod i thjeshtë mund të veprojë si një server echo për aq shumë lidhje sa do të lejojë OS në këtë makinë.

Vazhdon shume shpejt...

Disa reklama 🙂

Faleminderit që qëndruat me ne. A ju pëlqejnë artikujt tanë? Dëshironi të shihni përmbajtje më interesante? Na mbështesni duke bërë një porosi ose duke rekomanduar miqve, cloud VPS për zhvilluesit nga 4.99 dollarë, një analog unik i serverëve të nivelit të hyrjes, i cili u shpik nga ne për ju: E gjithë e vërteta rreth VPS (KVM) E5-2697 v3 (6 bërthama) 10 GB DDR4 480 GB SSD 1 Gbps nga 19 dollarë ose si të ndani një server? (e disponueshme me RAID1 dhe RAID10, deri në 24 bërthama dhe deri në 40 GB DDR4).

Dell R730xd 2 herë më lirë në qendrën e të dhënave Equinix Tier IV në Amsterdam? Vetëm këtu 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV nga 199$ në Holandë! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - nga 99 dollarë! Lexoni rreth Si të ndërtohet korporata e infrastrukturës. klasë me përdorimin e serverëve Dell R730xd E5-2650 v4 me vlerë 9000 euro për një qindarkë?

Burimi: www.habr.com

Shto një koment