Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Alexey Naydenov, generalni direktor ITooLabs, govori o razvoju telekomunikacijske platforme za telekomunikacijske operaterje v programskem jeziku Go (Golang). Alexey deli tudi svoje izkušnje pri uvajanju in upravljanju platforme pri enem največjih azijskih telekomunikacijskih operaterjev, ki je platformo uporabljal za zagotavljanje storitev glasovne pošte (VoiceMail) in Virtual PBX (Cloud PBX).

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Aleksej Naydenov (v nadaljevanju – AN): - Pozdravljeni vsi skupaj! Moje ime je Alexey Naydenov. Sem direktor ITooLabs. Najprej bi rad odgovoril, kaj počnem tukaj in kako sem se znašel tukaj.

Če pogledate Bitrix24 Marketplace (razdelek "Telefonija"), potem smo 14 aplikacij in 36, ki so tam (40%):

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Natančneje, to so naši operaterski partnerji, a za vsem tem stoji naša platforma (Platforma kot storitev) – tisto, kar jim prodajamo za drobiž. Pravzaprav bi rad govoril o razvoju te platforme in o tem, kako smo prišli do Go.

Številke za našo platformo zdaj:

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

44 operaterskih partnerjev, vključno z Megafonom. Na splošno se zelo radi podajamo na različne avanture in imamo dejanski dostop do 100 milijonov naročnikov 44 operaterjev tukaj v Rusiji. Zato, če ima kdo kakšno poslovno idejo, mu bomo vedno z veseljem prisluhnili.

  • 5000 uporabniških podjetij.
  • Skupaj 20 naročnikov. Vse to je b000b - delamo samo s podjetji.
  • 300 klicev na minuto čez dan.
  • 100 milijonov klicnih minut lani (praznovali smo). To ne upošteva internih pogajanj, ki so na voljo na naši platformi.

Kako se je začelo?

Kako pravi tipi sploh začnejo ustvarjati svojo platformo? Upoštevati moramo tudi, da imamo zgodovino razvoja »hardcore enterprise«, in to celo v najbolj natančnem letnem času za podjetje! To je bil tisti veseli čas, ko prideš do stranke in rečeš: "Potrebujemo še nekaj strežnikov." In stranka: »Ni vprašanja! Deset jih imamo v stojalu.«

Tako smo naredili Oracle, Java, WebSphere, Db2 in vse te stvari. Zato smo seveda vzeli najboljše rešitve proizvajalcev, jih integrirali in poskušali s tem zaživeti. Hodili smo sami. To bi bil tak interni zagon.

Vse to se je pravzaprav začelo leta 2009. Od leta 2006 se tako ali drugače tesno ukvarjamo z operaterskimi rešitvami. Naredili smo več virtualnih PBX po meri (kot je ta, ki jo imamo zdaj naročeno): pogledali smo jo, ugotovili, da je dobra, in se odločili začeti interni zagon.

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Vzeli smo VMWare. Ker smo bili sami, smo morali takoj opustiti kul prodajalca Storage. O njih vemo vse: da je treba obljube deliti s 3, stroške pa pomnožiti z 10. Zato so naredili DirDB in tako naprej.

Potem je začelo rasti. Temu je bila dodana storitev obračunavanja, ker platforma ni več zdržala. Potem se je strežnik za obračunavanje iz MySQL preselil v Mongo. Kot rezultat smo dobili delujočo rešitev, ki obdeluje vse klice, ki gredo tja:

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Toda nekje tam, v notranjosti, se vrti ta isti prodajni izdelek - glavni, jedrski, ki smo ga nekoč vzeli. Približno konec leta 2011 smo ugotovili, da bo za nas glavno ozko grlo seveda prav ta izdelek – naleteli bomo nanj. Pred sabo smo zagledali zid, v katerega smo se zagnali v polnem galopu, saj je prihajalo novih strank.
V skladu s tem smo morali nekaj storiti. Seveda smo opravili kar nekaj raziskav o različnih produktih - tako odprtokodnih kot prodajalčevih. O tem se zdaj ne bom ustavljal – ne govorimo o tem. Zadnja nadomestna možnost, na katero smo pomislili, je bila izdelava lastne platforme.

