Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Alexey Naydenov, CEO ITooLabs, schwätzt iwwer d'Entwécklung vun enger Telekommunikatiounsplattform fir Telekomoperateuren an der Go (Golang) Programméiersprooch. Alexey deelt och seng Erfarung beim Ofbau an der Operatioun vun der Plattform an engem vun de gréissten asiateschen Telekomoperateuren, déi d'Plattform benotzt hunn fir Voice Mail Servicer (VoiceMail) a Virtual PBX (Cloud PBX) ze bidden.

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Alexey Naydenov (nach – AN): - Moien alleguer! Mäin Numm ass Alexey Naydenov. Ech sinn den Direkter vun ITooLabs. Als éischt wëll ech äntweren wat ech hei maachen a wéi ech hei ukomm sinn.

Wann Dir de Bitrix24 Maartplaz kuckt (Sektioun "Telefonie"), da sinn 14 Uwendungen an 36 déi do sinn (40%) eis:

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Méi genee, dat sinn eis Bedreiwer Partner, mä hannert all deem ass eis Plattform (Plattform als Service) - wat mir hinnen fir e klenge Penny verkafen. Eigentlech wéilt ech iwwer d'Entwécklung vun dëser Plattform schwätzen a wéi mir op Go komm sinn.

D'Zuelen fir eis Plattform elo:

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

44 Bedreiwer Partner, dorënner Megafon. Allgemeng schwätze mir wierklech gär op verschidden Aventuren, a mir hunn tatsächlech Zougang zu 100 Milliounen Abonnente vu 44 Betreiber hei a Russland. Dofir, wann iergendeen Affär Iddien huet, wäerte mir ëmmer frou hinnen ze lauschteren.

  • 5000 Benotzer Betriber.
  • 20 Abonnenten am Ganzen. Dëst ass alles b000b - mir schaffen nëmme mat Firmen.
  • 300 Uriff pro Minutt am Dag.
  • 100 Millioune Ruffminuten d'lescht Joer (mir hu gefeiert). Dëst berücksichtegt net intern Verhandlungen déi op eiser Plattform verfügbar sinn.

Wéi huet et ugefaang?

Wéi fänken déi richteg Dudes iwwerhaapt un hir Plattform ze maachen? Mir mussen och Rechnung droen datt mir eng Geschicht vun der Entwécklung vun "Hardcore Enterprise" hunn, an och zu der präzisster Zäit vum Joer fir eng Entreprise! Et war déi glécklech Zäit wann Dir bei de Client kommt a seet: "Mir brauchen e puer méi Serveren." An de Client: "Keng Fro! Mir hunn zéng am Rack."

Also hu mir Oracle, Java, WebSphere, Db2 an all déi Saachen gemaach. Dofir hu mir natierlech déi bescht Verkeeferléisungen geholl, se integréiert a probéiert domat ofzegoen. Mir sinn alleng zu Fouss gaangen. Dëst wier esou en internen Startup.

All dëst huet tatsächlech am Joer 2009 ugefaang. Zënter 2006 si mir enk u Bedreiwerléisungen involvéiert, déi eng oder aner Manéier. Mir hunn e puer personaliséiert virtuell PBXs gemaach (wéi déi mir elo op Bestellung hunn): mir hunn et gekuckt, decidéiert datt et gutt war, an hunn decidéiert en internen Startup ze starten.

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Mir hunn VMWare geholl. Well mir eleng waren, hu mir direkt de coole Verkeefer Storage missen opginn. Mir wëssen alles iwwer si: datt Versprieche musse mat 3 gedeelt ginn, an d'Käschte musse mat 10 multiplizéiert ginn. Dofir hunn se DirDB gemaach a sou weider.

