Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Alexey Naidenov, CEO ITooLabs, fertelt oer de ûntwikkeling fan in telekommunikaasjeplatfoarm foar telekomoperators yn 'e programmeartaal Go (Golang). Alexey dielt ek syn ûnderfining fan it ynsetten en operearjen fan it platfoarm yn ien fan 'e grutste Aziatyske telekomoperators, dy't it platfoarm brûkte om voicemail (VoiceMail) en Virtual PBX (Cloud PBX) tsjinsten te leverjen.

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Alexey Naydenov (hjirnei - AN): - Hoi allegearre! Myn namme is Alexey Naidenov. Ik bin de direkteur fan ITooLabs. Earst wol ik antwurdzje wat ik hjir doch en hoe't ik hjir telâne kaam.

As jo ​​​​nei de Bitrix24 Marketplace (seksje "Telefony") sjogge, dan binne 14 applikaasjes en 36 dy't der binne (40%) ús:

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Mear krekter, dit binne ús partneroperators, mar efter dit alles is ús platfoarm (Platform as a Service) - wat wy har ferkeapje foar in lytse penny. Eins wol ik graach prate oer de ûntwikkeling fan dit platfoarm en hoe't wy by Go kamen.

De nûmers foar ús platfoarm binne no:

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

44 partner operators, ynklusyf MegaFon. Yn 't algemien hâlde wy fan aventoeren te gean, en wy hawwe eins tagong ta 100 miljoen abonnees fan 44 operators hjir yn Ruslân. Dêrom, as immen wat saaklike ideeën hat, binne wy ​​altyd bliid om nei har te harkjen.

  • 5000 brûkersbedriuwen.
  • 20 abonnees yn totaal. It is allegear b000b - wy wurkje allinich mei bedriuwen.
  • 300 oproppen per minuut oerdeis.
  • 100 miljoen opropminuten ferline jier (wy fierden). Dit is sûnder rekken te hâlden mei de ynterne ûnderhannelings dy't op ús platfoarm binne.

Hoe begûn it?

Hoe begjinne de juste dudes har eigen platfoarm te meitsjen? Wy moatte ek rekken hâlde dat wy in skiednis hiene fan 'hardcore enterprise' ûntwikkeling, en sels op 'e meast krekte tiid fan it jier foar in ûndernimming! It wie dy lokkige tiid as jo by de klant komme en sizze: "Wy hawwe noch in pear tsjinners nedich." En de klant: “Ja, gjin fraach! Wy hawwe in tsien yn it rek.

Dat wy diene Oracle, Java, WebSphere, Db2 en dat alles. Dêrom, wy namen, fansels, de bêste ferkeaper oplossings, yntegrearre se en besocht te nimmen ôf mei it. Se spile op har eigen. It soe sa'n ynterne opstart wêze.

It begon allegear yn 2009. Sûnt 2006 binne wy ​​op ien of oare manier nau belutsen by besluten fan operators. Wy makken ferskate oanpaste firtuele PBX's (lykas wat wy no op bestelling hawwe): wy seagen, besletten dat it goed wie, en besletten in ynterne opstart op te roppen.

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Nim VMWare. Sûnt wy rûnen op ús eigen, wy moasten fuortendaliks ferlitte de koele ferkeaper Storage. Wy witte alles oer har: dat beloften moatte wurde dield troch 3, en de kosten moatte wurde fermannichfâldige mei 10. Dêrom hawwe wy DirDB en sa dien.

Doe begûn it te groeien. Dêr kaam de billingtsjinst oan ta, omdat it platfoarm it net mear oan koe. Doe ferhuze de faktureserver fan MySQL nei Mongo. As gefolch hawwe wy in wurkjende oplossing krigen dy't alle oproppen ferwurket dy't dêr hinne gean:

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Mar earne binnen draait itselde ferkeaperprodukt - de wichtichste, nukleêre, dy't wy ienris hawwe nommen. Likernôch oan 'e ein fan 2011, wy realisearre foar ússels dat de wichtichste knyppunt foar ús, fansels, sil wêze dit bysûndere produkt - wy sille tsjinkomme. Wy seagen in muorre foar ús, dêr't wy rûnen yn folle galop, as klanten rûnen, waard tafoege.
Dêrtroch moasten wy wat dwaan. Fansels hawwe wy in soad ûndersyk dien nei ferskate produkten - sawol iepen boarne as ferkeapers. Dêr sil ik no net oer stilhâlde - dat is net it punt. De alderlêste fallback dêr't wy oan tochten wie ús eigen platfoarm te meitsjen.

