Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Aleksejus Naydenovas, generalinis direktorius ITooLabs, kalbama apie telekomunikacijų platformos kūrimą telekomunikacijų operatoriams Go (Golang) programavimo kalba. Aleksejus taip pat dalijasi savo patirtimi diegiant ir eksploatuojant platformą viename didžiausių Azijos telekomunikacijų operatorių, kuris naudojo platformą balso pašto paslaugoms (VoiceMail) ir virtualiam PBX (Cloud PBX) teikti.

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Aleksejus Naydenovas (toliau – AN): - Sveiki visi! Mano vardas Aleksejus Naydenovas. Esu ITooLabs direktorius. Pirmiausia norėčiau atsakyti, ką aš čia veikiu ir kaip čia atsidūriau.

Jei pažvelgsite į „Bitrix24“ prekyvietę (skyrius „Telefonija“), tada 14 programų ir 36 ten esančios programos (40%) esame mes:

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Tiksliau, tai yra mūsų operatoriai partneriai, bet už viso to slypi mūsų platforma (Platforma kaip paslauga) – tai, ką mes jiems parduodame už nedidelį centą. Tiesą sakant, norėčiau pakalbėti apie šios platformos kūrimą ir tai, kaip mes atėjome į „Go“.

Dabar mūsų platformos skaičiai:

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

44 operatorių partneriai, įskaitant „Megafon“. Apskritai, mes labai mėgstame leistis į įvairius nuotykius ir turime faktinę prieigą prie 100 milijonų abonentų iš 44 operatorių čia, Rusijoje. Todėl jei kas turi verslo idėjų, visada mielai jų išklausysime.

  • 5000 vartotojų įmonių.
  • Iš viso 20 000 prenumeratorių. Visa tai yra b2b – dirbame tik su įmonėmis.
  • 300 skambučių per minutę.
  • 100 milijonų pokalbių minučių pernai (šventėme). Čia neatsižvelgiama į vidines derybas, kurios pasiekiamos mūsų platformoje.

Kaip tai prasidėjo?

Kaip tinkami bičiuliai net pradeda kurti savo platformą? Taip pat turime atsižvelgti į tai, kad turime „kietosios įmonės“ plėtros istoriją ir net pačiu tiksliausiu metų laiku įmonei! Tai buvo tas laimingas laikas, kai ateini pas klientą ir sakai: „Mums reikia dar kelių serverių“. O klientas: „Jokių klausimų! Mes turime dešimt.

Taigi padarėme „Oracle“, „Java“, „WebSphere“, „Db2“ ir visa tai. Todėl, žinoma, ėmėmės geriausių pardavėjų sprendimų, juos integravome ir bandėme su jais pakilti. Vaikščiojome patys. Tai būtų toks vidinis startas.

Iš tikrųjų visa tai prasidėjo 2009 m. Nuo 2006 metų vienaip ar kitaip esame glaudžiai susiję su operatorių sprendimais. Sukūrėme kelis tinkintus virtualius PBX (pvz., tą, kurį dabar turime pagal užsakymą): pažiūrėjome, nusprendėme, kad jis geras, ir nusprendėme pradėti vidinį paleidimą.

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Mes paėmėme VMWare. Kadangi buvome vieni, turėjome nedelsdami atsisakyti šaunaus pardavėjo Storage. Mes apie juos žinome viską: kad pažadai turi būti padalyti iš 3, o kaštai turi būti dauginami iš 10. Todėl jie padarė DirDB ir pan.

Tada pradėjo augti. Prie to buvo pridėta atsiskaitymo paslauga, nes platforma nebegalėjo susidoroti. Tada atsiskaitymo serveris iš MySQL persikėlė į Mongo. Dėl to gavome veikiantį sprendimą, kuris apdoroja visus ten patenkančius skambučius:

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Bet kažkur viduje sukasi tas pats pardavėjo produktas – pagrindinis, branduolinis, kurį kažkada paėmėme. Maždaug 2011 m. pabaigoje supratome, kad pagrindinė kliūtis mums, žinoma, bus būtent šis produktas – mes su juo susidursime. Matėme priešais sieną, į kurią įbėgome visu šuoliu, nes vis atsirado klientų.
Atitinkamai, mums reikėjo kažką daryti. Žinoma, atlikome gana daug įvairių produktų tyrimų – tiek atvirojo kodo, tiek pardavėjų. Dabar apie tai nekalbėsiu – mes ne apie tai kalbame. Paskutinis atsarginis variantas, apie kurį galvojome, buvo sukurti savo platformą.

