Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Aleksandr Naidjonov, tegevjuht ITooLabs, rÀÀgib sideplatvormi arendamisest telekommunikatsiooni operaatoritele Go (Golang) programmeerimiskeeles. Aleksandr jagab ka kogemusi platvormi juurutamisest ja kasutamisest ĂŒhes Aasia suurimaid telekommunikatsiooni operaatoreid, kes kasutas platvormi hÀÀlsĂ”numite (VoiceMail) ja Virtuaalse PBX (Cloud PBX) teenuste pakkumiseks.

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Aleksandr Naidjonov (edaspidi – AN): – Tere kĂ”igile! Minu nimi on Aleksandr Naidjonov. Olen ITooLabsi direktor. Esiteks tahaksin vastata, mida ma siin teen ja kuidas ma siia sattusin.

Kui vaatate Bitrix24 turuosa (jaotises „Telefonia”), siis 14 rakendust ja 36, mis seal on (40%) – see oleme meie:

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

TĂ€psemalt öeldes on need meie partner- operaatorid, kuid kogu selle taga on meie platvorm (Platform as a Service) – see, mida me neile vĂ€ikese tasu eest mĂŒĂŒme. Just platvormi arendamisest ja sellest, kuidas me Go-sse jĂ”udsime, tahaksin rÀÀkida.

Numbrid meie platvormi kohta praegu:

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

44 operaatorpartnerit, sealhulgas «MegaFon». Me oleme ĂŒldiselt vĂ€ga avatud uutele seiklustele ja meil on tegelik juurdepÀÀs 100 miljonile abonendile 44 operaatorilt siin Venemaal. SeetĂ”ttu, kui kellelgi on Ă€riideid, oleme alati valmis kuulama.

  • 5000 kasutajafirmat.
  • Kokku 20 000 abonenti. KĂ”ik see on B2B – me töötame ainult ettevĂ”tetega.
  • 300 kĂ”net minutis pĂ€evasel ajal.
  • Eelmisel aastal 100 miljonit kĂ”netundi (me tĂ€histasime seda). See ei arvestanud meie platvormil toimuvaid siseseid kĂ”nesid.

Kuidas see kÔik algas?

Kuidas Ă”iged tĂŒĂŒbid oma platvormi looma hakkavad? Tuleb arvestada, et meie ajaloos oli ka 'hardsell-ettevĂ”tte' arendus, ja veel Ă”igeaegselt ettevĂ”tte jaoks! See oli see Ă”nnelik aeg, kus lĂ€hed kliendi juurde ja ĂŒtled: 'Vajame veel paar serverit.' Ja klient: 'Pole probleemi! Meil on rack'is kĂŒmneid.'

SeetÔttu tegelesime Oracle'i, Java, WebSphere'i, Db2 ja muu taolisega. Me valisime loomulikult parimad tarnijate lahendused, integreerisime need ja proovisime nendega tÔusta. Tegime seda omaette. See oli nagu sisemine start-up.

KÔik see algas 2009. aastal. Alates 2006. aastast oleme tihedalt tegelenud operaatorilahendustega. Valmistasime mitmeid eritellimusel valmistatud virtuaalseid PSTN-i, nagu see, mis meil praegu tellida on: vaatlesime, otsustasime, et see on hea, ja otsustasime luua sisemise start-up'i.

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

VĂ”tsime VMWare'i. Kuna tegime seda oma vahenditega, pidime kohe loobuma kallist tarnijate salvestusest. Me teame nende kohta kĂ”ike: lubadused tuleb jagada kolme ja hind korrutada kĂŒmnega. SeetĂ”ttu tegime DirDB ja nii edasi.