Uteinlik kamen wy ta dizze opsje. Wêrom? Omdat alle ferkeaper en iepen boarne produkten binne makke om problemen op te lossen 10 jier lyn. No, as in 10-jierrige, en wat mear! De kar is foar ús fanselssprekkend wurden: of wy nimme ôfskie fan ús geweldige idee fan in ideale tsjinst (foar partners, operators en ússels), of wy dogge wat fan ússels.

Wy besletten wat oars te dwaan!

Platfoarm easken

As jo ​​​​lang wat dogge (jo eksploitearje it produkt fan in oar), dan ûntstiet de gedachte stadichoan yn jo holle: hoe soe ik it sels dwaan? Sûnt wy binne allegear programmeurs yn it bedriuw (útsein ferkeapers, der binne gjin net-programmers), ús easken binne foarme foar in lange tiid, en se wiene dúdlik:

  1. Hege ûntwikkeling snelheid. It produkt fan 'e ferkeaper, dy't ús pleage, paste ús yn it foarste plak net, om't alles lang en stadich wurke. Wy woenen fluch - wy hiene in protte ideeën! Wy hawwe noch in soad ideeën, mar doe wie de list mei ideeën sa dat it tsien jier foarút like. No noch mar in jier.
  2. Maksimum benutten fan multi-core izer. Dat wie ek wichtich foar ús, want wy seagen dat der allinnich mar mear kearnen komme soene.
  3. Hege betrouberens. Dejinge dy't wy ek gûlen.
  4. Hege skuld tolerânsje.
  5. Wy woene einigje mei in deistich frijlittingsproses. Dêrfoar hiene wy ​​in taalkeuze nedich.

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Sadwaande groeie út de easken foar it produkt dy't wy foar ússels presintearre hawwe de easken foar de taal op in dúdlik logyske manier.

  1. As wy stipe wolle foar multi-core systemen, dan hawwe wy stipe nedich foar parallelle útfiering.
  2. As wy ûntwikkelingssnelheid nedich binne, hawwe wy in taal nedich dy't kompetitive ûntwikkeling, kompetitive programmearring stipet. As immen it ferskil net tsjinkaam, dan is it heul ienfâldich:
    • parallelle programmearring giet oer hoe't twa ferskillende triedden rinne op ferskillende kearnen;
    • concurrent útfiering, mear spesifyk concurrency stipe, giet oer hoe't de taal (of runtime, wat dan ek) helpt te ferbergjen alle kompleksiteit dy't komt út parallel útfiering.
  3. Hege stabiliteit. Fansels hiene wy ​​in kluster nedich, en it wie better dan wat wy hiene op it ferkeaperprodukt.

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Wy hienen net echt in protte opsjes, as jo it ûnthâlde. As earste, Erlang - wy hâlde derfan en witte it, it wie myn persoanlike, persoanlike favoryt. Twads is Java net iens Java, mar spesifyk Scala. Tredde, de taal dy't wy yn dy tiid hielendal net koene - Gean. It wie doe krekt ferskynd, mear krekter, it bestie al sa'n twa jier, mar wie noch net útkommen.

Ferslein Go!

Skiednis fan Go

Wy makken der in platfoarm op. Ik sil besykje út te lizzen wêrom.

In koarte skiednis fan Go. Begûn yn 2007, iepene yn 2009, de earste ferzje waard útbrocht yn 2012 (dat is, wy begûn te wurkjen noch foar de earste release). De inisjatyfnimmer wie Google, dy't, sa't ik fermoedzje, Java ferfange woe.

De skriuwers binne tige ferneamd:

  • Ken Thomson, dy't efter Unix wie, útfûn UTF-8, wurke oan it Plan 9-systeem;
  • Rob Pike, dy't UTF-8 ûntwurp mei Ken, wurke ek oan Plan 9, Inferno, Limbo by Bell Labs;
  • Robert Gizmer, dy't wy kenne en leafde foar it útfine fan de Java HotSpot Compiler en foar it wurkjen oan 'e generator yn V8 (de Javascript-interpreter fan Google);
  • En mear as 700 meiwurkers, ynklusyf guon fan ús patches.

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Gean yn ien eachopslach

Wy sjogge dat de taal min of mear ienfâldich en begryplik is. Wy hawwe foar de hân lizzende typen: yn guon gefallen moatte se ferklearre wurde, yn oaren net (dat betsjut dat de typen yn elts gefal ôflei wurde).

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

