Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Alexey Naydenov, CEO ITooLabs, parla di u sviluppu di una piattaforma di telecomunicazioni per l'operatori di telecomunicazioni in a lingua di prugrammazione Go (Golang). Alexey hà ancu sparte a so sperienza in l'implementazione è l'operazione di a piattaforma in unu di i più grandi operatori di telecomunicazioni asiatichi, chì anu utilizatu a piattaforma per furnisce servizii di mail vocale (VoiceMail) è Virtual PBX (Cloud PBX).

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Alexey Naydenov (in seguitu - AN): - Salute à tutti ! Mi chjamu Alexey Naydenov. Sò u direttore di ITooLabs. Prima di tuttu, mi piacerebbe risponde à ciò chì facciu quì è cumu aghju finitu quì.

Se guardate u Mercatu Bitrix24 (sezzione "Telefonia"), allora 14 applicazioni è 36 chì ci sò (40%) sò noi:

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Più precisamente, questi sò i nostri partenarii operatori, ma daretu à tuttu questu hè a nostra piattaforma (Platform as a Service) - ciò chì li vendemu per un picculu centesimu. In verità, mi piacerebbe parlà di u sviluppu di sta piattaforma è cumu avemu ghjuntu à Go.

I numeri per a nostra piattaforma avà:

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

44 partenarii operatore, cumpresu Megafon. In generale, ci piace assai di andà in diverse avventure, è avemu accessu propiu à 100 milioni di abbonati di 44 operatori quì in Russia. Dunque, se qualchissia hà idee di cummerciale, seremu sempre felici di sente.

  • 5000 cumpagnie d'utilizatori.
  • 20 abbonati in totale. Questu hè tuttu b000b - travagliemu solu cù cumpagnie.
  • 300 chjamate per minutu durante u ghjornu.
  • 100 milioni di minuti di chjama l'annu passatu (avemu celebratu). Questu ùn piglia micca in contu i negoziati interni chì sò dispunibili nantu à a nostra piattaforma.

Cumu hà principiatu ?

Cumu i dudes ghjustu cumincianu ancu à fà a so piattaforma? Ci vole ancu piglià in contu chì avemu una storia di sviluppu di "impresa hardcore", è ancu in u tempu più precisu di l'annu per una impresa! Era quellu tempu felice quandu vi vene à u cliente è dite: "Avemu bisognu di un paru di servitori più". È u cliente: "Nisuna dumanda! Avemu dece in u rack ".

Allora avemu fattu Oracle, Java, WebSphere, Db2 è tutte e cose. Per quessa, avemu pigliatu, sicuru, e megliu suluzioni di venditore, l'integramu è pruvatu à piglià cun ellu. Avemu marchjatu solu. Questu seria un tali startup internu.

Tuttu chistu hà iniziatu veramente in u 2009. Dapoi u 2006, avemu participatu strettamente in suluzioni operatore, in una manera o l'altru. Avemu fattu parechji PBX virtuali persunalizati (cum'è quellu chì avemu avà in ordine): l'avemu guardatu, decisu chì era bonu, è decisu di inizià una startup interna.

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Avemu pigliatu VMWare. Siccomu eramu da noi stessi, avemu avutu à abbandunà immediatamente u venditore cool Storage. Sapemu tuttu di elli: chì i prumessi deve esse divisu da 3, è u costu deve esse multiplicatu da 10. Hè per quessa chì anu fattu DirDB è cusì.

Allora hà cuminciatu à cresce. Un serviziu di fatturazione hè statu aghjuntu à questu perchè a piattaforma ùn pudia più affruntà. Allora u servitore di fattura da MySQL si trasfirìu à Mongo. In u risultatu, avemu una suluzione di travagliu chì processa tutte e chjamate chì vanu quì:

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Ma in qualchì locu, dentru, u stessu pruduttu di venditore hè filatu - u principale, nucleare, chì avemu pigliatu una volta. Intornu à a fine di u 2011, avemu capitu chì u collu di buttiglia principale per noi, sicuru, seria stu pruduttu particulari - avemu da andà in questu. Avemu vistu un muru davanti à noi, in quale avemu curritu à u galoppu pienu, cum'è più clienti continuavanu à vene.
Per quessa, avemu bisognu di fà qualcosa. Di sicuru, avemu realizatu assai ricerche nantu à diversi prudutti - sia open source è venditori. Ùn aghju micca in questu ora - ùn hè micca ciò chì avemu parlatu. L'ultima opzione di fallback chì avemu pensatu era di fà a nostra propria piattaforma.