Siis hakkas see kasvama. Sellele lisandus arveldusteenus, kuna platvorm ei suutnud enam hakkama saada. Siis kolis arvelduse server MySQL-st Mongo-le. Tulemuseks oli töötav lahendus, mis töötleb kÔiki sinna kÔige lÀhenenud kÔnesid:

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Aga kuskil seal sees keerleb see vendor-toode – peamine, tuumik, mille me kunagi valisime. Umbes 2011. aasta lĂ”pus mĂ”istsime, et see toode on meie peamine kitsaskoht – me jĂ”uame just sellesse. Me nĂ€gime end ees seina, mille poole me tĂ€ies hoos jookseme, kuna kliendid tulid juurde.
Seega pidiime midagi ette vĂ”tma. Loomulikult tegime ĂŒsna pikka aega erinevate toodete – nii avatud lĂ€htekoodiga kui ka vendorite – uuringuid. Ma ei hakka praegu sellele peatuma – teema ei ole see. Viimane varuplaan, mille ĂŒle me rÀÀkisime, oli omaenda platvormi loomine.

LĂ”ppkokkuvĂ”ttes jĂ”udsimegi selle valikuni. Miks? Sest kĂ”ik vendorite ja avatud lĂ€htekoodiga tooted on loodud 10-aastase taguse probleemide lahendamiseks. Hea kĂŒll, kui 10 aastat, mĂ”ned on aga vanemad! Meile osutus valik selgeks: kas loobume oma kaunilt ideest ideaalsest teenusest (partnerite, operaatorite ja enda jaoks), vĂ”i teeme midagi ise.

Otsustasime teha midagi ise!

Platvormi nÔuded

Kui millegagi pikka aega tegeled (kasutad kellegi teise toodet), siis hakkavad peas tasapisi mĂ”tted liikuma: kuidas ma teeksin seda ise? Kuna meie ettevĂ”ttes on kĂ”ik programmeerijad (vĂ€lja arvatud mĂŒĂŒjad, mitte-programmeerijaid pole), on meil nĂ”uded juba ammu vĂ€lja kujunenud ja need on selged:

  1. Kiire arenduskiirus. Valmistooted, mis meid vaevasid, ei sobinud meile eelkĂ”ige selle pĂ€rast, et kĂ”ik toimus aeglaselt ja vaevaliselt. Me soovisime kiiresti – meil oli palju ideid! Meil on ka praegu palju ideid, kuid tookord oli ideeideede nimekiri niinavĂ”rd pikk, et tundus nagu oleksime kĂŒmme aastat ette vaatamas. Praegu on see vaid aasta.
  2. Maksimaalne mitme tuuma kasutamine. See oli meile samuti oluline, kuna nÀgime, et tuumade arv suureneb pidevalt.
  3. KÔrge usaldusvÀÀrsus. See on ka asi, mille pÀrast oleme palju nutnud.
  4. KÔrge tÔrke kindlus.
  5. Soovisime lÔpuks jÔuda protsessini, mille korraldamine toimuks igapÀevaste vÀljalaskepunktide kaudu. Selleks vajasime keele valikut.

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Seega, meie endi toodet toetavad nÔuded viivad ilmnevalt loogiliselt keele nÔudeni.

  1. Kui vajame mitme tuuma sĂŒsteemide tuge, on meil vaja ka paralleelse tĂ€itmise tuge.
  2. Kui me vajame arenduse kiirust, vajame me keelt, mis toetab konkurentsset arendust, konkurents-programmeerimist. Kui keegi ei ole kunagi kokku puutunud erinevusega, siis see on vÀga lihtne:
    • paralleelprogrammeerimine – see puudutab kaht erinevat lĂ”ime, mis töötavad erinevates tuumades;
    • konkurentsiline tĂ€itmine, tĂ€psemalt konkurentsi toetas – see on see, kuidas keel (vĂ”i tööaeg, pole vahet) aitab peita kogu keerukuse, mis tuleneb paralleelsest tĂ€itmisest.
  3. KÔrge vastupidavus. Ilmselgelt oli meil vaja klastrit, ja see pidanuks olema parem kui see, mis meil oli tarnija tootes.

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Meil ei olnud tegelikult palju variante, kui meenutada. Esiteks, „Erlang“ – me armastame seda ja tunneme seda, see oli minu isiklik, isiklik lemmik. Teiseks, Java – isegi mitte Java, vaid konkreetne Scala. Kolmandaks, keel, mida me sel hetkel ĂŒldse ei teadnud – Go. See oli just turule tulnud, tĂ€psemalt umbes kaks aastat olemas olnud, kuid veel ei olnud avaldanud.