It kin sjoen wurde dat it moade is om struktueren te beskriuwen. It kin sjoen wurde dat wy it konsept fan in oanwizer hawwe (wêr't de asterisk is). It kin sjoen wurde dat d'r spesjale stipe is foar it ferklearjen fan inisjalisaasje fan arrays en assosjative arrays.

Rûchwei begryplik - jo kinne libje. Besykje te skriuwen Hallo, wrâld:

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Wat sjogge wy? Dit is C-like syntaksis, de puntkomma is opsjoneel. It kin in skieding wêze foar twa rigels, mar allinich as dit twa konstruksjes binne dy't krekt op deselde line binne.

Wy sjogge dat de heakjes yn 'e kontrôlestruktueren (op' e 14e line) opsjoneel binne, mar krullend binne altyd ferplicht. Wy sjogge dat it typen statysk is. Tim wurdt yn de measte gefallen werjûn. Dit foarbyld is wat yngewikkelder dan de gewoane Hallo, wrâld - gewoan om sjen te litten dat d'r in bibleteek is.

Wat oars sjogge wy wichtich? De koade is organisearre yn pakketten. En om it pakket yn jo eigen koade te brûken, moatte jo it ymportearje mei de ymportrjochtline - dit is ek wichtich. Wy begjinne - it wurket. Grut!

Litte wy wat yngewikkelder besykje: Hallo wrâld, mar no is it in http-tsjinner. Wat sjogge wy hjir nijsgjirrich?

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

Earst fungearret de funksje as parameter. Dat betsjut dat de funksje dy't wy hawwe in "first-class boarger" is en dêr kinne jo in protte nijsgjirrige dingen mei dwaan yn in funksjonele styl. Wy sjogge de ûnferwachte folgjende: de ymportrjochtline ferwiist direkt nei it GitHub-repository. Dat kloppet, sa is it - boppedat moat it sa.

Yn Go is de universele identifier fan in pakket de url fan syn repository. D'r is in spesjaal Goget-hulpprogramma dat jildt foar alle ôfhinklikens, downloadt se, ynstallearret se, kompilearret se en taret se foar gebrûk as nedich. Tagelyk wit Goget oer html-meta. Dêrtroch kinne jo in http-map hâlde, dy't keppelings sil befetsje nei jo spesifike repository (lykas wy bygelyks dogge).

Wat sjogge wy oars? Http en Json yn 'e reguliere bibleteek. D'r is, fansels, yntrospeksje - refleksje, dy't moatte wurde brûkt yn kodearring / json, om't wy gewoan in willekeurige objekt foar ferfange.

