Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Aleksei Naidenov, toimitusjohtaja ITooLabs, puhuu tietoliikennealustan kehittämisestä teleoperaattoreille ohjelmointikielellä Go (Golang). Aleksei jakaa myös kokemuksensa alustan käyttöönotosta ja käyttämisestä yhdessä Aasian suurimmista teleoperaattoreista, joka käytti alustaa puheposti- (VoiceMail) ja Virtual PBX (Cloud PBX) -palvelujen tarjoamiseen.

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Aleksei Naydenov (jäljempänä - AN): - Hei kaikki! Nimeni on Aleksei Naidenov. Olen ITooLabsin johtaja. Ensinnäkin haluaisin vastata, mitä teen täällä ja miten päädyin tänne.

Jos katsot Bitrix24 Marketplacea (osio "Puhelinpalvelut"), 14 sovellusta ja 36 siellä olevaa sovellusta (40%) olemme me:

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Tarkemmin sanottuna nämä ovat kumppanioperaattoreitamme, mutta kaiken tämän takana on alustamme (Platform as a Service) - mitä myymme heille pienellä pennillä. Itse asiassa haluaisin puhua tämän alustan kehityksestä ja siitä, miten pääsimme Go:hon.

Alustamme numerot ovat nyt:

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

44 kumppanioperaattoria, mukaan lukien MegaFon. Yleisesti ottaen rakastamme seikkailua, ja meillä on Venäjällä 100 operaattorin 44 miljoonaa tilaajaa. Siksi, jos jollain on liikeideoita, kuuntelemme niitä aina mielellämme.

  • 5000 käyttäjäyritystä.
  • 20 000 tilaajaa yhteensä. Kaikki on b2b:tä – teemme yhteistyötä vain yritysten kanssa.
  • 300 puhelua minuutissa päivän aikana.
  • 100 miljoonaa puheluminuuttia viime vuonna (juhlimme). Tämä on ottamatta huomioon alustallamme käytäviä sisäisiä neuvotteluja.

Kuinka se alkoi?

Kuinka oikeat jätkät alkavat tehdä oman alustansa? Meidän on myös otettava huomioon, että meillä on ollut "hardcore-yrityskehityksen" historiaa ja jopa yrityksen tarkimpaan aikaan vuodesta! Se oli se iloinen hetki, kun tulit asiakkaan luo ja sanot: "Tarvitsemme pari palvelinta lisää." Ja asiakas: "Kyllä, ei kysymystä! Meillä on kymmenen telineessä.

Joten teimme Oraclen, Javan, WebSpheren, Db2:n ja kaiken tämän. Siksi otimme tietysti parhaat toimittajaratkaisut, integroimme ne ja yritimme ottaa sen mukaan. He pelasivat yksin. Se olisi sellainen sisäinen käynnistys.

Kaikki alkoi vuonna 2009. Vuodesta 2006 lähtien olemme olleet tiiviisti mukana operaattoripäätöksissä tavalla tai toisella. Teimme useita mukautettuja virtuaalisia PBX:itä (kuten nyt tilauksesta): katsoimme, päätimme, että se oli hyvä, ja päätimme käynnistää sisäisen käynnistyksen.

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Ota VMWare. Koska kävelimme omin avuin, jouduimme heti hylkäämään viileän myyjän Storagen. Tiedämme heistä kaiken: lupaukset pitäisi jakaa kolmella ja kustannukset kertoa 3:llä. Siksi teimme DirDB:n ja niin edelleen.

