Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Alexey Naidenov, generální ředitel ITooLabs, hovoří o vývoji telekomunikační platformy pro telekomunikační operátory v programovacím jazyce Go (Golang). Alexey také sdílí své zkušenosti s nasazením a provozem platformy u jednoho z největších asijských telekomunikačních operátorů, který platformu používal k poskytování služeb hlasové pošty (VoiceMail) a virtuální PBX (Cloud PBX).

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Alexey Naydenov (dále - AN): - Ahoj všichni! Jmenuji se Alexey Naidenov. Jsem ředitelem ITooLabs. Nejprve bych rád odpověděl, co tady dělám a jak jsem se tu ocitl.

Když se podíváte na Bitrix24 Marketplace (sekce „Telefonie“), tak 14 aplikací a 36, ​​které tam jsou (40 %), jsme my:

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Přesněji jsou to naši partnerští operátoři, ale za tím vším je naše platforma (Platforma jako služba) - to, co jim prodáváme za malý peníz. Vlastně bych chtěl mluvit o vývoji této platformy ao tom, jak jsme přišli na Go.

Čísla pro naši platformu jsou nyní:

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

44 partnerských operátorů, včetně MegaFonu. Obecně řečeno, rádi vyrážíme za dobrodružstvím a ve skutečnosti máme přístup ke 100 milionům předplatitelů 44 operátorů zde v Rusku. Proto, pokud má někdo nějaké podnikatelské nápady, vždy si je rádi vyslechneme.

  • 5000 uživatelských společností.
  • Celkem 20 000 odběratelů. Všechno je to b2b – spolupracujeme pouze s firmami.
  • 300 hovorů za minutu během dne.
  • 100 milionů minut volání v loňském roce (slavili jsme). A to bez ohledu na interní jednání, která probíhají na naší platformě.

Jak to začalo?

Jak začnou ti správní chlapi vytvářet vlastní platformu? Měli bychom také vzít v úvahu, že jsme měli historii vývoje „hardcore enterprise“, a to dokonce v nejpřesnějším období roku pro podnik! Byl to ten šťastný čas, kdy přijdete k zákazníkovi a řeknete: "Potřebujeme pár dalších serverů." A zákazník: „Ano, žádná otázka! Máme ve stojanu desítku.

Takže jsme udělali Oracle, Java, WebSphere, Db2 a vše ostatní. Proto jsme samozřejmě vzali nejlepší řešení od výrobců, integrovali je a pokusili se s tím vzlétnout. Hráli sami. Byl by to takový interní startup.

Všechno to začalo v roce 2009. Od roku 2006 se tak či onak úzce podílíme na rozhodování operátorů. Udělali jsme několik vlastních virtuálních pobočkových ústředen (jako ty, které máme nyní na zakázku): podívali jsme se, usoudili, že je to dobré, a rozhodli jsme se rozhýbat interní startup.

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Vezměte VMWare. Vzhledem k tomu, že jsme chodili po svých, museli jsme okamžitě opustit cool prodejce Storage. Víme o nich všechno: že sliby by se měly dělit 3 a náklady by se měly násobit 10. Proto jsme udělali DirDB a tak dále.

Pak to začalo růst. K tomu byla přidána fakturační služba, protože platforma už nezvládala. Poté se fakturační server z MySQL přesunul do Mongo. V důsledku toho jsme získali funkční řešení, které zpracovává všechny hovory, které tam jdou:

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Ale někde tam uvnitř se točí stejný produkt dodavatele – ten hlavní, jaderný, který jsme kdysi vzali. Přibližně ke konci roku 2011 jsme si sami uvědomili, že hlavním úzkým hrdlem pro nás bude samozřejmě právě tento produkt – na ten narazíme. Viděli jsme před sebou zeď, do které jsme nabíhali plným cvalem, jak zákazníci chodili, přidávali se.
Proto jsme museli něco udělat. Samozřejmě jsme provedli poměrně velký průzkum různých produktů – jak open source, tak těch od výrobců. Nebudu se tím teď zabývat – o to nejde. Úplně poslední záložní možností, o které jsme přemýšleli, bylo vytvoření vlastní platformy.

Nakonec jsme dospěli k této možnosti. Proč? Protože všechny produkty výrobců a open source byly vyrobeny tak, aby řešily problémy před 10 lety. No, když 10letý, tak ještě něco navíc! Volba se pro nás stala zřejmou: buď se rozloučíme s naší skvělou myšlenkou ideální služby (pro partnery, operátory i nás samých), nebo uděláme něco vlastního.

Rozhodli jsme se udělat něco jiného!

Požadavky na platformu

Pokud něco děláte po dlouhou dobu (vykořisťujete cizí produkt), pak se vám v hlavě pomalu rodí myšlenka: jak bych to udělal já? Vzhledem k tomu, že jsme ve firmě všichni programátoři (kromě prodejců tu nejsou žádní neprogramátoři), naše požadavky se formovaly dlouho a byly jasné:

  1. Vysoká rychlost vývoje. Produkt dodavatele, který nás potrápil, nám nevyhovoval především proto, že vše fungovalo dlouho a pomalu. Chtěli jsme rychle – měli jsme spoustu nápadů! Stále máme spoustu nápadů, ale ten seznam nápadů byl takový, že to vypadalo na deset let dopředu. Nyní pouze na rok.
  2. Maximální využití vícejádrového železa. I to pro nás bylo důležité, protože jsme viděli, že jader bude jen přibývat.
  3. Vysoká spolehlivost. Ten, u kterého jsme plakali také.
  4. Vysoká odolnost proti poruchám.
  5. Chtěli jsme skončit s každodenním procesem vydávání. K tomu jsme potřebovali volbu jazyka.

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Podle toho z požadavků na produkt, které jsme si sami představili, jasně logicky vyrůstají požadavky na jazyk.

  1. Pokud chceme podporu pro vícejádrové systémy, pak potřebujeme podporu pro paralelní spouštění.
  2. Pokud potřebujeme rychlost vývoje, potřebujeme jazyk, který podporuje konkurenční vývoj, konkurenční programování. Pokud se někdo nesetkal s rozdílem, pak je to velmi jednoduché:
    • paralelní programování je o tom, jak dvě různá vlákna běží na různých jádrech;
    • souběžné spouštění, konkrétněji podpora souběžnosti, je o tom, jak jazyk (nebo běhové prostředí, cokoliv) pomáhá skrýt veškerou složitost, která pochází z paralelního spouštění.
  3. Vysoká stabilita. Je zřejmé, že jsme potřebovali cluster a ten byl lepší než ten, který jsme měli na produktu dodavatele.

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Opravdu jsme neměli mnoho možností, pokud si vzpomínáte. Za prvé, Erlang - milujeme ho a známe to, byl to můj osobní, osobní favorit. Za druhé, Java ani není Java, ale konkrétně Scala. Za třetí, jazyk, který jsme v té době vůbec neznali - Go. Tehdy se teprve objevil, přesněji už existoval asi dva roky, ale ještě nebyl vydán.

Poražení Jdi!

Historie Go

Udělali jsme na něm platformu. Pokusím se vysvětlit proč.

Stručná historie Go. Zahájeno v roce 2007, otevřeno v roce 2009, první verze vyšla v roce 2012 (to znamená, že jsme začali pracovat ještě před prvním vydáním). Iniciátorem byl Google, který chtěl nahradit, jak tuším, Javu.

Autoři jsou velmi známí:

  • Ken Thomson, který stál za Unixem, vynalezl UTF-8, pracoval na systému Plan 9;
  • Rob Pike, který navrhl UTF-8 s Kenem, také pracoval na plánu 9, Inferno, Limbo v Bell Labs;
  • Robert Gizmer, kterého známe a máme rádi za vynález Java HotSpot Compiler a za práci na generátoru ve V8 (překladač Javascriptu od Googlu);
  • A přes 700 přispěvatelů, včetně některých našich patchů.

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Podívejte se na první pohled

Vidíme, že jazyk je víceméně jednoduchý a srozumitelný. Máme jasné typy: v některých případech je třeba je deklarovat, v jiných ne (to znamená, že typy jsou stejně odvozeny).

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Je vidět, že je módní popisovat struktury. Je vidět, že máme koncept ukazatele (kde je hvězdička). Je vidět, že existuje speciální podpora pro deklaraci inicializace polí a asociativních polí.

Zhruba pochopitelné – žít se dá. Snažím se napsat Ahoj, světe:

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

co vidíme? Toto je syntaxe podobná C, středník je volitelný. Může to být oddělovač pro dva řádky, ale pouze v případě, že se jedná o dva konstrukty, které jsou přesně na stejném řádku.

Vidíme, že závorky v řídicích strukturách (na 14. řádku) jsou volitelné, ale složené závorky jsou vždy povinné. Vidíme, že psaní je statické. Tim se ve většině případů zobrazuje. Tento příklad je o něco složitější než obvyklý Hello, world - jen pro ukázku, že existuje knihovna.

Co ještě vidíme důležitého? Kód je uspořádán do balíčků. A abyste mohli balíček použít ve svém vlastním kódu, musíte jej importovat pomocí direktivy import – to je také důležité. Začínáme - funguje to. Skvělý!

Zkusme něco složitějšího: Ahoj světe, ale teď je to http server. Co zde vidíme zajímavého?

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Za prvé, funkce funguje jako parametr. To znamená, že funkce, kterou máme, je „prvotřídní občan“ a můžete s ní dělat spoustu zajímavých věcí ve funkčním stylu. Dále vidíme neočekávané: direktiva import odkazuje přímo na úložiště GitHub. Přesně tak, tak to je – navíc se to tak má dělat.

V Go je univerzálním identifikátorem balíčku adresa URL jeho úložiště. Existuje speciální nástroj Goget, který projde všechny závislosti, stáhne je, nainstaluje, zkompiluje a v případě potřeby připraví k použití. Přitom Goget o html-meta ví. V souladu s tím si můžete ponechat adresář http, který bude obsahovat odkazy na vaše konkrétní úložiště (jako to děláme například my).

Co ještě vidíme? Http a Json v běžné knihovně. Samozřejmě existuje introspekce - reflexe, která by měla být použita v kódování / json, protože za ni jednoduše nahradíme nějaký libovolný objekt.

Spustíme to a uvidíme, že máme 20 řádků užitečného kódu, který se zkompiluje, spustí a udává aktuální průměrné zatížení stroje (na stroji, na kterém běží).
Co dalšího je důležité z toho, co zde můžeme hned vidět? Zkompiluje se do jednoho statického binárního souboru (buinary). Tento binární soubor nemá vůbec žádné závislosti, žádné knihovny! Lze jej zkopírovat do libovolného systému, okamžitě spustit a bude fungovat.

Dál.

Přejít: metody a rozhraní

Go má metody. Můžete deklarovat metodu pro jakýkoli vlastní typ. Navíc to nemusí být nutně struktura, ale může to být alias nějakého typu. Můžete deklarovat alias pro N32 a psát pro něj metody, aby udělal něco užitečného.

A tady poprvé upadáme do strnulosti... Ukazuje se, že Go nemá třídy jako takové. Ti, kteří znají Go, možná říkají, že existuje typová inkluze, ale tohle je úplně jiné. Čím dříve to vývojář přestane považovat za dědictví, tím lépe. V Go nejsou žádné třídy a není zde ani žádné dědictví.

Otázka! Co nám dala společnost autorů v čele s Googlem, aby ukázala složitost světa? Dostali jsme rozhraní!

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

Rozhraní je speciální typ, který umožňuje psát jednoduché metody, podpisy metod. Dále bude tomuto rozhraní odpovídat jakýkoli typ, pro který tyto metody existují (jsou prováděny). To znamená, že můžete jednoduše napsat odpovídající funkci pro jeden typ, pro jiný (který odpovídá danému typu rozhraní). Dále deklarujte proměnnou typu tohoto rozhraní a přiřaďte jí libovolný z těchto objektů.

Pro zaryté fanoušky mohu říci, že tato proměnná bude ve skutečnosti obsahovat dva ukazatele: jeden na data, druhý na speciální tabulku deskriptorů, která je specifická pro tento konkrétní typ, na rozhraní tohoto typu. To znamená, že kompilátor vytváří takové tabulky deskriptorů v okamžiku propojení.

A v Go jsou samozřejmě ukazatele na zrušení platnosti. Slovo interface {} (se dvěma složenými závorkami) je proměnná, která vám v principu umožňuje ukázat na jakýkoli objekt.
Zatím je vše v pořádku, vše je znát. Nic překvapivého.

Jdi: gorutiny

Nyní se dostáváme k tomu, co nás zajímá: odlehčené procesy - goroutines (goroutines) v terminologii Go.

Alexej Naidenov. ITooLabs. Vývojové pouzdro na telefonní platformě Go (Golang). Část 1

  1. Za prvé, jsou opravdu lehké (méně než 2 Kb).
  2. Za druhé, náklady na vytvoření takové goroutiny jsou zanedbatelné: můžete jich vytvořit tisíc za vteřinu – nic se nestane.
  3. Obsluhuje je vlastní plánovač, který jednoduše přenáší řízení z jedné goroutiny do druhé.
  4. V tomto případě je řízení převedeno v následujících případech:
    • pokud je nalezen příkaz go (pokud goroutina začíná další goroutine);
    • pokud je povoleno blokování Input/Out volání;
    • pokud je spuštěn sběr odpadu;
    • pokud je spuštěna nějaká operace s kanály.

To znamená, že kdykoli je na počítači spuštěn program Go, zjistí počet jader v systému a spustí tolik vláken, kolik je potřeba (kolik jader je v systému nebo kolik jste mu řekli). V souladu s tím plánovač spustí tato odlehčená vlákna provádění na všech těchto vláknech operačního systému v každém jádře.

Je třeba poznamenat, že je to nejúčinnější způsob využití železa. Kromě toho, co jsme ukázali, děláme mnohem víc. Vyrábíme například DPI systémy, které umožňují obsloužit 40 gigabitů v jedné jednotce (podle toho, co se v těchto linkách děje).

Tam jsme ještě před Go použili úplně stejné schéma právě z tohoto důvodu: protože umožňuje uložit umístění mezipaměti procesoru, výrazně snížit počet přepínačů kontextu OS (což také trvá velmi dlouho). Opakuji: toto je nejúčinnější způsob využití železa.

Tento jednoduchý 21řádkový příklad je příkladem, který jednoduše dělá echo-server. Zároveň si všimněte, že funkce podávání je extrémně jednoduchá, je lineární. Neexistují žádná zpětná volání, není třeba se obtěžovat a přemýšlet... Stačí číst a psát!

Zároveň, pokud čtete a zapisujete, mělo by se to ve skutečnosti zablokovat - tato rutina je jednoduše zařazena do fronty a převzata plánovačem, když je spuštění opět možné. To znamená, že tento jednoduchý kód může fungovat jako echo server pro tolik připojení, kolik OS na tomto počítači dovolí.

Pokračování již brzy...

Nějaké inzeráty 🙂

Děkujeme, že s námi zůstáváte. Líbí se vám naše články? Chcete vidět více zajímavého obsahu? Podpořte nás objednávkou nebo doporučením přátelům, cloud VPS pro vývojáře od 4.99 $, jedinečný analog serverů základní úrovně, který jsme pro vás vymysleli: Celá pravda o VPS (KVM) E5-2697 v3 (6 jader) 10GB DDR4 480GB SSD 1Gbps od 19 $ nebo jak sdílet server? (k dispozici s RAID1 a RAID10, až 24 jader a až 40 GB DDR4).

Dell R730xd 2krát levnější v datovém centru Equinix Tier IV v Amsterdamu? Pouze zde 2 x Intel TetraDeca-Core Xeon 2 x E5-2697v3 2.6 GHz 14C 64 GB DDR4 4 x 960 GB SSD 1 Gbps 100 TV od 199 USD V Nizozemsku! Dell R420 – 2x E5-2430 2.2 GHz 6C 128 GB DDR3 2 x 960 GB SSD 1 Gb/s 100 TB – od 99 $! Číst o Jak budovat infrastrukturu corp. třídy s využitím serverů Dell R730xd E5-2650 v4 v hodnotě 9000 XNUMX eur za cent?

Zdroj: www.habr.com

Přidat komentář