Dunn huet et ugefaang ze wuessen. Dobäi koum e Billing-Service dobäi, well d'Plattform net méi eens konnt. Dunn ass de Rechnungsserver vu MySQL op Mongo geplënnert. Als Resultat hu mir eng funktionéierend Léisung kritt déi all Uriff veraarbecht déi dohinner goen:

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Awer iergendwou do, bannen, dréint dee selwechte Verkeeferprodukt - den Haapt, nuklearen, dee mir eemol geholl hunn. Géint Enn 2011 hu mir gemierkt, datt den Haaptfläschenhals fir eis, natierlech, dëst besonnescht Produkt wier - mir géifen dran stoen. Mir hunn eng Mauer virun eis gesinn, an déi mir a voller Galopp gelaf sinn, wéi ëmmer méi Clientë kommen.
Deementspriechend hu mir missen eppes maachen. Natierlech hu mir zimmlech vill Fuerschung iwwer verschidde Produkter gemaach - souwuel Open Source wéi och Verkeefer. Ech wäert elo net op dëst ophalen - dat ass net wat mir schwätzen. Déi ganz lescht Réckfalloptioun, déi mir geduecht hunn, war eis eege Plattform ze maachen.

Schlussendlech si mir op dës Optioun komm. Firwat? Well all Verkeefer an Open Source Produkter goufen gemaach fir Problemer ze léisen déi 10 Joer al waren. Gutt, wann 10 Joer al, an e puer méi! De Choix gouf eis offensichtlech: entweder mir Äddi eis super Iddi vun engem ideale Service (fir Partner, Bedreiwer an eis selwer), oder mir maachen eppes vun eis selwer.

Mir hu beschloss eppes selwer ze maachen!

Plattform Ufuerderunge

Wann Dir eppes fir eng laang Zäit gemaach hutt (mat engem aneren säi Produkt), da formt sech de Gedanke lues a lues an Ärem Kapp: wéi géif ech dat selwer maachen? Well mir all Programméierer an der Firma sinn (ausser fir Verkeefer, et gi keng Net-Programméierer), hunn eis Ufuerderunge viru laanger Zäit entwéckelt, a si waren kloer:

  1. Héich Entwécklung Vitesse. De Verkeeferprodukt deen eis gefoltert huet war net zefriddestellend, éischtens, well alles laang a lues erausgaang ass. Mir wollten et séier - mir hate vill Iddien! Mir hunn nach vill Iddien, mee dunn war d'Lëscht vun den Iddien esou datt et wéi zéng Joer viraus ausgesäit. Elo nëmmen fir ee Joer.
  2. Maximal Notzung vu Multi-Core Eisen. Dat war och wichteg fir eis, well mer gesinn hunn, datt et just ëmmer méi Käre géife ginn.
  3. Héich Zouverlässegkeet. Eppes mat deem mir och gekrasch hunn.
  4. Héich Resistenz géint Feeler.
  5. Mir wollten mat engem Prozess vun deegleche Verëffentlechungen ophalen. Dofir brauche mir e Sproochewahl.

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Deementspriechend wuessen d'Ufuerderungen un d'Sprooch op eng kloer logesch Manéier aus den Ufuerderunge vum Produkt, déi mir eis selwer gesat hunn.

  1. Wa mir Ënnerstëtzung fir Multi-Core Systemer wëllen, da brauche mir Ënnerstëtzung fir parallel Ausféierung.
  2. Wa mir Entwécklungsgeschwindegkeet brauchen, brauche mir eng Sprooch déi kompetitiv Entwécklung ënnerstëtzt, kompetitiv Programméierung. Wann iergendeen den Ënnerscheed net begéint ass, ass et ganz einfach:
    • Parallel Programméiere geet iwwer wéi zwee verschidde Threads op verschiddene Kären ausgefouert ginn;
    • Concurrent Ausféierung, oder méi präzis, Concurrency Support, ass iwwer wéi eng Sprooch (oder Runtime, et ass egal) hëlleft all d'Komplexitéit ze verstoppen déi aus der paralleler Ausféierung kënnt.
  3. Héich Stabilitéit. Natierlech brauche mir e Stärekoup, an e bessere wéi mir um Produkt vum Verkeefer haten.

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Mir haten net wierklech sou vill Méiglechkeeten, wann Dir Iech erënnert. Als éischt, Erlang - mir hunn et gär a wëssen et, et war mäi perséinlechen, perséinleche Favorit. Zweetens, Java ass net emol Java, awer speziell Scala. Drëttens eng Sprooch, déi mir deemools guer net kannt hunn - Go. Et war deemools erschéngen, oder besser gesot, et gouf et scho ronn zwee Joer, awer nach net erauskomm.