VÔitis Go!

Go ajalugu

Meie loodud platvorm on sellel. Proovin selgitada, miks.

LĂŒhike ajalugu Go-st. See kĂ€ivitus 2007. aastal, avati 2009. aastal, esimene versioon ilmus 2012. aastal (see tĂ€hendab, et me hakkasime töötama juba enne esimest vĂ€ljaannet). Algataja oli Google, kes soovis ilmselt Java-d asendada.

Autorid on vÀga tuntud:

  • Ken Thompson, kes seisis Unix’i taga, mĂ”tles vĂ€lja UTF-8, töötas Plan 9 sĂŒsteemi kallal;
  • Rob Pike, kes koos Keniga mĂ”tles vĂ€lja UTF-8, töötas samuti Plan 9, Inferno ja Limbo kallal Bell Labs’is;
  • Robert Griesemer, keda me tunneme ja armastame selle eest, et ta mĂ”tles vĂ€lja Java HotSpot Compileri ja töötas V8 (Google’i Javascript’i tĂ”lgendaja) generaatori kallal;
  • Ja ĂŒle 700 osaleja, sealhulgas mĂ”ned meie plaastrid.

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Go: esimene pilk

NĂ€eme, et keel on enam-vĂ€hem lihtne ja arusaadav. Meil on ilmseid tĂŒĂŒpe: mĂ”nel juhul tuleb neid deklareerida, mĂ”nel juhul mitte (see tĂ€hendab, et tĂŒĂŒbid tuletatakse, niikuinii).

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

On nÀha, et struktuure on moes kirjeldada. On nÀha, et meil on pointeri kontseptsioon (seal, kus on tÀhekene). On nÀha, et massiivide ja assotsiatiivsete massiivide deklareerimiseks ja initsialiseerimiseks on spetsiaalne tugi.

Umbes selge – elada on vĂ”imalik. Proovime kirjutada Hello, world:

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Mida nĂ€eme? See on C-sarnane sĂŒntaks, semikoolon ei ole kohustuslik. See vĂ”ib olla kahe rea eraldaja, kuid ainult juhul, kui need on kaks konstruktsiooni, mis on tĂ”epoolest ĂŒhel real.

NĂ€eme, et juhtimistruktuurides (14. reas) on sulud mitte kohustuslikud, kuid sĂŒklites on need alati vajalikud. NĂ€eme, et tĂŒĂŒpimine on staatiline. Enamikul juhtudel tuletatakse tĂŒĂŒp automaatselt. See nĂ€ide on natuke keerulisem kui tavaline Hello, world – lihtsalt, et nĂ€idata, et on olemas teek.

Mida veel olulist nĂ€eme? Kood on organiseeritud pakettidesse. Ja et pakketti oma koodis kasutada, tuleb see importida import-direktiivi abil – see on samuti oluline. KĂ€ivitame – töötab. SuurepĂ€rane!

Proovime edasi midagi keerulisemat: Hello, world, kuid nĂŒĂŒd on see http-server. Mida huvitavat siin nĂ€eme?

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Esiteks, funktsioon kĂ€itub parameetrina. See tĂ€hendab, et funktsioon on meil – "esmaklassiline kodanik" ning sellel on funktsionaalses stiilis palju huvitavat teha. JĂ€rgmisena nĂ€eme ootamatut: import direktiiv viitab otse GitHubi hoidurile. KĂ”ik on Ă”ige, just nii ongi – veelgi enam, just nii tulekski teha.

Go keeles on paketi universaalne identifikaator selle hoiduri url. On olemas spetsiaalne tööriist Goget, mis lÀheb lÀbi kÔikidest sÔltuvustest, alla laadib need, installib, kompileerib ja valmistab need kasutamiseks ette, kui on vajalik. Samuti teab Goget html-meta kohta. Seega, on vÔimalik hoida http-katalooge, kus on lingid konkreetsetele oma hoidurile (nagu nÀiteks meie teeme).