Sitten se alkoi kasvaa. Laskutuspalvelu lisättiin tähän, koska alusta ei enää kestänyt. Sitten laskutuspalvelin MySQL:stä siirtyi Mongoon. Tuloksena saimme toimivan ratkaisun, joka käsittelee kaikki sinne tulevat puhelut:

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Mutta jossain sisällä pyörii sama myyjätuote - ydin, jonka otimme kerran. Suunnilleen vuoden 2011 loppuun mennessä tajusimme itse, että tärkein pullonkaula meille on tietysti juuri tämä tuote - törmäämme siihen. Näimme edessämme seinän, johon juoksimme täydellä laukalla asiakkaiden kävellessä.
Sen mukaisesti meidän oli tehtävä jotain. Tietysti teimme melko paljon tutkimusta erilaisista tuotteista - sekä avoimen lähdekoodin että toimittajan tuotteista. En viitsi nyt käsitellä tätä - siitä ei ole kysymys. Viimeinen vaihtoehto, jota ajattelimme, oli oman alustan tekeminen.

Lopulta päädyimme tähän vaihtoehtoon. Miksi? Koska kaikki myyjien ja avoimen lähdekoodin tuotteet on tehty ongelmien ratkaisemiseksi 10 vuotta sitten. No, jos 10-vuotias, ja vähän enemmän! Valinta on tullut meille selväksi: joko sanomme hyvästit loistavalle ideallemme ihanteellisesta palvelusta (kumppaneille, operaattoreille ja itsellemme), tai teemme jotain omaa.

Päätimme tehdä jotain toisin!

Alustan vaatimukset

Jos teet jotain pitkään (hyödynnät jonkun muun tuotetta), niin päähän pikkuhiljaa muodostuu ajatus: miten tekisin sen itse? Koska olemme kaikki yrityksessä ohjelmoijia (myyjiä lukuun ottamatta, ei-ohjelmoijia ei ole), vaatimuksiamme on muotoiltu pitkään, ja ne olivat selvät:

  1. Korkea kehitysnopeus. Meitä kiusannut myyjän tuote ei ensinkään sopinut meille, koska kaikki sujui pitkään ja hitaasti. Halusimme nopeasti – meillä oli paljon ideoita! Meillä on vielä paljon ideoita, mutta silloin idealista oli sellainen, että se tuntui kymmenen vuoden päästä. Nyt vain vuodeksi.
  2. Moniytimisen raudan maksimaalinen käyttö. Tämä oli myös meille tärkeää, koska näimme, että ytimiä tulee vain lisää ja lisää.
  3. Korkea luotettavuus. Se jota myös itkimme.
  4. Korkea vikasietoisuus.
  5. Halusimme päätyä päivittäiseen julkaisuprosessiin. Tätä varten tarvitsimme kielen valinnan.

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Vastaavasti itsellemme esittämistämme tuotteen vaatimuksista kielen vaatimukset kasvavat selvästi loogisella tavalla.

  1. Jos haluamme tukea moniytimisille järjestelmille, tarvitsemme tukea rinnakkaissuoritukseen.
  2. Jos tarvitsemme kehitysnopeutta, tarvitsemme kilpailukykyistä kehitystä tukevan kielen, kilpailukykyisen ohjelmoinnin. Jos joku ei ole havainnut eroa, se on hyvin yksinkertaista:
    • rinnakkaisohjelmoinnissa on kyse siitä, kuinka kaksi eri säiettä kulkee eri ytimissä;
    • samanaikainen suoritus, tarkemmin sanottuna samanaikaisuustuki, liittyy siihen, kuinka kieli (tai ajonaika, mikä tahansa) auttaa piilottamaan kaiken rinnakkaissuorituksen aiheuttaman monimutkaisuuden.
  3. Korkea vakaus. Ilmeisesti tarvitsimme klusterin, ja se oli parempi kuin mitä meillä oli myyjätuotteessa.

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Meillä ei todellakaan ollut paljon vaihtoehtoja, jos muistat. Ensinnäkin Erlang - me rakastamme sitä ja tiedämme sen, se oli henkilökohtainen suosikkini. Toiseksi Java ei ole edes Java, vaan nimenomaan Scala. Kolmanneksi kieli, jota emme tuolloin tienneet ollenkaan - Mene. Se oli juuri ilmestynyt silloin, tarkemmin sanottuna se oli ollut olemassa jo noin kaksi vuotta, mutta sitä ei ollut vielä julkaistu.