Na koncu smo prišli do te možnosti. Zakaj? Ker so bili vsi prodajalci in odprtokodni izdelki narejeni za reševanje problemov, starih 10 let. No, če je star 10 let, pa še nekaj! Izbira nam je postala očitna: ali se poslovimo od naše odlične ideje o idealni storitvi (za partnerje, operaterje in nas), ali pa naredimo nekaj svojega.

Odločili smo se, da naredimo nekaj svojega!

Zahteve glede platforme

Če nekaj počnete že dlje časa (uporabljate produkt nekoga drugega), se vam v glavi počasi oblikuje misel: kako bi to naredil sam? Ker smo v podjetju vsi programerji (razen prodajalcev, neprogramerjev ni), so se naše zahteve oblikovale že dolgo nazaj in so bile jasne:

  1. Visoka razvojna hitrost. Izdelek prodajalca, ki nas je mučil, ni bil zadovoljiv, najprej zato, ker se je vse odvijalo dolgo in počasi. Želeli smo ga hitro - imeli smo veliko idej! Imamo še veliko idej, a takrat je bil seznam idej tak, da se je zdel deset let vnaprej. Zdaj samo za eno leto.
  2. Največji izkoristek večjedrnega železa. To je bilo pomembno tudi za nas, saj smo videli, da bo jeder vedno več.
  3. Visoka zanesljivost. Nekaj, ob čemer smo tudi jokali.
  4. Visoka odpornost na okvare.
  5. Želeli smo končati s procesom dnevnih objav. Za to smo potrebovali izbiro jezika.

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Skladno s tem iz zahtev za izdelek, ki smo si jih postavili, jasno logično rastejo zahteve po jeziku.

  1. Če želimo podporo za večjedrne sisteme, potem potrebujemo podporo za vzporedno izvajanje.
  2. Če potrebujemo hitrost razvoja, potrebujemo jezik, ki podpira konkurenčen razvoj, konkurenčno programiranje. Če kdo še ni srečal razlike, je zelo preprosta:
    • Vzporedno programiranje govori o tem, kako se dve različni niti izvajata na različnih jedrih;
    • Sočasno izvajanje ali natančneje podpora za sočasnost govori o tem, kako jezik (ali izvajalno okolje, ni pomembno) pomaga skriti vso zapletenost, ki izhaja iz vzporednega izvajanja.
  3. Visoka stabilnost. Očitno smo potrebovali gručo in to boljšo, kot smo jo imeli na izdelku prodajalca.

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Res nismo imeli toliko možnosti, če se spomnite. Prvič, Erlang - obožujemo in poznamo ga, bil je moj osebni, osebno najljubši. Drugič, Java sploh ni Java, ampak posebej Scala. Tretjič, jezik, ki ga takrat sploh nismo poznali - Go. Takrat se je šele pojavil, oziroma obstajal je že kakšni dve leti, a še ni bil izdan.

Go zmagal!

Zgodovina Go

Na njej smo naredili ploščad. Poskušal bom razložiti zakaj.

Kratka zgodovina Go. Začelo se je leta 2007, odprlo se je leta 2009, prva različica je bila izdana leta 2012 (se pravi, da smo začeli delati še pred prvo izdajo). Pobudnik je bil Google, ki je želel nadomestiti, kot sumim, Javo.

Avtorji so zelo znani:

  • Ken Thomson, ki je stal za Unixom, je izumil UTF-8, delal na sistemu Plan 9;
  • Rob Pike, ki je izumil UTF-8 s Kenom, je delal tudi na Plan 9, Inferno, Limbo pri Bell Labs;
  • Robert Giesmer, ki ga poznamo in imamo radi zaradi izuma prevajalnika Java HotSpot in zaradi njegovega dela na generatorju v V8 (Googlov tolmač Javascript);
  • In več kot 700 sodelavcev, vključno z nekaterimi našimi popravki.

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Pojdi: prvi pogled

Vidimo, da je jezik bolj ali manj preprost in razumljiv. Imamo očitne tipe: v nekaterih primerih jih je treba deklarirati, v drugih pa niso potrebni (to pomeni, da so tipi tako ali drugače izpeljani).

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Vidi se, da je moderno opisovati strukture. Vidi se, da imamo koncept kazalca (kjer je zvezdica). Vidimo, da obstaja posebna podpora za deklaracijo inicializacije nizov in asociativnih nizov.

