Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Alexey Naydenov, generálny riaditeľ ITooLabs, hovorí o vývoji telekomunikačnej platformy pre telekomunikačných operátorov v programovacom jazyku Go (Golang). Alexey sa tiež delí o svoje skúsenosti s nasadením a prevádzkou platformy u jedného z najväčších ázijských telekomunikačných operátorov, ktorý platformu využíval na poskytovanie služieb hlasovej pošty (VoiceMail) a virtuálnej pobočkovej ústredne (Cloud PBX).

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Alexey Naydenov (ďalej len AN): - Ahojte všetci! Volám sa Alexey Naidenov. Som riaditeľom ITooLabs. V prvom rade by som rád odpovedal, čo tu robím a ako som sa tu dostal.

Ak sa pozriete na Bitrix24 Marketplace (časť „Telefónia“), tak 14 aplikácií a 36, ​​ktoré tam sú (40 %), sme my:

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Presnejšie povedané, sú to naši operátorskí partneri, no za tým všetkým je naša platforma (Platforma ako služba) – to, čo im predávame za malý groš. V skutočnosti by som chcel hovoriť o vývoji tejto platformy ao tom, ako sme prišli ku Go.

Čísla pre našu platformu sú teraz:

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

44 partnerských operátorov vrátane MegaFonu. Vo všeobecnosti sa radi vydávame na dobrodružstvá a v skutočnosti máme prístup k 100 miliónom predplatiteľov 44 operátorov tu v Rusku. Preto, ak má niekto nejaké podnikateľské nápady, vždy si ich radi vypočujeme.

  • 5000 užívateľských spoločností.
  • Spolu 20 000 predplatiteľov. To všetko je b2b – spolupracujeme len s firmami.
  • 300 hovorov za minútu počas dňa.
  • 100 miliónov prevolaných minút minulý rok (oslavovali sme). Toto nezohľadňuje interné rokovania, ktoré sú dostupné na našej platforme.

Ako to začalo?

Ako tí správni chalani vôbec začnú robiť svoju platformu? Malo by sa tiež vziať do úvahy, že sme mali históriu rozvoja „tvrdého podnikania“ a dokonca aj v najpresnejšom období roka pre podnik! Bol to ten šťastný čas, keď ste prišli k zákazníkovi a povedali: "Potrebujeme pár ďalších serverov." A zákazník: „Bez otázky! V regáli ich máme desať.“

Takže sme urobili Oracle, Java, WebSphere, Db2 a všetky tieto veci. Preto sme, samozrejme, zobrali najlepšie riešenia od dodávateľov, integrovali sme ich a pokúsili sa s tým začať. Hrali sami. To by bol taký interný startup.

Všetko sa to začalo v roku 2009. Od roku 2006 sme sa tak či onak úzko podieľali na rozhodnutiach operátorov. Vyrobili sme niekoľko virtuálnych pobočiek na mieru (ako tie, ktoré máme teraz na objednávku): pozreli sme sa, rozhodli sme sa, že je to dobré a rozhodli sme sa rozprúdiť interný startup.

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Vzali sme VMWare. Keďže sme kráčali po vlastných, museli sme okamžite opustiť cool predajcu Storage. Vieme o nich všetko: že sľuby by sa mali deliť 3 a náklady by sa mali vynásobiť 10. Preto sme urobili DirDB a tak ďalej.

Potom to začalo rásť. K tomu sa pridala aj fakturačná služba, pretože platforma to už nezvládala. Potom sa fakturačný server z MySQL presunul do Mongo. Výsledkom je, že máme funkčné riešenie, ktoré spracováva všetky hovory, ktoré tam prichádzajú:

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Ale niekde vo vnútri sa točí ten istý produkt dodávateľa - hlavný, jadrový, ktorý sme kedysi vzali. Približne ku koncu roka 2011 sme si sami uvedomili, že hlavným úzkym hrdlom pre nás bude, samozrejme, práve tento produkt - na ktorý narazíme. Videli sme pred sebou stenu, do ktorej sme nabehli plným cvalom, keďže stále prichádzali ďalší klienti.
Preto sme museli niečo urobiť. Samozrejme, urobili sme dosť veľký prieskum rôznych produktov – open source aj predajcov. Nebudem sa tým teraz zaoberať – o to tu nejde. Posledným riešením, o ktorom sme uvažovali, bolo vytvorenie vlastnej platformy.