Voitettu Go!

Go:n historia

Teimme sille alustan. Yritän selittää miksi.

Go:n lyhyt historia. Aloitettiin vuonna 2007, avattiin 2009, ensimmäinen versio julkaistiin vuonna 2012 (eli aloimme työskennellä jo ennen ensimmäistä julkaisua). Aloittaja oli Google, joka halusi korvata, kuten epäilen, Javan.

Kirjoittajat ovat erittäin kuuluisia:

  • Ken Thomson, joka oli Unixin takana, keksi UTF-8:n, työskenteli Plan 9 -järjestelmän parissa;
  • Rob Pike, joka suunnitteli UTF-8:n Kenin kanssa, työskenteli myös Plan 9:n, Infernon, Limbon parissa Bell Labsissa;
  • Robert Gizmer, jonka tunnemme ja jota rakastamme Java HotSpot -kääntäjän keksimisestä ja V8:n generaattorin työstämisestä (Googlen Javascript-tulkki);
  • Ja yli 700 avustajaa, mukaan lukien jotkut korjaustiedostoistamme.

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Mene yhdellä silmäyksellä

Näemme, että kieli on enemmän tai vähemmän yksinkertaista ja ymmärrettävää. Meillä on ilmeisiä tyyppejä: joissakin tapauksissa ne on ilmoitettava, toisissa ei (eli tyypit päätellään joka tapauksessa).

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Voidaan nähdä, että on muodikasta kuvata rakenteita. Voidaan nähdä, että meillä on osoittimen käsite (missä tähti on). Voidaan nähdä, että taulukoiden ja assosiatiivisten taulukoiden alustuksen ilmoittamiselle on olemassa erityinen tuki.

Karkeasti ymmärrettävää - voit elää. Yritän kirjoittaa Hello, world:

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Mitä me näemme? Tämä on C:n kaltainen syntaksi, puolipiste on valinnainen. Se voi olla kahden rivin erotin, mutta vain jos nämä ovat kaksi rakennetta, jotka ovat täsmälleen samalla rivillä.

Näemme, että ohjausrakenteiden hakasulkeet (rivillä 14) ovat valinnaisia, mutta kiharat ovat aina pakollisia. Näemme, että kirjoitus on staattista. Tim näkyy useimmissa tapauksissa. Tämä esimerkki on hieman monimutkaisempi kuin tavallinen Hello, world - vain osoittaakseen, että siellä on kirjasto.

Mitä muuta pidämme tärkeänä? Koodi on järjestetty paketteihin. Ja jotta voit käyttää pakettia omassa koodissasi, sinun on tuotava se tuontidirektiivin avulla - tämä on myös tärkeää. Aloitamme - se toimii. Loistava!

Kokeillaan jotain monimutkaisempaa: Hei maailma, mutta nyt se on http-palvelin. Mitä mielenkiintoista näemme tässä?

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Ensinnäkin funktio toimii parametrina. Tämä tarkoittaa, että toimintomme on "ensiluokan kansalainen" ja sillä voi tehdä paljon mielenkiintoista toiminnallisella tyylillä. Näemme seuraavaksi odottamattoman: tuontidirektiivi viittaa suoraan GitHub-tietovarastoon. Aivan oikein, näin se on - ja lisäksi niin se pitää tehdä.

Gossa paketin yleinen tunniste on sen arkiston URL-osoite. On olemassa erityinen Goget-apuohjelma, joka käsittelee kaikki riippuvuudet, lataa ne, asentaa ne, kokoaa ne ja valmistelee ne tarvittaessa käyttöön. Samaan aikaan Goget tietää html-metasta. Vastaavasti voit pitää http-hakemistoa, joka sisältää linkkejä tiettyyn arkistoon (kuten esimerkiksi teemme).

Mitä muuta näemme? Http ja Json tavallisessa kirjastossa. Ilmeisesti on olemassa itsetutkiskelua - reflektiota, jota tulisi käyttää koodauksessa / json, koska yksinkertaisesti korvaamme sen jonkin mielivaltaisen objektin.

Suoritamme sen ja näemme, että meillä on 20 riviä hyödyllistä koodia, joka kääntää, suorittaa ja antaa koneen nykyisen keskimääräisen kuormituksen (koneella, jolla se on käynnissä).
Mitä muuta on tärkeää siitä, mitä voimme heti nähdä täällä? Se kokoaa yhteen staattiseen binaariin (buinary). Tällä binäärillä ei ole lainkaan riippuvuuksia, ei kirjastoja! Se voidaan kopioida mihin tahansa järjestelmään, suorittaa heti, ja se toimii.

Liikettä.

Mene: menetelmät ja käyttöliittymät

Golla on menetelmiä. Voit määrittää menetelmän mille tahansa mukautetulle tyypille. Lisäksi tämä ei välttämättä ole rakenne, vaan se voi olla jonkinlainen alias. Voit ilmoittaa aliaksen N32:lle ja kirjoittaa menetelmiä, joilla se tekee jotain hyödyllistä.

Ja tässä me joudumme umpikujaan ensimmäistä kertaa... Osoittautuu, että Golla ei ole luokkia sellaisenaan. Goon tuntevat voivat sanoa, että on olemassa tyyppiinkluusio, mutta tämä on täysin erilaista. Mitä nopeammin kehittäjä lakkaa ajattelemasta sitä perintönä, sitä parempi. Gossa ei ole luokkia, eikä myöskään perintöä.

Kysymys! Mitä Googlen johtama kirjailijaryhmä antoi meille näyttääkseen maailman monimutkaisuuden? Meille on annettu käyttöliittymät!

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

Käyttöliittymä on erityinen tyyppi, jonka avulla voit kirjoittaa yksinkertaisia ​​​​menetelmiä, menetelmän allekirjoituksia. Lisäksi mikä tahansa tyyppi, jolle nämä menetelmät ovat olemassa (suoritetaan), vastaavat tätä käyttöliittymää. Tämä tarkoittaa, että voit yksinkertaisesti kirjoittaa vastaavan funktion yhdelle tyypille, toiselle (joka vastaa kyseistä liitäntätyyppiä). Määritä seuraavaksi tämän liitännän tyyppinen muuttuja ja määritä sille mikä tahansa näistä objekteista.

Koville faneille voin sanoa, että tämä muuttuja sisältää itse asiassa kaksi osoitinta: toinen dataan, toinen erityiseen kuvaajataulukkoon, joka on ominaista tälle tietylle tyypille, tämän tyyppiseen käyttöliittymään. Toisin sanoen kääntäjä tekee sellaiset kuvaajataulukot linkityksen yhteydessä.

Ja Go:ssa on tietysti osoittimia mitättömiin. Sanaliitäntä {} (kahdella aaltosulkeella) on muuttuja, jonka avulla voit periaatteessa osoittaa mihin tahansa objektiin.
Toistaiseksi kaikki on kunnossa, kaikki on tuttua. Ei mitään yllättävää.

Mene: gorutiinit

Nyt päästään siihen, mistä olemme kiinnostuneita: kevyet prosessit - go-terminologiassa gorotiinit (gorutiinit).

Aleksei Naidenov. ITooLabs. Kehityskotelo Go (Golang) -puhelinalustalla. Osa 1

  1. Ensinnäkin ne ovat todella kevyitä (alle 2 kt).
  2. Toiseksi tällaisen gorutiinin luomisen kustannukset ovat mitättömät: voit luoda niitä tuhat sekunnissa - mitään ei tapahdu.
  3. Niitä palvelee heidän oma aikataulunsa, joka yksinkertaisesti siirtää ohjauksen yhdestä gorutiinista toiseen.
  4. Tässä tapauksessa hallinta siirtyy seuraavissa tapauksissa:
    • jos go-lause löytyy (jos gorutiini aloittaa seuraavan gorutiinin);
    • jos estävä Input/Out-puhelu on käytössä;
    • jos roskien keräys käynnistyy;
    • jos jokin toiminto kanavien kanssa käynnistetään.

Toisin sanoen aina, kun Go-ohjelma ajetaan tietokoneessa, se havaitsee järjestelmän ytimien määrän, käynnistää niin monta säiettä kuin tarvitaan (kuinka monta ydintä järjestelmässä on tai kuinka monta kerroit sille). Vastaavasti ajoittaja suorittaa nämä kevyet suoritussäikeet kaikissa näissä käyttöjärjestelmäsäikeissä kussakin ytimessä.

On huomattava, että tämä on tehokkain tapa käyttää rautaa. Sen lisäksi, mitä olemme osoittaneet, teemme paljon muutakin. Teemme esimerkiksi DPI-järjestelmiä, jotka mahdollistavat 40 gigabitin palvelemisen yhdessä yksikössä (riippuen siitä, mitä näissä linjoissa tapahtuu).

Siellä, jo ennen Goa, käytimme täsmälleen samaa järjestelmää juuri tästä syystä: koska sen avulla voit tallentaa prosessorin välimuistin sijainnin, vähentää merkittävästi käyttöjärjestelmän kontekstikytkimien määrää (mikä kestää myös erittäin kauan). Toistan: tämä on tehokkain tapa käyttää rautaa.

Tämä yksinkertainen 21-rivinen esimerkki on esimerkki, joka yksinkertaisesti tekee echo-palvelimen. Huomaa samalla, että palvelemisfunktio on erittäin yksinkertainen, se on lineaarinen. Ei ole takaisinsoittoja, ei tarvitse vaivautua ja miettiä... Voit vain lukea ja kirjoittaa!

Samanaikaisesti, jos luet ja kirjoitat, sen pitäisi itse asiassa estää - tämä goritiini yksinkertaisesti asetetaan jonoon ja ajoittaja ottaa sen, kun suoritus tulee jälleen mahdolliseksi. Toisin sanoen tämä yksinkertainen koodi voi toimia kaikupalvelimena niin monelle yhteydelle kuin tämän koneen käyttöjärjestelmä sallii.

Jatkuu pian...

Muutamia mainoksia 🙂

Kiitos, että pysyt kanssamme. Pidätkö artikkeleistamme? Haluatko nähdä mielenkiintoisempaa sisältöä? Tue meitä tekemällä tilauksen tai suosittelemalla ystäville, pilvi VPS kehittäjille alkaen 4.99 dollaria, ainutlaatuinen lähtötason palvelimien analogi, jonka me keksimme sinulle: Koko totuus VPS (KVM) E5-2697 v3 (6 ydintä) 10 Gt DDR4 480 Gt SSD 1 Gbps alkaen 19 dollarista tai kuinka jakaa palvelin? (saatavana RAID1:n ja RAID10:n kanssa, jopa 24 ydintä ja jopa 40 Gt DDR4-muistia).

Dell R730xd 2 kertaa halvempi Equinix Tier IV -palvelinkeskuksessa Amsterdamissa? Vain täällä 2 x Intel TetraDeca-Core Xeon 2 x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV alkaen 199 dollaria Alankomaissa! Dell R420 - 2x E5-2430 2.2 Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - alkaen 99 dollaria! Lukea Kuinka rakentaa infrastruktuuriyritys. luokkaa Dell R730xd E5-2650 v4 -palvelimilla 9000 euron arvosta penniä vastaan?

Lähde: will.com

Lisää kommentti