Skoraj jasno je - lahko živiš. Poskusimo napisati Hello, world:

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Kaj vidimo? To je sintaksa, podobna C, podpičje ni obvezno. Lahko je ločilo za dve liniji, vendar le, če gre za dve konstrukciji, ki sta na isti liniji.

Vidimo, da oklepaji v kontrolnih strukturah (v 14. vrstici) niso obvezni, vendar so zaviti oklepaji vedno potrebni. Vidimo, da je tipkanje statično. Tima večino časa vzamejo ven. Ta primer je nekoliko bolj zapleten kot običajni Hello, world – samo zato, da pokažemo, da obstaja knjižnica.

Kaj še vidimo pomembnega? Koda je organizirana v pakete. Če želite uporabiti paket v lastni kodi, ga morate uvoziti z uvozno direktivo - to je prav tako pomembno. Zaženemo ga - deluje. Super!

Poskusimo nekaj bolj zapletenega: Pozdravljen, svet, a šele zdaj je to strežnik http. Kaj vidimo tukaj zanimivega?

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Prvič, funkcija deluje kot parameter. To pomeni, da je naša funkcija »prvorazredni državljan« in z njo lahko počnete marsikaj zanimivega v funkcionalnem slogu. Nato vidimo nekaj nepričakovanega: uvozna direktiva je povezana neposredno z repozitorijem GitHub. Tako je, tako je – še več, tako je treba delati.

V Go je univerzalni identifikator paketa url njegovega repozitorija. Obstaja poseben pripomoček Goget, ki bo pridobil vse odvisnosti, jih prenesel, namestil, prevedel in po potrebi pripravil za uporabo. Hkrati Goget ve za html-meta. V skladu s tem lahko obdržite imenik http, ki bo vseboval povezave do vašega specifičnega repozitorija (kot na primer počnemo mi).

Kaj še vidimo? Http in Json v standardni knjižnici. Očitno obstaja introspekcija - refleksija, ki bi jo bilo treba uporabiti pri kodiranju/jsonu, saj jo preprosto nadomestimo z nek poljuben objekt.

Zaženemo ga in vidimo, da imamo uporabno kodo v 20 vrsticah, ki prevede, požene in poroča o trenutni povprečni obremenitvi stroja (na stroju, na katerem je zagnan).
Kaj je še pomembnega, kar lahko takoj vidimo tukaj? Prevede se v eno statično dvojiško datoteko (buinary). Ta dvojiška datoteka nima nobenih odvisnosti, nobenih knjižnic! Lahko ga kopirate v kateri koli sistem, takoj zaženete in delovalo bo.

Iti naprej.

Go: Metode in vmesniki

Go ima metode. Metodo lahko deklarirate za katero koli vrsto po meri. Poleg tega to ni nujno struktura, ampak morda neke vrste vzdevek. Za N32 lahko deklarirate vzdevek in napišete metode, s katerimi lahko naredi karkoli koristnega.

In tukaj prvič pademo v stupor ... Izkazalo se je, da Go nima razredov kot takih. Tisti, ki poznajo Go, bi lahko rekli, da obstaja vključitev tipov, vendar je to nekaj povsem drugega. Prej ko razvijalec neha o tem razmišljati kot o dediščini, tem bolje. V Go ni razredov in tudi dedovanja ni.

vprašanje! Kaj nam je družba avtorjev na čelu z Googlom dala, da bi odražali kompleksnost sveta? Dali so nam vmesnike!

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

Vmesnik je posebna vrsta, ki vam omogoča pisanje preprostih metod, podpisov metod. Poleg tega bo vsak tip, za katerega te metode obstajajo (se izvajajo), ustrezal temu vmesniku. To pomeni, da lahko preprosto opišete ustrezno funkcijo za eno vrsto, za drugo (ki ustreza tej vrsti vmesnika). Nato deklarirajte spremenljivko tipa tega vmesnika in ji dodelite katerega koli od teh objektov.

Za ljubitelje hardcore lahko rečem, da bo ta spremenljivka dejansko imela dva kazalca: enega na podatke, drugega na posebno tabelo deskriptorjev, ki je značilna za to posebno vrsto, za vmesnik te vrste. To pomeni, da prevajalnik ustvari takšne deskriptorske tabele v času povezovanja.