Nakoniec sme dospeli k tejto možnosti. prečo? Pretože všetky produkty dodávateľov a open source boli vyrobené tak, aby riešili problémy staré 10 rokov. No, ak má 10 rokov, a ešte niečo navyše! Voľba bola pre nás jasná: buď sa rozlúčime s našou skvelou myšlienkou ideálnej služby (pre partnerov, operátorov aj nás samých), alebo urobíme niečo vlastné.

Rozhodli sme sa urobiť niečo iné!

Požiadavky na platformu

Ak niečo robíte už dlho (používate produkt niekoho iného), potom sa vám v hlave pomaly formuje myšlienka: ako by som to urobil ja? Keďže sme vo firme všetci programátori (okrem predajcov nie sú žiadni neprogramátori), naše požiadavky sa vyvinuli už dávno a boli jasné:

  1. Vysoká rýchlosť vývoja. Produkt predajcu, ktorý nás potrápil, nám v prvom rade nevyhovoval, pretože všetko fungovalo dlho a pomaly. Chceli sme rýchlo – mali sme veľa nápadov! Stále máme veľa nápadov, ale potom bol zoznam nápadov taký, že to vyzeralo na desať rokov dopredu. Teraz len na rok.
  2. Maximálne využitie viacjadrového železa. Aj to bolo pre nás dôležité, pretože sme videli, že jadier bude len pribúdať.
  3. Vysoká spoľahlivosť. Niečo, s čím sme si aj poplakali.
  4. Vysoká odolnosť voči poruchám.
  5. Chceli sme skončiť procesom denného vydávania. Na to sme potrebovali výber jazyka.

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Podľa toho z požiadaviek na produkt, ktoré sme si sami predstavili, jasne logicky vyrastajú požiadavky na jazyk.

  1. Ak chceme podporu pre viacjadrové systémy, potom potrebujeme podporu pre paralelné spúšťanie.
  2. Ak potrebujeme rýchlosť vývoja, potrebujeme jazyk, ktorý podporuje konkurenčný vývoj, konkurenčné programovanie. Ak sa niekto nestretol s rozdielom, potom je to veľmi jednoduché:
    • Paralelné programovanie je o tom, ako sa na rôznych jadrách vykonávajú dve rôzne vlákna;
    • súbežné vykonávanie, presnejšie podpora súbežnosti, je o tom, ako jazyk (alebo runtime, čokoľvek) pomáha skrývať všetku zložitosť, ktorá pochádza z paralelného vykonávania.
  3. Vysoká stabilita. Je zrejmé, že sme potrebovali klaster a bol lepší ako to, čo sme mali na produkte dodávateľa.

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

V skutočnosti sme nemali toľko možností, ak si pamätáte. Po prvé, Erlang - milujeme ho a poznáme ho, bol to môj osobný, osobný favorit. Po druhé, Java ani nie je Java, ale konkrétne Scala. Po tretie, jazyk, ktorý sme v tom čase vôbec nepoznali – Go. Práve vtedy sa objavil, presnejšie, existoval už asi dva roky, no ešte nevyšiel.

Vyhrajte!

História Go

Urobili sme na ňom platformu. Pokúsim sa vysvetliť prečo.

Stručná história Go. Spustený v roku 2007, otvorený v roku 2009, prvá verzia bola vydaná v roku 2012 (to znamená, že sme začali pracovať ešte pred prvým vydaním). Iniciátorom bol Google, ktorý chcel nahradiť, ako tuším, Javu.

Autori sú veľmi známi:

  • Ken Thomson, ktorý stál za Unixom, vynašiel UTF-8, pracoval na systéme Plan 9;
  • Rob Pike, ktorý vynašiel UTF-8 s Kenom, tiež pracoval na pláne 9, Inferno, Limbo v Bell Labs;
  • Robert Giesmer, ktorého poznáme a milujeme pre vynájdenie Java HotSpot Compiler a pre jeho prácu na generátore vo V8 (prekladač Javascriptu od Google);
  • A viac ako 700 prispievateľov vrátane niektorých našich záplat.

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Choď: prvý pohľad

Vidíme, že jazyk je viac-menej jednoduchý a zrozumiteľný. Máme zrejmé typy: v niektorých prípadoch ich treba deklarovať, v iných nie sú potrebné (to znamená, že typy sú odvodené tak či onak).

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Je vidieť, že je módne popisovať štruktúry. Je vidieť, že máme koncept ukazovateľa (kde je hviezdička). Je vidieť, že existuje špeciálna podpora pre deklarovanie inicializácie polí a asociatívnych polí.

Zhruba pochopiteľné – žiť sa dá. Skúsme napísať Ahoj, svet:

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

čo vidíme? Toto je syntax podobná C, bodkočiarka je voliteľná. Môže to byť oddeľovač pre dva riadky, ale iba ak ide o dva konštrukcie, ktoré sú presne na tom istom riadku.

Vidíme, že zátvorky v riadiacich štruktúrach (v 14. riadku) sú voliteľné, ale zložené zátvorky sa vyžadujú vždy. Vidíme, že písanie je statické. Tim je väčšinou vonku. Tento príklad je trochu komplikovanejší ako zvyčajný Hello, world - len aby sme ukázali, že existuje knižnica.

Čo ešte vidíme dôležité? Kód je usporiadaný do balíkov. A aby ste mohli použiť balík vo svojom vlastnom kóde, musíte ho importovať pomocou importnej smernice – to je tiež dôležité. Spustíme to - funguje to. Skvelé!

Skúsme ďalej niečo zložitejšie: Ahoj, svet, ale až teraz je to server http. Čo zaujímavé tu vidíme?

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Po prvé, funkcia funguje ako parameter. To znamená, že funkcia, ktorú máme, je „prvotriedny občan“ a dá sa s ňou robiť veľa zaujímavého vo funkčnom štýle. Ďalej vidíme neočakávané: direktíva importu odkazuje priamo na úložisko GitHub. Presne tak, tak to je – navyše, tak sa to má robiť.

V Go je univerzálnym identifikátorom balíka adresa URL jeho úložiska. Existuje špeciálna utilita Goget, ktorá načíta všetky závislosti, stiahne ich, nainštaluje, skompiluje a v prípade potreby pripraví na použitie. Zároveň Goget vie o html-meta. V súlade s tým si môžete ponechať adresár http, ktorý bude obsahovať odkazy na vaše konkrétne úložisko (ako to robíme napríklad my).

Čo ešte vidíme? Http a Json v bežnej knižnici. Samozrejme existuje introspekcia - reflexia, ktorá by sa mala použiť v kódovaní / json, pretože za ňu jednoducho nahradíme nejaký ľubovoľný objekt.

Spustíme ho a vidíme, že máme 20 riadkov užitočného kódu, ktorý sa skompiluje, spustí a udáva aktuálne priemerné zaťaženie stroja (na stroji, na ktorom beží).
Čo je ešte dôležité z toho, čo tu môžeme hneď vidieť? Kompiluje sa do jednej statickej dvojhviezdy (buinary). Tento binárny súbor nemá vôbec žiadne závislosti, žiadne knižnice! Dá sa skopírovať do akéhokoľvek systému, okamžite spustiť a bude fungovať.

Ďalej.

Prejsť: Metódy a rozhrania

Go má metódy. Môžete deklarovať metódu pre akýkoľvek vlastný typ. Navyše to nie je nevyhnutne štruktúra, ale možno alias nejakého typu. Môžete deklarovať alias pre N32 a napísať preň metódy, aby urobil čokoľvek užitočné.

A tu prvýkrát upadneme do strnulosti... Ukazuje sa, že Go nemá triedy ako také. Tí, ktorí poznajú Go, môžu povedať, že existuje typová inklúzia, ale toto je úplne iné. Čím skôr to developer prestane považovať za dedičstvo, tým lepšie. V Go nie sú žiadne triedy a neexistuje ani dedičstvo.

Otázka! Čo nám dala spoločnosť autorov na čele s Google, aby odrážala zložitosť sveta? Dali nám rozhrania!

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

Rozhranie je špeciálny typ, ktorý vám umožňuje písať jednoduché metódy, podpisy metód. Ďalej, každý typ, pre ktorý tieto metódy existujú (sú vykonávané), bude zodpovedať tomuto rozhraniu. To znamená, že môžete jednoducho napísať zodpovedajúcu funkciu pre jeden typ, pre iný (ktorý zodpovedá danému typu rozhrania). Ďalej deklarujte premennú typu tohto rozhrania a priraďte k nej ktorýkoľvek z týchto objektov.

Pre skalných fanúšikov môžem povedať, že táto premenná bude v skutočnosti obsahovať dva ukazovatele: jeden na údaje, druhý na špeciálnu tabuľku deskriptorov, ktorá je špecifická pre tento konkrétny typ, pre rozhranie tohto typu. To znamená, že kompilátor vytvára takéto tabuľky deskriptorov v čase prepojenia.

A v Go sú, samozrejme, aj odkazy na neplatné. Slovo interface {} (s dvoma zloženými zátvorkami) je premenná, ktorá vám v princípe umožňuje ukázať na akýkoľvek objekt.
Zatiaľ je všetko v poriadku, všetko je známe. Nič prekvapivé.

Choď: goroutines

Teraz sa dostávame k tomu, čo nás zaujíma: odľahčené procesy - goroutines (goroutines) v terminológii Go.

Alexej Naydenov. ITooLabs. Vývojové puzdro na telefónnej platforme Go (Golang). Časť 1

  1. Po prvé, sú skutočne ľahké (menej ako 2 KB).
  2. Po druhé, náklady na vytvorenie takejto rutiny sú zanedbateľné: môžete ich vytvoriť tisíc za sekundu - nič sa nestane.
  3. Obsluhuje ich vlastný plánovač, ktorý jednoducho prenáša riadenie z jednej goroutiny do druhej.
  4. V tomto prípade sa kontrola prenáša v nasledujúcich prípadoch:
    • ak sa narazí na príkaz go (ak goroutín začína ďalší goroutine);
    • ak je aktivované blokovanie Input/Out hovoru;
    • ak je spustený zber odpadu;
    • ak sa spustí nejaká operácia s kanálmi.

To znamená, že vždy, keď sa program Go spustí na počítači, určí počet jadier v systéme, spustí toľko vlákien, koľko je potrebné (koľko jadier je v systéme alebo koľko ste mu povedali). V súlade s tým plánovač spustí tieto ľahké vlákna vykonávania na všetkých týchto vláknach operačného systému v každom jadre.

Treba poznamenať, že ide o najefektívnejší spôsob využitia železa. Okrem toho, čo sme ukázali, robíme oveľa viac. Vyrábame napríklad DPI systémy, ktoré umožňujú obsluhovať 40 gigabitov v jednej jednotke (v závislosti od toho, čo sa deje v týchto linkách).

Aj pred Go sme presne z tohto dôvodu použili presne rovnakú schému: pretože nám umožňuje zachovať lokalitu vyrovnávacej pamäte procesora a výrazne znížiť počet prepínačov kontextu OS (čo tiež zaberie veľa času). Opakujem: toto je najefektívnejší spôsob využitia železa.

Tento jednoduchý 21-riadkový príklad je príkladom, ktorý jednoducho robí echo-server. Zároveň si všimnite, že funkcia podávania je mimoriadne jednoduchá, je lineárna. Neexistujú žiadne spätné volania, nie je potrebné sa obťažovať a premýšľať... Stačí čítať a písať!

Zároveň, ak čítate a píšete, malo by sa to v skutočnosti zablokovať - ​​táto rutina je jednoducho zaradená do frontu a prevzatá plánovačom, keď bude vykonanie opäť možné. To znamená, že tento jednoduchý kód môže fungovať ako echo server pre toľko pripojení, koľko OS na tomto počítači dovolí.

Pokračovanie už čoskoro...

Nejaké inzeráty 🙂

Ďakujeme, že ste zostali s nami. Páčia sa vám naše články? Chcete vidieť viac zaujímavého obsahu? Podporte nás zadaním objednávky alebo odporučením priateľom, cloud VPS pre vývojárov od 4.99 USD, jedinečný analóg serverov základnej úrovne, ktorý sme pre vás vymysleli: Celá pravda o VPS (KVM) E5-2697 v3 (6 jadier) 10GB DDR4 480GB SSD 1Gbps od 19 USD alebo ako zdieľať server? (k dispozícii s RAID1 a RAID10, až 24 jadier a až 40 GB DDR4).

Dell R730xd 2 krát lacnejší v dátovom centre Equinix Tier IV v Amsterdame? Len tu 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 USD v Holandsku! Dell R420 – 2x E5-2430 2.2 GHz 6C 128 GB DDR3 2 x 960 GB SSD 1 Gb/s 100 TB – od 99 USD! Čítať o Ako vybudovať infraštruktúru spol. triedy s využitím serverov Dell R730xd E5-2650 v4 v hodnote 9000 XNUMX eur za cent?

Zdroj: hab.com

Pridať komentár