In fine, avemu ghjuntu à sta opzione. Perchè? Perchè tutti i venditori è i prudutti open source sò stati fatti per risolve i prublemi chì eranu 10 anni. Ebbè, s'è 10 anni, è un pocu di più ! A scelta hè diventata ovvia per noi: o dicemu addiu à a nostra grande idea di un serviziu ideale (per i partenarii, l'operatori è noi stessi), o facemu qualcosa di u nostru propiu.

Avemu decisu di fà qualcosa di u nostru !

Requisiti di a piattaforma

Sè vo avete fattu qualcosa per un bellu pezzu (aduprendu u pruduttu di l'altru), allura u pensamentu si forma lentamente in a vostra testa: cumu fà questu stessu? Siccomu simu tutti i programatori in a cumpagnia (eccettu per i venditori, ùn ci sò micca programatori), i nostri bisogni sò sviluppati assai tempu fà, è eranu chjaru:

  1. Alta velocità di sviluppu. U pruduttu di u vinditore chì ci turmentava ùn era micca satisfactoriu, prima di tuttu, perchè tuttu hè diventatu longu è pianu pianu. Vulemu prestu - avemu avutu assai idee! Avemu sempre assai idee, ma tandu a lista di l'idee era tale chì pareva deci anni in anticipu. Avà solu per un annu.
  2. Utilizazione massima di ferru multi-core. Questu era ancu impurtante per noi, postu chì avemu vistu chì ci saria solu più è più core.
  3. Alta affidabilità. Qualcosa chì avemu ancu chianciatu.
  4. Alta resistenza à i fallimenti.
  5. Avemu vulsutu finisce cù un prucessu di liberazioni ogni ghjornu. Per questu avemu bisognu di una scelta di lingua.

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

In cunsiquenza, da i requisiti per u pruduttu chì avemu stabilitu per noi stessi, i requisiti per a lingua crescenu in una manera chjaramente logica.

  1. Se vulemu supportu per sistemi multi-core, allora avemu bisognu di supportu per l'execuzione parallela.
  2. Sè avemu bisognu di rapidità di sviluppu, avemu bisognu di una lingua chì sustene u sviluppu cumpetitivu, a prugrammazione cumpetitiva. Se qualchissia ùn hà micca scontru a diferenza, hè assai simplice:
    • A prugrammazione parallela hè di quantu dui fili diffirenti sò eseguiti nantu à nuclei diffirenti;
    • L'esekzione simultanea, o più precisamente, u supportu di cuncurrenza, hè di cumu una lingua (o runtime, ùn importa micca) aiuta à ammuccià tutta a cumplessità chì vene da l'esekzione parallela.
  3. Alta stabilità. Ovviamente, avemu bisognu di un cluster, è un megliu cà avemu avutu nantu à u pruduttu di u venditore.

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Ùn avemu micca veramente tanti opzioni, se vi ricordate. Prima, Erlang - l'amemu è u sapemu, era u mo favuritu persunale. Siconda, Java ùn hè ancu Java, ma specificamente Scala. In terzu, una lingua chì à quellu tempu ùn sapemu micca à tutti - Go. Era appena apparsu tandu, o piuttostu, era digià esistitu da circa dui anni, ma ùn era ancu statu liberatu.

Vai vintu!

Storia di Go

Avemu fattu una piattaforma nantu à questu. Pruvaraghju di spiegà perchè.

Una breve storia di Go. Accuminciau in 2007, apertu in 2009, a prima versione hè stata liberata in 2012 (vale à dì, avemu cuminciatu à travaglià ancu prima di a prima versione). L'iniziatore era Google, chì vulia rimpiazzà, cum'è suspettu, Java.

L'autori sò assai famosi:

  • Ken Thomson, chì era daretu à Unix, hà inventatu UTF-8, hà travagliatu nantu à u sistema di u Pianu 9;
  • Rob Pike, chì hà inventatu UTF-8 cù Ken, hà travagliatu ancu nantu à u Pianu 9, Inferno, Limbo à Bell Labs;
  • Robert Giesmer, chì sapemu è amassi per inventà u Java HotSpot Compiler è per u so travagliu nantu à u generatore in V8 (l'interprete Javascript di Google);
  • È più di 700 cuntributori, cumprese alcuni di i nostri patch.

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Vai: prima sguardu

Si vede chì a lingua hè più o menu sèmplice è capiscibile. Avemu tipi evidenti: in certi casi anu da esse dichjaratu, in altri ùn sò micca necessarii (questu significa chì i tipi sò inferiti in una manera o l'altru).

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Pò esse vistu chì hè di moda di discrive strutture. Si pò vede chì avemu u cuncettu di puntatore (induve hè l'asteriscu). Pò esse vistu chì ci hè un supportu speciale per dichjarà l'inizializazione di arrays è arrays associative.

Hè quasi chjaru - pudete campà. Pruvemu di scrive Hello, world:

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Chì vedemu ? Questa hè una sintassi C-like, u puntu è virgola hè facultativa. Pò esse un separatore per duie linee, ma solu s'ellu sò dui custruzzioni chì sò nantu à a stessa linea.

Avemu vistu chì i parentesi in strutture di cuntrollu (in a linea 14) sò opcionali, ma i curly braces sò sempre necessarii. Avemu vistu chì u typing hè staticu. Tim hè cacciatu a maiò parte di u tempu. Questu esempiu hè un pocu più cumplicatu chè u solitu Hello, world - solu per dimustrà chì ci hè una biblioteca.

Chì altru vedemu chì hè impurtante? U codice hè urganizatu in pacchetti. È per utilizà un pacchettu in u vostru propiu codice, avete bisognu di impurtà cù a direttiva d'importazione - questu hè ancu impurtante. Lanciamu - funziona. Perfettu!

Pruvemu qualcosa di più cumplicatu dopu: Salute, mondu, ma solu avà hè un servitore http. Chì vedemu interessante quì?

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Prima, a funzione agisce cum'è un paràmetru. Questu significa chì a nostra funzione hè "cittadinu di prima classe" è pudete fà assai cose interessanti cun ellu in un stile funziunale. Dopu vedemu qualcosa inespettatu: a direttiva d'importazione ligami direttamente à u repository GitHub. Hè cusì, hè cusì - in più, hè cusì chì deve esse fattu.

In Go, l'identificatore universale di un pacchettu hè l'url di u so repository. Ci hè una utilità speciale di Goget chì pigliarà tutte e dipendenze, scaricate, installate, compilate è preparalli per l'usu se ne necessariu. À u listessu tempu, Goget sapi di html-meta. Per quessa, pudete mantene un annuariu http chì cuntene ligami à u vostru repositoriu specificu (cum'è noi, per esempiu).

Chì altru vedemu ? Http è Json in a libreria standard. Ci hè, ovviamente, introspezione - riflessione, chì deve esse aduprata in codificazione / json, perchè solu sustituiscimu qualchì ughjettu arbitrariu per questu.

L'avemu eseguitu è ​​vedemu chì avemu un codice utile in 20 linee, chì compila, corre è informa a carica media attuale di a macchina (nantu à a macchina nantu à quale hè lanciata).
Chì altru hè impurtante chì pudemu vede immediatamente quì? Hè compilatu in un binariu staticu (buinariu). Stu binariu ùn hà micca dipendenze, nè biblioteche! Pudete copià à qualsiasi sistema, eseguite immediatamente, è funziona.

Andemu avanti.

Vai: Metudi è Interfacce

Go hà metudi. Pudete dichjarà un metudu per ogni tipu persunalizatu. Inoltre, questu ùn hè micca necessariamente una struttura, ma forsi un alias di qualchì tipu. Pudete dichjarà un alias per N32 è scrive metudi per fà qualcosa di utile.

È quì cademu in stupore per a prima volta... Ci hè chì Go ùn hà micca classi cum'è tali. Quelli chì cunnoscenu Go puderianu dì chì ci hè l'inclusione di u tipu, ma hè qualcosa di tuttu altru. Più prestu un sviluppatore smette di pensà à ellu cum'è eredità, u megliu. Ùn ci hè micca classi in Go, è ùn ci hè ancu eredità.

Quistione ! Chì ci hà datu a cumpagnia di l'autori guidata da Google per riflette a cumplessità di u mondu? Ci anu datu interfacce !

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

Una interfaccia hè un tipu speziale chì permette di scrive simpliciamente metudi, signatura di metudu. In più, ogni tipu per quale sti metudi esistenu (sò eseguiti) currisponde à sta interfaccia. Questu significa chì pudete solu descriverà a funzione currispondente per un tipu, per un altru (chì currisponde à quellu tipu d'interfaccia). In seguitu, dichjarà una variàbile di u tipu di sta interfaccia è assignate qualsiasi di questi ogetti.

Per i fan di hardcore, possu dì chì sta variàbile hà daveru duie punte: unu à i dati, l'altru à una tavola speciale di descrittori, chì hè tipica per stu tipu particulari, per l'interfaccia di stu tipu. Questu hè, u compilatore crea tali tabelle di descriptori à u mumentu di u ligame.

È in Go, sicuru, ci sò punters à void. L'interfaccia di a parolla {} (cù dui ricci) hè una variàbile chì permette di indicà ogni ughjettu in principiu.
Finu a ora tuttu hè bè, tuttu hè familiar. Nunda surprisante.

Andate: goroutines

Avà venenu à ciò chì ci interessa: prucessi ligeri - goroutines (goroutines) in terminologia Go.

Alexey Naidenov. ITooLabs. Casu di sviluppu nantu à a piattaforma telefonica Go (Golang). Parte 1

  1. Prima, sò veramente ligeri (menu di 2 KB).
  2. Siconda, i costi di creà un tali goroutine sò insignificanti: pudete creà un milla di elli per seconda - nunda ùn succede.
  3. Sò servuti da u so propiu pianificatore, chì simpricimenti trasferisce u cuntrollu da una goroutine à l'altru.
  4. In questu casu, u cuntrollu hè trasferitu in i seguenti casi:
    • se l'espressione go hè scontru (se a goroutine principia a prossima goroutine);
    • se un bloccu Input / Out call hè attivatu;
    • se a cullizzioni di basura principia;
    • se qualchì operazione cù i canali hè lanciata.

Vale à dì, ogni volta chì un prugramma Go corre nantu à un computer, determina u numeru di nuclei in u sistema, lancia quant'è fili quant'è necessariu (quanti nuclei sò in u sistema o quanti avete dettu). In cunsiquenza, u pianificatore eseguirà questi fili ligeri di esecuzione nantu à tutti questi fili di u sistema operatore in ogni core.

Hè da nutà chì questu hè u modu più efficau per utilizà u ferru. In più di ciò chì si mostra, facemu assai di più. Facemu, per esempiu, sistemi DPI chì permettenu à una unità di serve 40 gigabits (secondu ciò chì succede in queste linee).

Esiste, ancu prima di Go, avemu usatu esattamente u listessu schema per precisamente questu mutivu: perchè ci permette di priservà a località di u cache di u processatore è riduce significativamente u nùmeru di switches di u cuntestu OS (chì piglia ancu assai tempu). Ripetu: questu hè u modu più efficau per utilizà u ferru.

Questu esempiu simplice di 21 linee hè un esempiu chì faci solu l'eco-server. Per piacè nutate chì a funzione di serve hè estremamente simplice, hè lineare. Ùn ci hè micca callbacks, ùn ci hè bisognu di strughje è pinsà... Basta à leghje è scrive !

À u stessu tempu, se leghjite è scrivite, deve esse in realtà bluccà - sta goroutine hè simplicemente messa in una fila è pigliata da u pianificatore quandu l'esekzione torna pussibule. Questu hè, stu còdice simplice pò agisce cum'è un servitore d'eco per quante cunnessione chì u SO in quella macchina permette.

Da cuntinuà assai prestu...

Certi annunzii 🙂

Grazie per stà cun noi. Ti piace i nostri articuli ? Vulete vede più cuntenutu interessante? Supportaci facendu un ordine o ricumandendu à l'amichi, cloud VPS per sviluppatori da $ 4.99, un analogu unicu di servitori di livellu d'entrata, chì hè statu inventatu da noi per voi: Tutta a verità nantu à VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps da $ 19 o cumu si sparte un servitore? (dispunibule cù RAID1 è RAID10, finu à 24 core è finu à 40GB DDR4).

Dell R730xd 2 volte più prezzu in u centru di dati Equinix Tier IV in Amsterdam? Solu quì 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV da $ 199 in l'Olanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - da $ 99! Leghje circa Cumu custruisce una infrastruttura corp. classa cù l'usu di i servitori Dell R730xd E5-2650 v4 valenu 9000 XNUMX euro per un centesimu?

Source: www.habr.com

Add a comment