Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Alexey Naidenov, uitvoerende hoof ITooLabs, praat oor die ontwikkeling van 'n telekommunikasieplatform vir telekommunikasie-operateurs in die programmeertaal Go (Golang). Alexey deel ook sy ervaring van die ontplooiing en bedryf van die platform in een van die grootste Asiatiese telekommunikasie-operateurs, wat die platform gebruik het om stempos (VoiceMail) en Virtual PBX (Cloud PBX) dienste te verskaf.

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Alexey Naydenov (hierna - AN): - Hi almal! My naam is Alexey Naidenov. Ek is die direkteur van ITooLabs. Eerstens wil ek graag antwoord wat ek hier doen en hoe ek hier beland het.

As jy na die Bitrix24 Marketplace (afdeling "Telefonie") kyk, dan is 14 toepassings en 36 wat daar is (40%) ons:

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Meer presies, dit is ons vennoot-operateurs, maar agter dit alles is ons platform (Platform as a Service) - wat ons vir 'n klein sent aan hulle verkoop. Eintlik wil ek praat oor die ontwikkeling van hierdie platform en hoe ons by Go gekom het.

Die nommers vir ons platform is nou:

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

44 vennootoperateurs, insluitend MegaFon. Oor die algemeen hou ons daarvan om op avonture te gaan, en ons het eintlik toegang tot 100 miljoen intekenare van 44 operateurs hier in Rusland. Daarom, as iemand 'n paar sake-idees het, luister ons altyd graag na hulle.

  • 5000 gebruikersmaatskappye.
  • 20 000 intekenare in totaal. Dit is alles b2b - ons werk net met maatskappye.
  • 300 oproepe per minuut gedurende die dag.
  • 100 miljoen oproepminute verlede jaar (ons het gevier). Dit is sonder inagneming van die interne onderhandelinge wat op ons platform is.

Hoe het dit begin?

Hoe begin die regte ouens hul eie platform maak? Ons moet ook in ag neem dat ons 'n geskiedenis van "harde onderneming" ontwikkeling gehad het, en selfs op die mees akkurate tyd van die jaar vir 'n onderneming! Dit was daardie gelukkige tyd wanneer jy na die kliënt kom en sê: "Ons het nog 'n paar bedieners nodig." En die klant: “Ja, geen twyfel nie! Ons het 'n tien in die rek.

So ons het Oracle, Java, WebSphere, Db2 en dit alles gedoen. Daarom het ons natuurlik die beste verskaffer-oplossings geneem, dit geïntegreer en daarmee probeer opstyg. Hulle het op hul eie gespeel. Dit sou so 'n interne opstart wees.

Dit het alles in 2009 begin. Sedert 2006 is ons op die een of ander manier nou betrokke by operateursbesluite. Ons het verskeie persoonlike virtuele PBX's gemaak (soos wat ons nou op bestelling het): ons het gekyk, besluit dat dit goed is, en besluit om 'n interne opstart aan te wakker.

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Neem VMWare. Aangesien ons op ons eie gestap het, moes ons dadelik die cool verkoper Storage laat vaar. Ons weet alles van hulle: dat beloftes gedeel moet word deur 3, en die koste moet vermenigvuldig word met 10. Daarom het ons DirDB en so aan gedoen.

Toe het dit begin groei. Die rekeningdiens is hierby gevoeg, omdat die platform dit nie meer kon hanteer nie. Toe het die faktuurbediener van MySQL na Mongo verskuif. As gevolg hiervan het ons 'n werkende oplossing gekry wat al die oproepe verwerk wat daarheen gaan:

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Maar iewers binne draai dieselfde verskafferproduk – die hoof, kernkrag een, wat ons eens geneem het. Ongeveer teen die einde van 2011 het ons self besef dat die belangrikste bottelnek vir ons natuurlik hierdie spesifieke produk sal wees - ons sal dit raakloop. Ons het 'n muur voor ons gesien, waarin ons op volle galop gehardloop het, soos klante gestap het, is bygevoeg.
Gevolglik moes ons iets doen. Ons het natuurlik baie navorsing gedoen oor verskeie produkte – beide oopbron- en verskaffers. Ek sal nie nou hieroor uitwei nie – dit is nie die punt nie. Die heel laaste terugval waaraan ons gedink het, was om ons eie platform te maak.