Gitt gewonnen!

Geschicht vun Go

Mir hunn eng Plattform drop gemaach. Ech wäert probéieren ze erklären firwat.

Eng kuerz Geschicht vu Go. Et huet am Joer 2007 ugefaang, am Joer 2009 opgemaach, déi éischt Versioun gouf am Joer 2012 verëffentlecht (dat ass, mir hunn ugefaang och virun der éischter Verëffentlechung ze schaffen). Den Initiator war Google, deen, wéi ech verdächteg, Java wollt ersetzen.

D'Auteuren si ganz berühmt:

  • De Ken Thomson, deen hannert Unix war, erfonnt UTF-8, huet um Plan 9 System geschafft;
  • De Rob Pike, deen UTF-8 mam Ken erfonnt huet, huet och um Plan 9, Inferno, Limbo bei Bell Labs geschafft;
  • De Robert Giesmer, dee mir kennen a gär hunn fir den Java HotSpot Compiler ze erfannen a fir seng Aarbecht um Generator am V8 (Google's Javascript Dolmetscher);
  • An iwwer 700 Mataarbechter, dorënner e puer vun eise Patches.

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Gitt: Éischte Bléck

Mir gesinn datt d'Sprooch méi oder manner einfach a verständlech ass. Mir hunn offensichtlech Typen: an e puer Fäll musse se deklaréiert ginn, an anerer sinn se net néideg (dat heescht datt d'Typen op eng oder aner Manéier ofgeleet ginn).

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Et kann gesi ginn datt et moudesch ass Strukturen ze beschreiwen. Et kann gesi ginn datt mir d'Konzept vun engem Zeiger hunn (wou d'Asterisk ass). Et kann gesi ginn datt et speziell Ënnerstëtzung gëtt fir d'Initialiséierung vun Arrays an assoziativen Arrays ze deklaréieren.

Et ass bal kloer - Dir kënnt liewen. Loosst eis probéieren Hallo Welt ze schreiwen:

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Wat gesi mir? Dëst ass C-ähnlech Syntax, de Semikolon ass fakultativ. Et kann e Separator fir zwou Linnen sinn, awer nëmmen wann dës zwee Konstruktiounen op der selwechter Linn sinn.

Mir gesinn datt Klammeren a Kontrollstrukturen (an der 14. Linn) fakultativ sinn, awer Curly Klammeren sinn ëmmer erfuerderlech. Mir gesinn datt d'Typen statesch ass. Den Tim gëtt meeschtens erausgeholl. Dëst Beispill ass e bësse méi komplizéiert wéi déi üblech Hallo, Welt - just fir ze weisen datt et eng Bibliothéik gëtt.

Wat soss gesi mir dat wichteg ass? De Code ass a Packagen organiséiert. A fir e Package an Ärem eegene Code ze benotzen, musst Dir et mat der Importdirektiv importéieren - dëst ass och wichteg. Mir starten et - et funktionnéiert. Super!

Loosst d'nächst probéieren eppes méi komplizéiert: Hallo, Welt, awer nëmmen elo ass et en http Server. Wat gesi mer hei interessant?

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

Als éischt wierkt d'Funktioun als Parameter. Dat heescht, datt eis Fonktioun "Éischt Klass Bierger" ass an Dir kënnt vill interessant Saachen domat an engem Fonktiounsstil maachen. Als nächst gesi mir eppes onerwaarts: d'Importdirektiv verlinkt direkt op de GitHub Repository. Dat ass richteg, esou ass et - ausserdeem soll et esou gemaach ginn.