In v Go, seveda, obstajajo kazalci na praznino. Besedni vmesnik {} (z dvema zavitima oklepajima) je spremenljivka, ki vam načeloma omogoča, da pokažete na kateri koli predmet.
Zaenkrat je vse v redu, vse se pozna. Nič presenetljivega.

Pojdi: goroutines

Zdaj smo pri tem, kar nas zanima: lahki procesi - goroutine (goroutine) v terminologiji Go.

Aleksej Najdenov. ITooLabs. Primer razvoja na telefonski platformi Go (Golang). 1. del

  1. Prvič, res so lahki (manj kot 2 KB).
  2. Drugič, stroški ustvarjanja takšne goroutine so zanemarljivi: ustvarite jih lahko tisoč na sekundo - nič se ne bo zgodilo.
  3. Služi jim lasten razporejevalnik, ki preprosto prenaša nadzor z ene goroutine na drugo.
  4. V tem primeru se nadzor prenese v naslednjih primerih:
    • če naletimo na izraz go (če goroutina začne naslednjo goroutino);
    • če je omogočen blokirajoči vhodno/izhodni klic;
    • če se začne odvoz smeti;
    • če se sproži kakšna operacija s kanali.

To pomeni, da kadar koli se program Go izvaja v računalniku, določi število jeder v sistemu, zažene toliko niti, kot je potrebno (koliko jeder je v sistemu ali koliko ste mu povedali). V skladu s tem bo razporejevalnik izvajal te lahke niti izvajanja v vseh teh nitih operacijskega sistema v vsakem jedru.

Treba je opozoriti, da je to najučinkovitejši način uporabe železa. Poleg prikazanega delamo še marsikaj drugega. Izdelujemo na primer sisteme DPI, ki omogočajo, da ena enota služi 40 gigabitov (odvisno od dogajanja v teh linijah).

Tam smo že pred Go uporabljali popolnoma enako shemo prav iz tega razloga: ker nam omogoča ohranitev lokalnosti procesorskega predpomnilnika in občutno zmanjšanje števila preklopov konteksta OS (kar tudi vzame veliko časa). Ponavljam: to je najučinkovitejši način izrabe železa.

Ta preprost 21-vrstični primer je primer, ki preprosto naredi echo-strežnik. Upoštevajte, da je strežna funkcija izjemno preprosta, je linearna. Ni povratnih klicev, ni se treba truditi in razmišljati ... Vi samo berite in pišete!

Hkrati bi moral, če berete in pišete, dejansko blokirati - ta goroutina se preprosto postavi v čakalno vrsto in jo prevzame razporejevalnik, ko je izvajanje znova možno. To pomeni, da lahko ta preprosta koda deluje kot echo strežnik za toliko povezav, kot jih omogoča OS na tem računalniku.

Nadaljevanje kmalu ...

Nekaj ​​oglasov 🙂

Hvala, ker ste ostali z nami. So vam všeč naši članki? Želite videti več zanimivih vsebin? Podprite nas tako, da oddate naročilo ali priporočite prijateljem, oblak VPS za razvijalce od 4.99 $, edinstven analog začetnih strežnikov, ki smo ga izumili za vas: Vsa resnica o VPS (KVM) E5-2697 v3 (6 jeder) 10 GB DDR4 480 GB SSD 1 Gbps od 19 USD ali kako deliti strežnik? (na voljo z RAID1 in RAID10, do 24 jeder in do 40 GB DDR4).

Dell R730xd dvakrat cenejši v podatkovnem centru Equinix Tier IV v Amsterdamu? Samo tukaj 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6 GHz 14C 64 GB DDR4 4 x 960 GB SSD 1 Gbps 100 TV od 199 $ na Nizozemskem! Dell R420 - 2x E5-2430 2.2 Ghz 6C 128 GB DDR3 2x960 GB SSD 1 Gbps 100 TB - od 99 $! Preberite o Kako zgraditi infrastrukturo Corp. razreda z uporabo strežnikov Dell R730xd E5-2650 v4 v vrednosti 9000 evrov za drobiž?

Vir: www.habr.com

Dodaj komentar