Wy rinne it en sjogge dat wy 20 rigels fan nuttige koade hawwe dy't kompilearret, rint en jout de hjoeddeistige gemiddelde lading fan 'e masine (op' e masine wêrop it rint).
Wat is oars wichtich fan wat wy hjir daliks sjen kinne? It kompilearret yn ien statyske binêr (buinêr). Dit binêr hat hielendal gjin ôfhinklikens, gjin biblioteken! It kin wurde kopiearre nei elk systeem, rinne fuortendaliks, en it sil wurkje.

Fierder gean.

Gean: metoaden en ynterfaces

Go hat metoaden. Jo kinne in metoade ferklearje foar elk oanpast type. Boppedat is dit net needsaaklik in struktuer, mar kin in alias fan in soarte wêze. Jo kinne in alias foar N32 ferklearje en metoaden skriuwe foar it om wat nuttich te dwaan.

En dit is wêr't wy foar it earst yn in stupor falle ... It docht bliken dat Go gjin lessen hat as sadanich. Dejingen dy't Go kenne kinne sizze dat d'r type opname is, mar dit is folslein oars. Hoe earder de ûntwikkelder ophâldt mei it tinken fan it as erfskip, hoe better. Der binne gjin klassen yn Go, en der is ek gjin erfskip.

Fraach! Wat joech it bedriuw fan auteurs ûnder lieding fan Google ús om de kompleksiteit fan 'e wrâld wer te jaan? Wy hawwe ynterfaces krigen!

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

In ynterface is in spesjale type wêrmei jo te skriuwen ienfâldige metoaden, metoade hântekeningen. Fierder sil elk type wêrfoar dizze metoaden besteane (wurde útfierd) oerienkomme mei dizze ynterface. Dit betsjut dat jo de oerienkommende funksje gewoan skriuwe kinne foar ien type, foar in oar (wat oerienkomt mei dat ynterfacetype). Ferklearje dêrnei in fariabele fan it type fan dizze ynterface en jou ien fan dizze objekten oan.

Foar hardcore fans kin ik sizze dat dizze fariabele eins twa oanwizers sil befetsje: ien nei gegevens, de oare nei in spesjale descriptor-tabel dy't spesifyk is foar dit bepaalde type, nei de ynterface fan dit type. Dat is, de kompilator makket sokke tabellen fan beskriuwers op it momint fan keppeljen.

En d'r binne fansels oanwizings om te leechjen yn Go. De wurdynterface {} (mei twa krullende beugels) is in fariabele wêrmei jo yn prinsipe op elk objekt kinne wize.
Oant no ta is alles yn oarder, alles is fertroud. Neat ferrassend.

Gean: goroutines

No komme wy by wêryn wy ynteressearre binne: lichtgewicht prosessen - goroutines (goroutines) yn Go-terminology.

Alexey Naidenov. ITooLabs. Untwikkelingssaak op Go (Golang) tillefoanplatfoarm. Diel 1

  1. Earst binne se echt lichtgewicht (minder dan 2 Kb).
  2. Twads, de kosten fan it meitsjen fan sa'n goroutine is te ferwaarleazge: jo kinne meitsje tûzen fan harren per sekonde - neat sil barre.
  3. Se wurde betsjinne troch har eigen planner, dy't gewoan kontrôle oerdrage fan de iene goroutine nei de oare.
  4. Yn dit gefal wurdt kontrôle oerdroegen yn 'e folgjende gefallen:
    • as in go-ferklearring tsjinkomt (as de goroutine de folgjende goroutine begjint);
    • as in blokkearjende Input / Out-oprop is ynskeakele;
    • as garbage sammeljen wurdt trigger;
    • as guon operaasje mei kanalen wurdt begûn.

Dat is, wannear't in Go-programma wurdt útfierd op in kompjûter, detektearret it it oantal kearnen yn it systeem, begjint safolle triedden as nedich (hoefolle kearnen binne yn it systeem, of hoefolle jo it ferteld hawwe). Dêrnjonken sil de planner dizze ljochte útfieringsthreads útfiere op al dizze threads fan bestjoeringssysteem yn elke kearn.

It moat opmurken wurde dat dit de meast effisjinte manier is om izer te brûken. Neist wat wy sjen litten hawwe, dogge wy folle mear. Wy meitsje, bygelyks, DPI systemen dy't tastean serving 40 gigabits yn ien ienheid (ôfhinklik fan wat bart yn dizze rigels).

Dêr, noch foar Go, brûkten wy krekt itselde skema om dizze reden: om't it jo de lokaasje fan 'e prosessor-cache bewarje kinne, ferminderje it oantal OS-kontekstskeakels signifikant (wat ek in heul lang duorret). Ik werhelje: dit is de meast effektive manier om izer te brûken.

Dit ienfâldige 21-line foarbyld is in foarbyld dat gewoan echo-server docht. Tink derom dat de tsjinstfunksje ekstreem ienfâldich is, it is lineêr. D'r binne gjin callbacks, gjin needsaak om te droegjen en te tinken ... Jo lêze en skriuwe gewoan!

Tagelyk, as jo lêze en skriuwe, moat it eins blokkearje - dizze goroutine wurdt gewoan yn 'e wachtrige en nommen troch de planner as útfiering wer mooglik wurdt. Dat is, dizze ienfâldige koade kin fungearje as in echo-tsjinner foar safolle ferbiningen as it OS op dizze masine sil tastean.

Folgjende hiel gau ...

Guon advertinsjes 🙂

Tankewol foar it bliuwen by ús. Hâld jo fan ús artikels? Wolle jo mear ynteressante ynhâld sjen? Stypje ús troch in bestelling te pleatsen of oan te befeljen oan freonen, wolk VPS foar ûntwikkelders fan $ 4.99, in unike analoog fan servers op yngongsnivo, dy't troch ús foar jo útfûn is: De hiele wierheid oer VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps fan $19 of hoe te dielen in tsjinner? (beskikber mei RAID1 en RAID10, oant 24 kearnen en oant 40GB DDR4).

Dell R730xd 2 kear goedkeaper yn Equinix Tier IV data sintrum yn Amsterdam? Allinne hjir 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV fan $199 yn Nederlân! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - fan $99! Lêze oer Hoe kinne jo Infrastructure Corp. klasse mei it brûken fan Dell R730xd E5-2650 v4 tsjinners wurdich 9000 euro foar in penny?

Boarne: www.habr.com

Add a comment