Mida me veel nĂ€eme? Http ja Json on standardkasutuses. Omandatud on, ilmselt, introspektsioon – reflection, mida tuleks kasutada encoding/json'is, kuna me anname sellele lihtsalt mingi suvalise objekti.

KÀivitame ja nÀeme, et oleme 20 reaga saanud kasuliku koodi, mis kompileerub, kÀivitub ja annab vÀlja masina praeguse keskmise koormuse (masinal, kus see on kÀivitunud).
Mis on veel oluline, mida me siin kohe nĂ€eme? See kompileeritakse ĂŒheks staatiliseks binaariks (buinary). Sellel binaaril pole ĂŒldse mingeid sĂ”ltuvusi, ei ole raamatukogusid! Seda saab kopeerida igasse sĂŒsteemi, kohe kĂ€ivitada ja see töötab.

Liigume edasi.

Go: meetodid ja liidesed

Go-l on meetodid. Sa saad deklareerida meetodi igasuguse kasutaja tĂŒĂŒbi jaoks. Ja see ei pea olema struktuur, vaid vĂ”ib olla ka mĂ”ne tĂŒĂŒbi alias. Sa saad deklareerida alias'i N32-le ja kirjutada selle jaoks meetodeid, et teha midagi kasulikku.

Ja siin me esmakordselt saame takistuse... Selgub, et Go-l ei ole klasside mĂ”istet nagu sellist. Need, kes tunnevad Go-d, vĂ”ivad öelda, et seal on tĂŒĂŒpide kaasamine, kuid see on hoopis midagi muud. Mida varem arendaja lĂ”petab selle mĂ”tlemise kui pĂ€rimisele, seda parem. Go-s klassid puuduvad ja pĂ€rimist samuti ei ole.

KĂŒsimus! Mida on autorite ettevĂ”te Google'i juhatuses meile andnud, et kuvada kogu selle maailma keerukust? Nad andsid meile liidesed!

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

Liides on spetsiaalne tĂŒĂŒp, mis vĂ”imaldab kirjutada lihtsalt meetodeid ja meetodite signatuure. Iga tĂŒĂŒp, mille jaoks need meetodid eksisteerivad (teostatakse), vastab sellele liidesele. See tĂ€hendab, et saate lihtsalt kirjeldada vastavat funktsiooni ĂŒhe tĂŒĂŒbi jaoks, teise (mis vastab sellele liidese tĂŒĂŒbile) jaoks. SeejĂ€rel deklareerige muutuja selle liidese tĂŒĂŒbina ja mÀÀrake sellele ĂŒkskĂ”ik milline neist objektidest.

Hardcore'i armastajatele vĂ”in öelda, et selles muutujas on tegelikult kaks viidatud: ĂŒks andmete, teine spetsiaalse descriptorite tabeli peale, mis on iseloomulik just sellele konkreetsele tĂŒĂŒbile, selle liidese tĂŒĂŒbile. See tĂ€hendab, et kompilaator loob sellised descriptorite tabelid linkimise ajal.

Go-s on loomulikult ka void viidatud. SÔna interface {} (kaks kaarvilist sulgu) on muutuja, mis vÔimaldab viidata pÔhimÔtteliselt igale objektile.
Siiani on kĂ”ik korras, kĂ”ik on harjumuspĂ€rane. Pole midagi ĂŒllatavat.

Go: goroutines

NĂŒĂŒd jĂ”uame sinna, mis köitis tĂ€helepanu: kerged protsessid – goroutines Go terminoloogias.