Galiausiai pasirinkome šią galimybę. Kodėl? Kadangi visi pardavėjų ir atvirojo kodo produktai buvo sukurti siekiant išspręsti 10 metų senumo problemas. Na, jei 10 metų ir dar daugiau! Pasirinkimas mums tapo akivaizdus: arba atsisveikiname su puikia idėja apie idealią paslaugą (partneriams, operatoriams ir sau), arba darome ką nors savo.

Mes nusprendėme padaryti kažką savo!

Platformos reikalavimai

Jei ką nors darai ilgą laiką (naudoji kažkieno gaminį), tada tavo galvoje pamažu sukasi mintis: kaip aš pats tai padaryčiau? Kadangi įmonėje visi esame programuotojai (išskyrus pardavėjus, neprogramuotojų nėra), mūsų reikalavimai susikūrė seniai ir buvo aiškūs:

  1. Didelis vystymosi greitis. Mus kankinusi pardavėjo prekė netenkino visų pirma todėl, kad viskas klostėsi ilgai ir lėtai. Norėjome greitai – turėjome daug idėjų! Idėjų dar turime daug, bet tada idėjų sąrašas buvo toks, kad atrodė, kad dešimčiai metų į priekį. Dabar tik metams.
  2. Maksimalus kelių branduolių geležies panaudojimas. Tai buvo svarbu ir mums, nes matėme, kad branduolių bus tik vis daugiau.
  3. Didelis patikimumas. Kažko su kuo mes taip pat verkėme.
  4. Didelis atsparumas gedimams.
  5. Norėjome užbaigti kasdienių leidimų procesą. Tam mums reikėjo kalbos pasirinkimo.

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Atitinkamai, iš reikalavimų gaminiui, kuriuos sau keliame, aiškiai logiškai išauga reikalavimai kalbai.

  1. Jei norime palaikyti kelių branduolių sistemas, mums reikia paramos lygiagrečiam vykdymui.
  2. Jei mums reikia kūrimo greičio, mums reikia kalbos, kuri palaiko konkurencingą plėtrą, konkurencingą programavimą. Jei kas nors nesusidūrė su skirtumu, tai labai paprasta:
    • Lygiagretusis programavimas yra apie tai, kaip dvi skirtingos gijos vykdomos skirtinguose branduoliuose;
    • Lygiagretus vykdymas, tiksliau, lygiagretumo palaikymas, yra apie tai, kaip kalba (arba vykdymo laikas, nesvarbu) padeda paslėpti visą sudėtingumą, atsirandantį dėl lygiagretaus vykdymo.
  3. Aukštas stabilumas. Akivaizdu, kad mums reikėjo klasterio ir geresnio nei pardavėjo gaminyje.

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Mes tikrai neturėjome tiek daug pasirinkimų, jei prisimenate. Pirma, Erlang - mes jį mylime ir žinome, tai buvo mano asmeninis, asmeninis mėgstamiausias. Antra, Java yra net ne Java, o konkrečiai Scala. Trečia, kalba, kurios tuo metu visai nemokėjome – eik. Jis tada tik pasirodė, tiksliau, jau egzistavo apie dvejus metus, bet dar nebuvo išleistas.

Eik laimėjo!

Go istorija

Ant jo padarėme platformą. Pabandysiu paaiškinti kodėl.

Trumpa „Go“ istorija. Ji prasidėjo 2007 m., atidaryta 2009 m., pirmoji versija buvo išleista 2012 m. (tai yra, pradėjome dirbti dar prieš pirmąjį leidimą). Iniciatorius buvo Google, kuri norėjo pakeisti, kaip įtariu, Java.

Autoriai yra labai žinomi:

  • Kenas Thomsonas, kuris buvo už Unix, išrado UTF-8, dirbo prie 9 plano sistemos;
  • Robas Pike'as, kuris kartu su Kenu išrado UTF-8, taip pat dirbo su „Plan 9“, „Inferno“, „Limbo“ „Bell Labs“;
  • Robertas Giesmeris, kurį pažįstame ir kurį mylime už „Java HotSpot“ kompiliatoriaus išradimą ir jo darbą su generatoriumi V8 („Google“ Javascript interpretatorius);
  • Ir daugiau nei 700 bendradarbių, įskaitant kai kuriuos mūsų pataisymus.

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Pirmyn: pirmas žvilgsnis

Matome, kad kalba daugiau ar mažiau paprasta ir suprantama. Turime akivaizdžius tipus: vienais atvejais juos reikia deklaruoti, kitais – nebūtina (tai reiškia, kad tipai vienaip ar kitaip išvedami).

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Matyti, kad madinga apibūdinti struktūras. Galima pastebėti, kad turime rodyklės sąvoką (kur yra žvaigždutė). Galima pastebėti, kad yra specialus palaikymas deklaruojant masyvų ir asociatyvinių masyvų inicijavimą.