Uiteindelik het ons by hierdie opsie uitgekom. Hoekom? Omdat alle verskaffer en oopbronprodukte 10 jaar gelede gemaak is om probleme op te los. Wel, as 'n 10-jarige, en 'n paar meer! Die keuse het vir ons voor die hand liggend geword: óf ons neem afskeid van ons wonderlike idee van 'n ideale diens (vir vennote, operateurs en onsself), óf ons doen iets van ons eie.

Ons het besluit om iets anders te doen!

Platformvereistes

As jy iets lank doen (jy buit iemand anders se produk uit), dan vorm die gedagte stadig in jou kop: hoe sal ek dit self doen? Aangesien ons almal programmeerders in die maatskappy is (behalwe vir verkopers, is daar geen nie-programmeerders nie), is ons vereistes vir 'n lang tyd gevorm, en dit was duidelik:

  1. Hoë ontwikkelingspoed. Die verkoper se produk, wat ons gekwel het, het ons in die eerste plek nie gepas nie, want alles het lank en stadig uitgewerk. Ons wou vinnig – ons het baie idees gehad! Ons het nog baie idees, maar toe was die lys idees so dat dit gelyk het of dit tien jaar vooruit was. Nou net vir 'n jaar.
  2. Maksimum benutting van meerkern yster. Dit was ook vir ons belangrik, want ons het gesien daar gaan net meer en meer kerne wees.
  3. Hoë betroubaarheid. Die een wat ons ook gehuil het.
  4. Hoë fouttoleransie.
  5. Ons wou eindig met 'n daaglikse vrystellingsproses. Om dit te doen, het ons 'n keuse van taal nodig gehad.

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Gevolglik, uit die vereistes vir die produk wat ons vir onsself voorgehou het, groei die vereistes vir die taal op 'n duidelik logiese manier.

  1. As ons ondersteuning vir multi-kern stelsels wil hê, dan het ons ondersteuning nodig vir parallelle uitvoering.
  2. As ons ontwikkelingspoed nodig het, het ons 'n taal nodig wat mededingende ontwikkeling, mededingende programmering ondersteun. As iemand nie die verskil teëgekom het nie, dan is dit baie eenvoudig:
    • parallelle programmering gaan oor hoe twee verskillende drade op verskillende kerns loop;
    • gelyktydige uitvoering, meer spesifiek gelyktydige ondersteuning, gaan oor hoe die taal (of looptyd, wat ook al) help om al die kompleksiteit wat uit parallelle uitvoering kom, te verberg.
  3. Hoë stabiliteit. Dit is duidelik dat ons 'n groepie nodig gehad het, en dit was beter as wat ons op die verkoperproduk gehad het.

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Ons het nie regtig baie opsies gehad nie, as jy onthou. Eerstens, Erlang - ons is mal daaroor en weet dit, dit was my persoonlike, persoonlike gunsteling. Tweedens is Java nie eers Java nie, maar spesifiek Scala. Derdens die taal wat ons destyds glad nie geken het nie – Gaan. Dit het toe pas verskyn, meer presies, dit het reeds sowat twee jaar bestaan, maar was nog nie vrygestel nie.

Verslaan Go!

Geskiedenis van Go

Ons het 'n platform daarop gemaak. Ek sal probeer verduidelik hoekom.

'n Kort geskiedenis van Go. Begin in 2007, geopen in 2009, die eerste weergawe is vrygestel in 2012 (dit wil sê, ons het begin werk selfs voor die eerste vrystelling). Die inisieerder was Google, wat, soos ek vermoed, Java wou vervang.

Die skrywers is baie bekend:

  • Ken Thomson, wat agter Unix was, het UTF-8 uitgevind, aan die Plan 9-stelsel gewerk;
  • Rob Pike, wat UTF-8 saam met Ken ontwerp het, het ook aan Plan 9, Inferno, Limbo by Bell Labs gewerk;
  • Robert Gizmer, wat ons ken en liefhet vir die uitvind van die Java HotSpot Compiler en vir die werk aan die kragopwekker in V8 (Google se Javascript-tolk);
  • En meer as 700 bydraers, insluitend sommige van ons pleisters.

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Gaan met 'n oogopslag

Ons sien dat die taal min of meer eenvoudig en verstaanbaar is. Ons het ooglopende tipes: in sommige gevalle moet hulle verklaar word, in ander nie (wat beteken dat die tipes in elk geval afgelei word).

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Dit kan gesien word dat dit modieus is om strukture te beskryf. Dit kan gesien word dat ons die konsep van 'n wyser het (waar die asterisk is). Dit kan gesien word dat daar spesiale ondersteuning is vir die verklaring van inisialisering van skikkings en assosiatiewe skikkings.