Aleksei Naidyonov. ITooLabs. Juhtum Go (Golang) telefoniplatvormi arendusest. Osa 1

  1. Esiteks, need on tÔeliselt kerged (alla 2 KB).
  2. Teiseks, nende gorutiinide loomise kulud on tĂŒhised: neid saab luua kuni tuhat sekundis – midagi ei juhtu.
  3. Nendega tegeleb nende enda ajakava, mis lihtsalt edastab juhtimise ĂŒhelt gorutiinilt teisele.
  4. Juhtimine edastatakse jÀrgmistel juhtudel:
    • kui kohtub go vĂ€ljendiga (kui gorutiin kĂ€ivitab jĂ€rgmise gorutiini);
    • kui aktiveeritakse blokeeriv sisendi/vĂ€lja kutsumine;
    • kui algatatakse prĂŒgi kogumine;
    • kui kĂ€ivitatakse mĂ”ni operatsioon kanalitega.

See tĂ€hendab, et iga kord, kui Go programm kĂ€ivitatakse arvutis, mÀÀrab see sĂŒsteemi tuumade arvu, kĂ€ivitab vajalike lĂ”imede arvu (nii palju tuumasid sĂŒsteemis vĂ”i nii palju kui teie selle mÀÀrate). Vastavalt sellele kĂ€ivitab ajakava kĂ”ik need kerged tĂ€itmisvood kĂ”igis vajalikest operatsioonisĂŒsteemi lĂ”imedes igas tuumas.

Oluline on mĂ€rkida, et see on kĂ”ige tĂ”husam viis riistvara kĂ€itlemiseks. Lisaks sellele pakume me veel palju muud. NĂ€iteks arendame DPI-sĂŒsteeme, mis vĂ”imaldavad ĂŒhes ĂŒhikus hallata 40 gigabitti (sĂ”ltuvalt, mis toimub nende ridade sees).

Seal kasutasime juba Go eel sama skeemi just sellel pĂ”hjusel: see aitab sĂ€ilitada protsessori vahemĂ€lu lokaalsust ning mĂ€rgatavalt vĂ€hendada operatiiv sĂŒsteemi kontekstitĂŒhjendusi (mis samuti vĂ”tab palju aega). Kordan: see on kĂ”ige tĂ”husam viis riistvara kasutamiseks.

See lihtne 21-realine nĂ€ide on nĂ€iteks, mis loob lihtsalt echo-serveri. Pange tĂ€hele, et funktsioon serve on ÀÀrmiselt lihtne ja lineaarne. Seal ei ole ĂŒhtegi tagasisidet, mingit vajadust muretseda ja mĂ”elda... Sa lihtsalt loed ja kirjutad!

Samuti, kui sa loed ja kirjutad, peaks see tegelikult blokeerima – see gorutiin pannakse lihtsalt ootejĂ€rjekorda ja selle tĂ”mbab planeerija vĂ€lja siis, kui see uuesti tĂ€itmiseks vĂ”imalikult muutub. Seega vĂ”ib see lihtne kood töötada echo-serverina nii palju ĂŒhendusi, kui operatsioonisĂŒsteem sellel masinal lubab.

Peagi on see tulemas


Vaata videot

Veidi reklaami 🙂

AitĂ€h, et olete meiega. Kas teile meeldivad meie artiklid? Kas soovite nĂ€ha rohkem huvitavaid materjale? Toetage meid, tehes tellimuse vĂ”i soovitades meid tuttavatele. pilve VPS arendajatele alates $4,99, ainulaadne sisenemise taseme serverite analoog, mille oleme teie jaoks vĂ€lja mĂ”elnud: Kogu tĂ”de VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps alates $19 vĂ”i kuidas Ă”ieti serverit jagada? (saadaval on RAID1 ja RAID10 variandid, kuni 24 sĂŒdamikku ja kuni 40GB DDR4).

Kas Dell R730xd on kaks korda odavam Equinixi Tier IV andmete keskuses Amsterdamis? Ainult meie juures 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB alates $199 Hollandi turul! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — alates $99! Lugege, kuidas Luua ettevĂ”tte tasemel infrastruktuur Dell R730xd E5-2650 v4 serveritega, mille hind on 9000 eurot, madala hinnaga?

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster