Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Alexey Naidenov, CEO ITooLabs, titkellem dwar l-iżvilupp ta 'pjattaforma tat-telekomunikazzjoni għall-operaturi tat-telekomunikazzjoni fil-lingwa ta' programmar Go (Golang). Alexey jaqsam ukoll l-esperjenza tiegħu ta 'skjerament u tħaddim tal-pjattaforma f'wieħed mill-akbar operaturi tat-telekomunikazzjoni Ażjatiċi, li uża l-pjattaforma biex jipprovdi servizzi ta' voice mail (VoiceMail) u Virtual PBX (Cloud PBX).

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Alexey Naydenov (minn hawn 'il quddiem - AN): - Hi kollha! Jisimni Alexey Naidenov. Jien id-direttur tal-ITooLabs. L-ewwel nett nixtieq inwieġeb x’qed nagħmel hawn u kif spiċċajt hawn.

Jekk tħares lejn is-Suq Bitrix24 (taqsima "Telefonija"), allura 14-il applikazzjoni u 36 li hemm (40%) aħna aħna:

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

B'mod aktar preċiż, dawn huma l-operaturi msieħba tagħna, iżda wara dan kollu hemm il-pjattaforma tagħna (Platform as a Service) - dak li nbigħuhom għal penny żgħir. Fil-fatt, nixtieq nitkellem dwar l-iżvilupp ta 'din il-pjattaforma u kif wasalna Go.

In-numri għall-pjattaforma tagħna issa huma:

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

44 operatur sieħeb, inkluż MegaFon. B'mod ġenerali, inħobbu mmorru fuq avventuri, u fil-fatt għandna aċċess għal 100 miljun abbonat ta '44 operatur hawn fir-Russja. Għalhekk, jekk xi ħadd ikollu xi ideat ta 'negozju, aħna dejjem kuntenti li nisimgħuhom.

  • 5000 kumpanija utenti.
  • 20 abbonat b’kollox. Kollox b000b - naħdmu biss ma' kumpaniji.
  • 300 telefonata kull minuta matul il-ġurnata.
  • 100 miljun minuta ta’ telefonata s-sena l-oħra (iċċelebrajna). Dan mingħajr ma jitqiesu n-negozjati interni li hemm fuq il-pjattaforma tagħna.

Kif bdiet?

Kif il-ġuvini tajbin jibdew jagħmlu l-pjattaforma tagħhom stess? Irridu nqisu wkoll li kellna storja ta 'żvilupp ta' "intrapriża iebsa", u anke fl-iktar żmien preċiż tas-sena għal intrapriża! Kien dak iż-żmien ferħan meta tiġi għand il-klijent u tgħid: "Għandna bżonn koppja oħra ta' servers." U l-klijent: “Iva, l-ebda mistoqsija! Għandna għaxra fir-rack.

Allura għamilna Oracle, Java, WebSphere, Db2 u dak kollu. Għalhekk, ħadna, ovvjament, l-aħjar soluzzjonijiet tal-bejjiegħ, integrajnahom u ppruvajna nibqgħu magħha. Huma lagħbu waħedhom. Ikun tali istartjar intern.

Kollox beda fl-2009. Mill-2006, konna involuti mill-qrib fid-deċiżjonijiet tal-operaturi, b'xi mod jew ieħor. Għamilna diversi PBXs virtwali tad-dwana (bħal dak li għandna issa fuq ordni): ħaresna, iddeċidejna li kien tajjeb, u ddeċidejna li nqanqlu startup intern.

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Ħu VMWare. Peress li konna nimxu waħedna, kellna nabbandunaw immedjatament il-Ħażna tal-bejjiegħ frisk. Nafu kollox dwarhom: li l-wegħdiet għandhom jiġu diviż bi 3, u l-ispiża għandha tiġi mmultiplikata b'10. Għalhekk, għamilna DirDB u l-bqija.

Imbagħad bdiet tikber. Is-servizz tal-kontijiet ġie miżjud ma 'dan, minħabba li l-pjattaforma ma setgħetx tlaħħaq aktar. Imbagħad is-server tal-kontijiet minn MySQL tmexxa għal Mongo. Bħala riżultat, aħna ksibna soluzzjoni ta' ħidma li tipproċessa s-sejħiet kollha li jmorru hemm:

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Imma x'imkien ġewwa, l-istess prodott tal-bejjiegħ qed idawwar - dak ewlieni, nukleari, li darba ħadna. Madwar sa tmiem l-2011, aħna rrealizzajna għalina nfusna li l-ostaklu ewlieni għalina, ovvjament, se jkun dan il-prodott partikolari - se nilqgħu miegħu. Rajna ħajt quddiemna, li fih ġrew bil-galopp sħiħ, hekk kif il-klijenti mexjin, ġew miżjuda.
Għaldaqstant, kellna nagħmlu xi ħaġa. Naturalment, għamilna ħafna riċerka fuq diversi prodotti - kemm open source kif ukoll dawk tal-bejjiegħ. Mhux se nitkellem fuq dan issa - dak mhuwiex il-punt. L-aħħar backup li ħsibna dwaru kien li nagħmlu l-pjattaforma tagħna stess.

Fl-aħħar mill-aħħar, wasalna għal din l-għażla. Għaliex? Minħabba li l-prodotti kollha tal-bejjiegħ u open source saru biex isolvu problemi 10 snin ilu. Ukoll, jekk tifel ta '10 snin, u xi ftit aktar! L-għażla saret ovvja għalina: jew ngħidu addio lill-idea kbira tagħna ta’ servizz ideali (għall-imsieħba, l-operaturi u lilna nfusna), jew nagħmlu xi ħaġa tagħna stess.

Iddeċidejna li nagħmlu xi ħaġa differenti!

Rekwiżiti tal-Pjattaforma

Jekk tagħmel xi ħaġa għal żmien twil (tisfrutta l-prodott ta 'xi ħadd ieħor), allura l-ħsieb jifforma bil-mod f'rasek: kif nagħmel jien stess? Peress li aħna lkoll programmaturi fil-kumpanija (ħlief għall-bejjiegħa, m'hemm l-ebda programmaturi mhux programmaturi), ir-rekwiżiti tagħna ġew iffurmati għal żmien twil, u kienu ċari:

  1. Veloċità għolja ta 'żvilupp. Il-prodott tal-bejjiegħ, li tturmentana, ma kienx tajjeb għalina l-ewwel għax kollox ħadem għal żmien twil u bil-mod. Ridna malajr - kellna ħafna ideat! Għad għandna ħafna ideat, imma mbagħad il-lista tal-ideat kienet tali li dehret għaxar snin quddiem. Issa għal sena biss.
  2. Użu massimu ta 'ħadid b'ħafna qalba. Dan kien importanti wkoll għalina, għax rajna li se jkun hemm biss aktar u aktar cores.
  3. Affidabbiltà għolja. Il-waħda aħna bkijna wkoll.
  4. Tolleranza għolja għall-ħsarat.
  5. Ridna nispiċċaw bi proċess ta’ rilaxx ta’ kuljum. Biex nagħmlu dan, kellna bżonn għażla tal-lingwa.

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Għaldaqstant, mir-rekwiżiti għall-prodott li ppreżentajna għalina nfusna, ir-rekwiżiti għall-lingwa jikbru b'mod loġiku ċar.

  1. Jekk irridu appoġġ għal sistemi multi-core, allura għandna bżonn appoġġ għal eżekuzzjoni parallela.
  2. Jekk neħtieġu l-veloċità tal-iżvilupp, għandna bżonn lingwa li tappoġġja l-iżvilupp kompetittiv, l-ipprogrammar kompetittiv. Jekk xi ħadd ma ltaqax mad-differenza, allura huwa sempliċi ħafna:
    • l-ipprogrammar parallel huwa dwar kif żewġ ħjut differenti jimxu fuq qlub differenti;
    • l-eżekuzzjoni konkorrenti, aktar speċifikament l-appoġġ tal-konkorrenza, hija dwar kif il-lingwa (jew ir-runtime, tkun xi tkun) tgħin biex taħbi l-kumplessità kollha li tiġi mill-eżekuzzjoni parallela.
  3. Stabbiltà għolja. Ovvjament, kellna bżonn cluster, u kien aħjar minn dak li kellna fuq il-prodott tal-bejjiegħ.

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Ma tantx kellna ħafna għażliet, jekk tiftakar. L-ewwelnett, Erlang - aħna nħobbuha u nafuha, kienet il-favorit personali tiegħi. It-tieni, Java lanqas biss huwa Java, iżda speċifikament Scala. It-tielet, il-lingwa li dak iż-żmien ma konna nafu xejn - Mur. Dakinhar kien għadu kif deher, b’mod aktar preċiż, kien ilu diġà jeżisti għal madwar sentejn, iżda kien għadu ma ġiex rilaxxat.

Defeated Mur!

Storja ta' Go

Għamilna pjattaforma fuqha. Nipprova nispjega għaliex.

Storja Qasira ta' Go. Bdiet fl-2007, miftuħa fl-2009, l-ewwel verżjoni ġiet rilaxxata fl-2012 (jiġifieri, bdejna naħdmu anke qabel l-ewwel rilaxx). L-inizjatur kien Google, li ried jissostitwixxi, kif nissuspetta, Java.

L-awturi huma famużi ħafna:

  • Ken Thomson, li kien wara Unix, ivvinta UTF-8, ħadem fuq is-sistema Plan 9;
  • Rob Pike, li ddisinja UTF-8 ma 'Ken, ħadem ukoll fuq Pjan 9, Inferno, Limbo f'Bell Labs;
  • Robert Gizmer, li nafu u nħobbu għall-invenzjoni tal-Java HotSpot Compiler u għall-ħidma fuq il-ġeneratur fil-V8 (l-interpretu Javascript ta' Google);
  • U aktar minn 700 kontributur, inklużi wħud mill-garża tagħna.

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Mur f'daqqa t'għajn

Naraw li l-lingwa hija xi ftit jew wisq sempliċi u li tinftiehem. Għandna tipi ovvji: f'xi każijiet jeħtieġ li jiġu ddikjarati, f'oħrajn le (jiġifieri t-tipi huma dedotti xorta).

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Wieħed jista 'jara li huwa moda li jiddeskrivu strutturi. Wieħed jista’ jara li għandna l-kunċett ta’ pointer (fejn hemm l-asterisk). Wieħed jista 'jara li hemm appoġġ speċjali għad-dikjarazzjoni ta' inizjalizzazzjoni ta 'arrays u arrays assoċjati.

Bejn wieħed u ieħor jinftiehem - tista 'tgħix. Nipprova tikteb Hello, dinja:

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

X'naraw? Din hija sintassi bħal C, il-virgola hija fakultattiva. Jista 'jkun separatur għal żewġ linji, iżda biss jekk dawn huma żewġ kostruzzjonijiet li huma eżattament fuq l-istess linja.

Naraw li l-parentesi fl-istrutturi ta 'kontroll (fuq l-14-il linja) huma fakultattivi, iżda dawk kaboċċi huma dejjem meħtieġa. Naraw li l-ittajpjar huwa statiku. Tim fil-biċċa l-kbira tal-każijiet jintwera. Dan l-eżempju huwa kemmxejn aktar ikkumplikat mis-soltu Hello, world - biss biex juri li hemm librerija.

X'iktar naraw importanti? Il-kodiċi huwa organizzat f'pakketti. U sabiex tuża l-pakkett fil-kodiċi tiegħek, għandek bżonn timportah billi tuża d-direttiva ta 'importazzjoni - dan huwa importanti wkoll. Nibdew - taħdem. Kbir!

Ejja nippruvaw xi ħaġa aktar ikkumplikata: Hello, dinja, imma issa huwa server http. X'naraw interessanti hawn?

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

L-ewwel, il-funzjoni taġixxi bħala parametru. Dan ifisser li l-funzjoni li għandna hija "ċittadin tal-ewwel klassi" u tista 'tagħmel ħafna affarijiet interessanti biha fi stil funzjonali. Naraw dak mhux mistenni li jmiss: id-direttiva tal-importazzjoni tirreferi direttament għar-repożitorju GitHub. Hekk hu, hekk hu – barra minn hekk, hekk għandu jsir.

F'Go, l-identifikatur universali ta' pakkett huwa l-url tar-repożitorju tiegħu. Hemm utilità speċjali ta 'Goget li tmur għad-dipendenzi kollha, tniżżilhom, tinstallahom, tikkumpilahom, u tippreparahom għall-użu jekk meħtieġ. Fl-istess ħin, Goget jaf dwar html-meta. Għaldaqstant, tista' żżomm direttorju http, li jkun fih links għar-repożitorju speċifiku tiegħek (kif nagħmlu aħna, pereżempju).

X'iktar naraw? Http u Json fil-librerija regolari. Hemm, ovvjament, introspezzjoni - riflessjoni, li għandha tintuża fil-kodifikazzjoni / json, għaliex aħna sempliċement nissostitwixxu xi oġġett arbitrarju għalih.

Aħna nħaddmuha u naraw li għandna 20 linja ta 'kodiċi utli li tikkompila, taħdem u tagħti t-tagħbija medja attwali tal-magna (fuq il-magna li tkun qed taħdem fuqha).
X'iktar huwa importanti minn dak li nistgħu naraw immedjatament hawn? Jiġbor f'binarju statiku wieħed (buinary). Dan binarju m'għandu l-ebda dipendenzi, l-ebda libreriji! Jista 'jiġi kkupjat fi kwalunkwe sistema, iħaddem immedjatament, u se jaħdem.

Nimxu 'l quddiem.

Mur: metodi u interfaces

Mur għandu metodi. Tista 'tiddikjara metodu għal kwalunkwe tip tad-dwana. Barra minn hekk, din mhix neċessarjament struttura, iżda tista 'tkun alias ta' xi tip. Tista 'tiddikjara alias għal N32 u tikteb metodi biex tagħmel xi ħaġa utli.

U dan huwa fejn naqgħu fi stupor għall-ewwel darba ... Jirriżulta li Go m'għandux klassijiet bħala tali. Dawk li jafu Go jistgħu jgħidu li hemm inklużjoni tat-tip, iżda din hija kompletament differenti. L-iżviluppatur malajr jieqaf jaħseb dwarha bħala wirt, l-aħjar. M'hemm l-ebda klassijiet f'Go, u lanqas ma hemm wirt.

Mistoqsija! X'għamlitna l-kumpanija tal-awturi mmexxija minn Google sabiex nuru l-kumplessità tad-dinja? Aħna ngħatajna interfaces!

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

Interface huwa tip speċjali li jippermettilek tikteb metodi sempliċi, firem tal-metodu. Barra minn hekk, kwalunkwe tip li għalih jeżistu (huma esegwiti) dawn il-metodi se jikkorrispondi għal din l-interface. Dan ifisser li tista 'sempliċement tikteb il-funzjoni korrispondenti għal tip wieħed, għal ieħor (li tikkorrispondi għal dak it-tip ta' interface). Sussegwentement, iddikjara varjabbli tat-tip ta 'din l-interface u assenja kwalunkwe minn dawn l-oġġetti lilha.

Għal fannijiet iebsa, nista 'ngħid li din il-varjabbli fil-fatt se jkun fiha żewġ indikaturi: waħda għad-dejta, l-oħra għal tabella ta' deskrittur speċjali li hija speċifika għal dan it-tip partikolari, għall-interface ta 'dan it-tip. Jiġifieri, il-kompilatur jagħmel tali tabelli ta 'deskritturi fil-ħin tal-linking.

U hemm, ovvjament, indikaturi għal null f'Go. Il-kelma interface {} (b'żewġ ċineg kaboċċi) hija varjabbli li tippermettilek li tipponta lejn kwalunkwe oġġett fil-prinċipju.
S'issa, kollox huwa fl-ordni, kollox huwa familjari. Xejn sorprendenti.

Mur: goroutines

Issa naslu għal dak li aħna interessati fih: proċessi ħfief - goroutines (goroutines) fit-terminoloġija Go.

Alexey Naidenov. ITooLabs. Każ ta' żvilupp fuq il-pjattaforma tat-telefon Go (Golang). Parti 1

  1. L-ewwel, huma verament ħfief (inqas minn 2 Kb).
  2. It-tieni nett, l-ispiża tal-ħolqien ta 'goroutine bħal din hija negliġibbli: tista' toħloq elf minnhom kull sekonda - mhu se jiġri xejn.
  3. Huma moqdija mill-iskeduler tagħhom stess, li sempliċement jittrasferixxi l-kontroll minn goroutine għal ieħor.
  4. F'dan il-każ, il-kontroll jiġi trasferit fil-każijiet li ġejjin:
    • jekk tiltaqa' ma' dikjarazzjoni go (jekk il-goroutine jibda l-goroutine li jmiss);
    • jekk sejħa Input/Out li timblokka hija attivata;
    • jekk jiġi attivat il-ġbir taż-żibel;
    • jekk tinbeda xi operazzjoni bil-kanali.

Jiġifieri, kull meta programm Go jitmexxa fuq kompjuter, jiskopri n-numru ta’ cores fis-sistema, jibda kemm hemm bżonn ta’ ħjut (kemm hemm cores fis-sistema, jew kemm qaltlu). Għaldaqstant, l-iskedar se jmexxi dawn il-ħjut ħfief ta 'eżekuzzjoni fuq dawn il-ħjut kollha tas-sistema operattiva f'kull qalba.

Għandu jiġi nnutat li dan huwa l-aktar mod effiċjenti biex jiġi utilizzat il-ħadid. Minbarra dak li wrejna, nagħmlu ħafna aktar. Aħna nagħmlu, pereżempju, sistemi DPI li jippermettu li jservu 40 gigabit f'unità waħda (skont x'jiġri f'dawn il-linji).

Hemm, anki qabel Mur, użajna eżattament l-istess skema għal din ir-raġuni stess: minħabba li jippermettilek li tissejvja l-lokalità tal-cache tal-proċessur, tnaqqas b'mod sinifikanti n-numru ta 'swiċċijiet tal-kuntest tal-OS (li tieħu wkoll żmien twil ħafna). Nirrepeti: dan huwa l-aktar mod effettiv biex tuża l-ħadid.

Dan l-eżempju sempliċi ta '21 linja huwa eżempju li sempliċement jagħmel echo-server. Fl-istess ħin, innota li l-funzjoni tas-servizz hija estremament sempliċi, hija lineari. M'hemmx callbacks, m'hemmx għalfejn tfixkel u taħseb... Int biss taqra u tikteb!

Fl-istess ħin, jekk taqra u tikteb, għandha fil-fatt timblokka - din il-goroutine hija sempliċement fil-kju u meħuda mill-iskeduler meta l-eżekuzzjoni terġa 'tiġi possibbli. Jiġifieri, dan il-kodiċi sempliċi jista 'jaġixxi bħala server eku għal konnessjonijiet daqs kemm jippermetti l-OS fuq din il-magna.

Se titkompla dalwaqt...

Xi reklami 🙂

Grazzi talli bqajt magħna. Tħobb l-artikoli tagħna? Trid tara aktar kontenut interessanti? Appoġġuna billi tagħmel ordni jew tirrakkomanda lill-ħbieb, Cloud VPS għall-iżviluppaturi minn $4.99, analogu uniku ta 'servers ta' livell ta 'dħul, li ġie ivvintat minna għalik: Il-verità kollha dwar VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps minn $19 jew kif taqsam server? (disponibbli b'RAID1 u RAID10, sa 24 core u sa 40GB DDR4).

Dell R730xd 2 darbiet orħos fiċ-ċentru tad-dejta Equinix Tier IV f'Amsterdam? Hawn biss 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV minn $199 fl-Olanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - minn $99! Aqra dwar Kif tibni l-infrastruttura corp. klassi bl-użu ta 'servers Dell R730xd E5-2650 v4 li jiswew 9000 ewro għal ċenteżmu?

Sors: www.habr.com

Żid kumment