Ongeveer verstaanbaar - jy kan lewe. Probeer om Hallo, wêreld te skryf:

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Wat sien ons? Dit is C-agtige sintaksis, die kommapunt is opsioneel. Dit kan 'n skeiding vir twee lyne wees, maar slegs as dit twee konstrukte is wat presies op dieselfde lyn is.

Ons sien dat die hakies in die beheerstrukture (op die 14de reël) opsioneel is, maar krulleriges word altyd vereis. Ons sien dat die tik staties is. Tim word in die meeste gevalle vertoon. Hierdie voorbeeld is effens meer ingewikkeld as die gewone Hallo, wêreld - net om te wys dat daar 'n biblioteek is.

Wat anders sien ons belangrik? Die kode is in pakkette georganiseer. En om die pakket in jou eie kode te gebruik, moet jy dit invoer deur die invoerriglyn te gebruik - dit is ook belangrik. Ons begin - dit werk. Puik!

Kom ons probeer iets meer ingewikkeld: Hallo, wêreld, maar nou is dit 'n http-bediener. Wat sien ons interessant hier?

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

Eerstens dien die funksie as 'n parameter. Dit beteken dat die funksie wat ons het 'n "eersteklas burger" is en jy kan baie interessante dinge in 'n funksionele styl daarmee doen. Ons sien die onverwagte volgende: die invoervoorskrif verwys direk na die GitHub-bewaarplek. Dis reg, dit is hoe dit is – bowendien, dit is hoe dit gedoen moet word.

In Go is 'n pakket se universele identifiseerder die url van sy bewaarplek. Daar is 'n spesiale Goget-nutsding wat vir al die afhanklikhede geld, dit aflaai, installeer, saamstel en voorberei vir gebruik indien nodig. Terselfdertyd weet Goget van html-meta. Gevolglik kan jy 'n http-gids hou, wat skakels na jou spesifieke bewaarplek sal bevat (soos ons byvoorbeeld doen).

Wat sien ons nog? Http en Json in die gewone biblioteek. Daar is natuurlik introspeksie - refleksie, wat gebruik moet word in enkodering / json, want ons vervang eenvoudig een of ander arbitrêre voorwerp daarvoor.

Ons hardloop dit en sien dat ons 20 reëls nuttige kode het wat die huidige gemiddelde las van die masjien (op die masjien waarop dit loop) saamstel, hardloop en gee.
Wat anders is belangrik uit wat ons dadelik hier kan sien? Dit word saamgestel in een statiese binêre (buinêr). Hierdie binêre het glad geen afhanklikhede nie, geen biblioteke nie! Dit kan na enige stelsel gekopieer word, hardloop dadelik, en dit sal werk.

Ons gaan aan.

Gaan: metodes en koppelvlakke

Go het metodes. U kan 'n metode vir enige pasgemaakte tipe verklaar. Boonop is dit nie noodwendig 'n struktuur nie, maar kan 'n alias van een of ander soort wees. Jy kan 'n alias vir N32 verklaar en metodes daarvoor skryf om iets nuttigs te doen.

En dit is hier waar ons vir die eerste keer in 'n stupor verval ... Dit blyk dat Go nie klasse as sodanig het nie. Diegene wat Go ken, kan sê dat daar tipe insluiting is, maar dit is heeltemal anders. Hoe gouer die ontwikkelaar ophou om daaraan te dink as erfenis, hoe beter. Daar is geen klasse in Go nie, en daar is ook geen erfenis nie.

Vraag! Wat het die geselskap van skrywers onder leiding van Google ons gegee om die kompleksiteit van die wêreld te vertoon? Ons het koppelvlakke gekry!

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

'n Interface is 'n spesiale tipe wat jou toelaat om eenvoudige metodes, metode-handtekeninge te skryf. Verder, enige tipe waarvoor hierdie metodes bestaan ​​(word uitgevoer) sal ooreenstem met hierdie koppelvlak. Dit beteken dat jy eenvoudig die ooreenstemmende funksie vir een tipe kan skryf, vir 'n ander (wat ooreenstem met daardie koppelvlaktipe). Verklaar dan 'n veranderlike van die tipe van hierdie koppelvlak en ken enige van hierdie voorwerpe daaraan toe.

Vir hardcore-aanhangers kan ek sê dat hierdie veranderlike eintlik twee wysers sal bevat: een na data, die ander na 'n spesiale beskrywingstabel wat spesifiek vir hierdie spesifieke tipe is, na die koppelvlak van hierdie tipe. Dit wil sê, die samesteller maak sulke tabelle van beskrywers ten tyde van die koppeling.

En daar is natuurlik rigtingwysers om in Go te verval. Die woord koppelvlak {} (met twee krulhakies) is 'n veranderlike wat jou in beginsel toelaat om na enige voorwerp te wys.
Tot dusver is alles in orde, alles is bekend. Niks verbasend nie.

Gaan: goroutines

Nou kom ons by dit waarin ons belangstel: liggewigprosesse - goroutines (goroutines) in Go-terminologie.

Alexey Naidenov. ITooLabs. Ontwikkelingsaak op Go (Golang) telefoonplatform. Deel 1

  1. Eerstens, hulle is regtig liggewig (minder as 2 Kb).
  2. Tweedens, die koste om so 'n goroutine te skep is weglaatbaar: jy kan 'n duisend daarvan per sekonde skep - niks sal gebeur nie.
  3. Hulle word bedien deur hul eie skeduleerder, wat eenvoudig beheer van een goroutine na 'n ander oordra.
  4. In hierdie geval word beheer in die volgende gevalle oorgedra:
    • as 'n go-stelling teëgekom word (as die goroutine die volgende goroutine begin);
    • as 'n blokkerende Invoer/Uit-oproep geaktiveer is;
    • as vullisversameling geaktiveer word;
    • as een of ander operasie met kanale begin word.

Dit wil sê, wanneer 'n Go-program op 'n rekenaar uitgevoer word, bespeur dit die aantal kerns in die stelsel, begin soveel drade as wat nodig is (hoeveel kerns is in die stelsel, of hoeveel jy dit aangesê het). Gevolglik sal die skeduleerder hierdie liggewig drade van uitvoering op al hierdie bedryfstelsel drade in elke kern laat loop.

Daar moet kennis geneem word dat dit die doeltreffendste manier is om yster te gebruik. Benewens wat ons gewys het, doen ons baie meer. Ons maak byvoorbeeld DPI-stelsels wat dit moontlik maak om 40 gigabit in een eenheid te bedien (afhangende van wat in hierdie lyne gebeur).

Daar, selfs voor Go, het ons presies dieselfde skema gebruik om hierdie rede: omdat dit jou toelaat om die ligging van die verwerker-kas te stoor, verminder die aantal OS-konteksskakelaars aansienlik (wat ook baie lank neem). Ek herhaal: dit is die doeltreffendste manier om yster te benut.

Hierdie eenvoudige voorbeeld van 21 reëls is 'n voorbeeld wat eenvoudig eggo-bediener doen. Let terselfdertyd daarop dat die diensfunksie uiters eenvoudig is, dit is lineêr. Daar is geen terugbelle nie, nie nodig om te pla en dink nie... Jy lees en skryf net!

Terselfdertyd, as jy lees en skryf, moet dit eintlik blokkeer - hierdie goroutine word eenvoudig in die tou geplaas en deur die skeduleerder geneem wanneer uitvoering weer moontlik word. Dit wil sê, hierdie eenvoudige kode kan as 'n eggo-bediener optree vir soveel verbindings as wat die bedryfstelsel op hierdie masjien toelaat.

Word binnekort vervolg...

Sommige advertensies 🙂

Dankie dat jy by ons gebly het. Hou jy van ons artikels? Wil jy meer interessante inhoud sien? Ondersteun ons deur 'n bestelling te plaas of by vriende aan te beveel, wolk VPS vir ontwikkelaars vanaf $4.99, 'n unieke analoog van intreevlakbedieners, wat deur ons vir jou uitgevind is: Die hele waarheid oor VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps vanaf $19 of hoe om 'n bediener te deel? (beskikbaar met RAID1 en RAID10, tot 24 kerne en tot 40 GB DDR4).

Dell R730xd 2x goedkoper in Equinix Tier IV-datasentrum in Amsterdam? Net hier 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV vanaf $199 in Nederland! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - vanaf $99! Lees van Hoe om infrastruktuur korp. klas met die gebruik van Dell R730xd E5-2650 v4-bedieners ter waarde van 9000 XNUMX euro vir 'n sent?

Bron: will.com

Voeg 'n opmerking