Beveik aišku – tu gali gyventi. Pabandykime parašyti Sveiki, pasauli:

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Ką mes matome? Tai C tipo sintaksė, kabliataškis yra neprivalomas. Tai gali būti dviejų eilučių skyriklis, bet tik tuo atveju, jei tai dvi konstrukcijos, esančios toje pačioje eilutėje.

Matome, kad valdymo struktūrose (14-oje eilutėje) skliaustai yra neprivalomi, tačiau garbanotieji petnešos visada reikalingi. Matome, kad spausdinimas yra statinis. Timas dažniausiai išimamas. Šis pavyzdys yra šiek tiek sudėtingesnis nei įprastas Sveiki, pasauli – tik tam, kad parodytume, jog yra biblioteka.

Ką dar matome svarbaus? Kodas suskirstytas į paketus. Ir norėdami naudoti paketą savo kode, turite jį importuoti naudodami importo direktyvą - tai taip pat svarbu. Paleidžiame – veikia. Puiku!

Toliau pabandykime ką nors sudėtingesnio: Sveiki, pasauli, bet tik dabar tai yra http serveris. Ką čia įdomaus matome?

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Pirma, funkcija veikia kaip parametras. Tai reiškia, kad mūsų funkcija yra „pirmos klasės pilietis“ ir su ja funkcionaliai galite nuveikti daug įdomių dalykų. Toliau matome kažką netikėto: importo direktyva tiesiogiai susieja su „GitHub“ saugykla. Teisingai, taip yra – be to, taip ir reikia daryti.

„Go“ universalus paketo identifikatorius yra jo saugyklos URL. Yra speciali „Goget“ programa, kuri paims visas priklausomybes, jas atsisiųs, įdiegs, sukompiliuos ir prireikus paruoš naudojimui. Tuo pačiu metu Goget žino apie html-meta. Atitinkamai galite laikyti http katalogą, kuriame bus nuorodos į jūsų konkrečią saugyklą (kaip, pavyzdžiui, darome mes).

Ką dar matome? Http ir Json standartinėje bibliotekoje. Akivaizdu, kad yra introspekcija – refleksija, kuri turėtų būti naudojama koduojant/json, nes mes tiesiog ją pakeičiame kokiu nors savavališku objektu.

Paleidžiame jį ir matome, kad turime naudingą 20 eilučių kodą, kuris sukompiliuoja, paleidžia ir praneša apie esamą vidutinę mašinos apkrovą (mašinoje, kurioje ji paleidžiama).
Ką dar svarbaus čia galime pamatyti iškart? Jis sukompiliuojamas į vieną statinį dvejetainį (buinary). Šis dvejetainis failas neturi jokių priklausomybių, neturi bibliotekų! Galite nukopijuoti jį į bet kurią sistemą, nedelsiant paleisti ir jis veiks.

Toliau.

Eiti: metodai ir sąsajos

Go turi metodus. Galite deklaruoti bet kurio pasirinktinio tipo metodą. Be to, tai nebūtinai struktūra, o galbūt tam tikro tipo slapyvardis. Galite paskelbti N32 slapyvardį ir parašyti metodus, kad jis padarytų ką nors naudingo.

Ir čia mes pirmą kartą patenkame į stuporą... Pasirodo, Go neturi užsiėmimų kaip tokių. Tie, kurie žino Go, gali pasakyti, kad yra tipo įtraukimas, bet tai visai kas kita. Kuo anksčiau kūrėjas nustos galvoti apie tai kaip apie paveldėjimą, tuo geriau. „Go“ nėra klasių, taip pat nėra ir paveldėjimo.

Klausimas! Ką mums davė „Google“ vadovaujama autorių kompanija, kad atspindėtų pasaulio sudėtingumą? Jie suteikė mums sąsajas!

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

Sąsaja yra specialus tipas, leidžiantis rašyti tiesiog metodus, metodų parašus. Be to, bet koks tipas, kuriam šie metodai egzistuoja (vykdomi), atitiks šią sąsają. Tai reiškia, kad galite tiesiog apibūdinti atitinkamą funkciją vienam tipui, kitam (kuri atitinka tą sąsajos tipą). Tada deklaruokite šios sąsajos tipo kintamąjį ir priskirkite jam bet kurį iš šių objektų.

Užkietėjusiems gerbėjams galiu pasakyti, kad šis kintamasis iš tikrųjų turės dvi nuorodas: vieną į duomenis, kitą į specialią deskriptorių lentelę, būdingą šiam konkrečiam tipui, tokio tipo sąsajai. Tai yra, kompiliatorius sukuria tokias deskriptorių lenteles susiejimo metu.

Ir Go, žinoma, yra nuorodų, kurios negalioja. Žodžio sąsaja {} (su dviem riestiniais skliaustais) yra kintamasis, leidžiantis iš esmės nurodyti bet kurį objektą.
Kol kas viskas gerai, viskas pažįstama. Nieko stebėtino.

Eiti: gorutinos

Dabar pereiname prie to, kas mus domina: lengvi procesai – gorutinos (goroutines) Go terminologijoje.

Aleksejus Naydenovas. ITooLabs. „Go“ (Golang) telefono platformos kūrimo atvejis. 1 dalis

  1. Pirma, jie yra tikrai lengvi (mažiau nei 2 KB).
  2. Antra, tokios gorutinos sukūrimo išlaidos yra nereikšmingos: galite jų sukurti tūkstantį per sekundę – nieko neatsitiks.
  3. Juos aptarnauja jų pačių planuotojas, kuris tiesiog perkelia valdymą iš vienos gorutinos į kitą.
  4. Tokiu atveju valdymas perduodamas šiais atvejais:
    • jei susiduriama su eiti išraiška (jei gorutina pradeda kitą gorutiną);
    • jei įjungtas blokuojantis įvesties/išvesties skambutis;
    • jei pradedama rinkti šiukšles;
    • jei pradedama kokia nors operacija su kanalais.

Tai yra, kai kompiuteryje veikia Go programa, ji nustato branduolių skaičių sistemoje, paleidžia tiek gijų, kiek reikia (kiek branduolių yra sistemoje arba kiek jūs jai pasakėte). Atitinkamai, planuotojas vykdys šias lengvas vykdymo gijas visose šiose operacinės sistemos gijose kiekviename branduolyje.

Reikėtų pažymėti, kad tai yra veiksmingiausias geležies panaudojimo būdas. Be to, kas rodoma, mes darome daug daugiau. Gaminame, pavyzdžiui, DPI sistemas, kurios leidžia vienam įrenginiui aptarnauti 40 gigabitų (priklausomai nuo to, kas vyksta šiose linijose).

Ten dar prieš Go naudojome lygiai tokią pačią schemą būtent dėl ​​šios priežasties: nes ji leidžia išsaugoti procesoriaus talpyklos lokaciją ir žymiai sumažinti OS kontekstinių jungiklių skaičių (o tai irgi užima daug laiko). Kartoju: tai yra veiksmingiausias būdas panaudoti geležį.

Šis paprastas 21 eilutės pavyzdys yra pavyzdys, kuris tiesiog atlieka echo-serverį. Atkreipkite dėmesį, kad aptarnavimo funkcija yra labai paprasta, ji yra linijinė. Nėra jokių atšaukimų, nereikia vargti ir galvoti... Tu tik skaityk ir rašyk!

Tuo pačiu metu, jei skaitote ir rašote, ji iš tikrųjų turėtų blokuoti – ši gorutina tiesiog įtraukiama į eilę ir paimama planuotojo, kai vėl tampa įmanoma vykdyti. Tai yra, šis paprastas kodas gali veikti kaip aido serveris tiek jungčių, kiek leidžia to įrenginio OS.

Tęsinys bus labai greitai...

Kai kurie skelbimai 🙂

Dėkojame, kad likote su mumis. Ar jums patinka mūsų straipsniai? Norite pamatyti įdomesnio turinio? Palaikykite mus pateikdami užsakymą ar rekomenduodami draugams, debesies VPS kūrėjams nuo 4.99 USD, unikalus pradinio lygio serverių analogas, kurį mes sugalvojome jums: Visa tiesa apie VPS (KVM) E5-2697 v3 (6 branduoliai) 10GB DDR4 480GB SSD 1Gbps nuo 19$ arba kaip dalintis serveriu? (galima su RAID1 ir RAID10, iki 24 branduolių ir iki 40 GB DDR4).

„Dell R730xd“ 2 kartus pigiau „Equinix Tier IV“ duomenų centre Amsterdame? Tik čia 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 televizoriai nuo 199 USD Olandijoje! „Dell R420“ – 2 x E5-2430 2.2 GHz 6C 128 GB DDR3 2 x 960 GB SSD 1 Gbps 100 TB – nuo ​​99 USD! Skaityti apie Kaip sukurti infrastruktūros korp. klasę naudojant Dell R730xd E5-2650 v4 serverius, kurių vertė 9000 eurų už centą?

Šaltinis: www.habr.com

Добавить комментарий