Am Go ass den universellen Identifizéierer vun engem Package d'URL vu sengem Repository. Et gëtt e spezielle Goget Utility deen all Ofhängegkeeten erofhuelen, se eroflueden, installéieren, kompiléieren a preparéieren fir ze benotzen wann néideg. Zur selwechter Zäit weess Goget iwwer html-meta. Deementspriechend kënnt Dir en http Verzeechnes halen deen Linken op Äre spezifesche Repository enthält (wéi mir zum Beispill maachen).

Wat gesi mer nach? Http an Json an der Standardbibliothéik. Et gëtt selbstverständlech Introspektioun - Reflexioun, déi an der Kodéierung / json benotzt soll ginn, well mir einfach en arbiträren Objet ersetzen.

Mir lafen et a gesinn datt mir nëtzlech Code an 20 Zeilen hunn, deen déi aktuell duerchschnëttlech Belaaschtung vun der Maschinn kompiléiert, leeft a bericht (op der Maschinn op där se lancéiert gëtt).
Wat ass nach wichteg, wat mir hei direkt gesinn? Et ass an eng statesch binär (buinär) zesummegesat. Dëse Binär huet guer keng Ofhängegkeeten, keng Bibliothéiken! Dir kënnt et op all System kopéieren, direkt lafen, an et funktionnéiert.

Weider goen.

Go: Methoden an Interfaces

Go huet Methoden. Dir kënnt eng Method fir all personaliséiert Typ deklaréieren. Ausserdeem ass dëst net onbedéngt eng Struktur, awer vläicht en Alias ​​vun iergendenger Aart. Dir kënnt en Alias ​​​​fir N32 deklaréieren a Methoden schreiwen fir et eppes nëtzlech ze maachen.

An hei fale mir fir d'éischte Kéier an d'Stëmmung ... Et stellt sech eraus datt Go keng Klassen als solch huet. Déi, déi Go kennen, kënne soen datt et Typinklusioun gëtt, awer dat ass eppes ganz anescht. Wat méi séier en Entwéckler ophält et als Ierfschaft ze denken, wat besser. Et gi keng Klassen am Go, an et gëtt och keng Ierfschaft.

Fro! Wat huet d'Firma vun Autoren gefouert vu Google eis ginn fir d'Komplexitéit vun der Welt ze reflektéieren? Si hunn eis Interfaces ginn!

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

En Interface ass e speziellen Typ deen Iech erlaabt einfach Methoden, Method Ënnerschrëften ze schreiwen. Weider, all Typ fir déi dës Methoden existéieren (ausgefouert ginn) entsprécht dëser Interface. Dat heescht, datt Dir einfach déi entspriechend Funktioun fir een Typ beschreiwen kann, fir eng aner (wat zu deem Interface Typ entsprécht). Nächst, deklaréiert eng Variabel vun der Aart vun dëser Interface an zielt iergendeng vun dësen Objeten un.

Fir Hardcore Fans kann ech soen datt dës Variabel tatsächlech zwee Hiweiser wäert hunn: een op d'Daten, deen aneren op eng speziell Tabell vun Deskriptoren, déi typesch fir dës speziell Zort ass, fir den Interface vun dësem Typ. Dat ass, de Compiler erstellt sou Deskriptortabellen zur Zäit vum Link.

An am Go, natierlech, ginn et Hiweiser fir ongëlteg. D'Wuert Interface {} (mat zwee Curly Klameren) ass eng Variabel déi Iech erlaabt Iech am Prinzip op all Objet ze weisen.
Bis elo ass alles gutt, alles ass vertraut. Näischt iwwerraschend.

Gitt: Goroutinen

Elo komme mer zu deem wat eis interesséiert: Liichtgewiicht Prozesser - Goroutinen (Goroutinen) an der Go Terminologie.

Alexey Naydenov. ITooLabs. Fall vun Entwécklung op Go (Golang) Telefon Plattform. Deel 1

  1. Als éischt si se wierklech liicht (manner wéi 2 KB).
  2. Zweetens, d'Käschte fir esou eng Goroutine ze kreéieren sinn negligibel: Dir kënnt eng Tausend vun hinnen pro Sekonn erstellen - näischt wäert geschéien.
  3. Si gi vun hiren eegene Scheduler zerwéiert, deen einfach d'Kontroll vun enger Goroutine an en anert iwwerdréit.
  4. An dësem Fall gëtt d'Kontroll an de folgende Fäll iwwerdroen:
    • wann de Go Ausdrock begéint ass (wann d'Goroutine déi nächst Goroutine ufänkt);
    • wann e blockéierend Input / Out Call aktivéiert ass;
    • wann Dreckstipp ufänkt;
    • wann e puer Operatioun mat Channels lancéiert.

Dat ass, wann ëmmer e Go Programm op engem Computer leeft, bestëmmt et d'Zuel vun de Kären am System, lancéiert esou vill Threads wéi néideg (wéivill Käre sinn am System oder wéivill Dir et gesot hutt). Deementspriechend wäert de Scheduler dës liicht Ausféierungsfäegkeeten op all dës Betribssystem thread an all Kär lafen.

Et sollt bemierkt datt dëst de effektivste Wee ass fir Eisen ze benotzen. Zousätzlech zu deem wat gewise gëtt, maache mir vill méi. Mir maachen, zum Beispill, DPI Systemer déi eng Eenheet erlaben 40 Gigabit ze déngen (je no wat an dëse Linnen geschitt).

Do, och virum Go, hu mir genee datselwecht Schema fir genee dëse Grond benotzt: well et eis erlaabt d'Lokalitéit vum Prozessor Cache ze erhaalen an d'Zuel vun OS Kontextschalter wesentlech ze reduzéieren (wat och vill Zäit brauch). Ech widderhuelen: dëst ass den effektivste Wee fir Eisen ze benotzen.

Dëst einfacht 21 Zeil Beispill ass e Beispill dat einfach Echo-Server mécht. Maacht weg datt d'Servefunktioun extrem einfach ass, et ass linear. Et gëtt kee Réckruff, kee Besoin fir ze stéieren an ze denken ... Dir liest a schreift just!

Zur selwechter Zäit, wann Dir liest a schreift, sollt et tatsächlech blockéieren - dës Goroutine gëtt einfach an eng Schlaang gesat a vum Scheduler geholl wann d'Ausféierung erëm méiglech ass. Dat ass, dësen einfache Code kann als Echo-Server fir sou vill Verbindungen handelen wéi d'OS op där Maschinn erlaabt.

Ganz geschwënn weiderféieren...

Puer Annoncen 🙂

Merci datt Dir bei eis bleift. Hutt Dir eis Artikelen gär? Wëllt Dir méi interessant Inhalt gesinn? Ënnerstëtzt eis andeems Dir eng Bestellung maacht oder Frënn empfeelt, Cloud VPS fir Entwéckler vun $ 4.99, en eenzegaartegen Analog vun Entry-Level Serveren, dee vun eis fir Iech erfonnt gouf: Déi ganz Wourecht iwwer VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps vun $19 oder wéi een e Server deelt? (verfügbar mat RAID1 an RAID10, bis zu 24 Kären a bis zu 40GB DDR4).

Dell R730xd 2 Mol méi bëlleg an Equinix Tier IV Daten Zentrum zu Amsterdam? Nëmmen hei 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV vun $199 an Holland! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - vun $99! Liest iwwer Wéi bauen ech Infrastructure Corp. Klass mat der Benotzung vun Dell R730xd E5-2650 v4 Serveren Wäert 9000 Euro fir e Penny?

Source: will.com

Setzt e Commentaire