Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Alexey Naidenov, zuzendari nagusia ITooLabs, Go (Golang) programazio hizkuntzan telekomunikazio-operadoreentzako telekomunikazio plataforma baten garapenari buruz hitz egiten du. Alexeyk plataforma Asiako telekomunikazio-operadore handienetako batean zabaldu eta ustiatzen duen esperientzia ere partekatzen du, plataforma hori ahots-posta (VoiceMail) eta PBX birtuala (Cloud PBX) zerbitzuak eskaintzeko erabiltzen zuena.

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Alexey Naydenov (aurrerantzean - AN): - Kaixo guztioi! Nire izena Alexey Naidenov da. ITooLabs-eko zuzendaria naiz. Lehenik eta behin, hemen zertan ari naizen eta nola bukatu nuen hemen erantzun nahiko nuke.

Bitrix24 Marketplace-ra begiratzen baduzu ("Telefonia" atala), orduan 14 aplikazio eta bertan dauden 36 (%40) gu gara:

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Zehatzago esanda, hauek dira gure bazkide-operadoreak, baina horren guztiaren atzean gure plataforma dago (Platform as a Service) - zentimo txiki baten truke saltzen dieguna. Egia esan, plataforma honen garapenaz eta Go-ra nola iritsi garen hitz egin nahiko nuke.

Orain gure plataformako zenbakiak hauek dira:

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

44 operadore bazkide, MegaFon barne. Oro har, abenturak ibiltzea gustatzen zaigu, eta egia esan 100 operadoreren 44 milioi harpidedun sarbidea dugu hemen Errusian. Horregatik, norbaitek negozio-ideia batzuk baditu, beti pozik entzuten ditugu.

  • 5000 enpresa erabiltzaile.
  • 20 harpidedun guztira. B000b da dena - enpresekin bakarrik lan egiten dugu.
  • 300 dei minutuko egunean zehar.
  • 100 milioi dei minutu iaz (ospatu genuen). Hau gure plataforman dauden barne negoziazioak kontuan hartu gabe.

Nola hasi zen?

Nola hasten dira mutil egokiak beren plataforma egiten? Gainera, kontuan izan behar dugu "hardcore enpresa" garapenaren historia izan genuela, eta baita urteko garairik zehatzenean ere enpresa batentzat! Bezeroarengana etortzen zarenean eta esaten duzun une alai hori zen: "Zerbitzari pare bat gehiago behar ditugu". Eta bezeroak: β€œBai, galderarik ez! Hamar bat dugu erretiluan.

Beraz, Oracle, Java, WebSphere, Db2 eta guzti egin genituen. Hori dela eta, noski, hornitzaileen soluzio onenak hartu, integratu eta horrekin abiatzen saiatu ginen. Euren kabuz jokatzen zuten. Halako barne startup bat izango litzateke.

2009an hasi zen dena. 2006az geroztik, era batera edo bestera operadoreen erabakietan oso parte hartu dugu. Hainbat PBX birtual pertsonalizatu egin genituen (orain eskaeran duguna bezala): begiratu, ona zela erabaki eta barne abiarazte bat piztea erabaki genuen.

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Hartu VMWare. Gure kabuz ibiltzen ginenez, berehala abandonatu behar izan genuen biltegiratze cool saltzailea. Horietaz dena dakigu: promesak 3z zatitu behar direla, eta kostua 10ez biderkatu. Horregatik, DirDB eta abar egin genituen.

Gero hazten hasi zen. Horri fakturazio zerbitzua gehitu zitzaion, plataformak ezin zuelako gehiago aurre egin. Ondoren, MySQL-ko fakturazio zerbitzaria Mongo-ra joan zen. Ondorioz, hor doazen dei guztiak prozesatzen dituen lan-soluzio bat lortu dugu:

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Baina nonbait barruan, saltzaile produktu bera biraka ari da - nagusia, nuklearra, behin hartu genuena. Gutxi gorabehera, 2011 amaieran, guretzat konturatu ginen guretzako botila-lepo nagusia, noski, produktu zehatz hau izango zela: harekin topo egingo dugu. Gure aurrean horma bat ikusi genuen, eta bertara galopan sartu ginen, bezeroak oinez zihoazela, gehitu zitzaizkigun.
Horren arabera, zerbait egin behar genuen. Noski, ikerketa asko egin ditugu hainbat produkturi buruz, kode irekikoei zein saltzaileei dagokienez. Ez naiz honetaz luzatuko orain, hori ez da kontua. Pentsatu genuen azken atzerakada gure plataforma propioa egitea izan zen.

Azkenean, aukera honetara iritsi ginen. Zergatik? Saltzaile eta kode irekiko produktu guztiak duela 10 urte arazoak konpontzeko egin zirelako. Tira, 10 urteko umea bada, eta beste batzuk! Hautua begien bistakoa egin zaigu: edo zerbitzu ideal baten ideia bikainari agur esaten diogu (bazkideei, operadoreei eta geure buruari), edo gure zerbait egiten dugu.

Zerbait ezberdina egitea erabaki dugu!

Plataformaren Baldintzak

Zerbait denbora luzez egiten baduzu (beste norbaiten produktua ustiatzen duzu), orduan, poliki-poliki, pentsamendua sortzen da zure buruan: nola egingo nuke nik neuk? Enpresan denok programatzaileak garenez (saltzaileak izan ezik, ez dago programatzailerik ez), gure eskakizunak aspalditik osatuta daude, eta argi zeuden:

  1. Garapen abiadura handia. Saltzailearen produktua, oinazeak gintuena, ez zitzaigun lehenik bat etorri, dena denbora luzez eta poliki-poliki funtzionatu baitzuen. Azkar nahi genuen: ideia asko genituen! Ideia asko dauzkagu oraindik, baina orduan ideia zerrenda halakoa zen, non bazirudien hamar urte baino lehen. Orain urtebete bakarrik.
  2. Nukleo anitzeko burdinaren erabilera maximoa. Hau ere garrantzitsua zen guretzat, gero eta nukleo gehiago egongo zirela ikusten genuelako.
  3. Fidagarritasun handia. Negar egin genuena ere.
  4. Akatsen tolerantzia handia.
  5. Eguneroko kaleratze prozesu batekin amaitu nahi genuen. Horretarako, hizkuntza aukeraketa bat behar genuen.

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Horren arabera, guk geuk aurkeztutako produktuaren eskakizunetatik, hizkuntzaren eskakizunak modu argi eta garbi logiko batean hazten dira.

  1. Nukleo anitzeko sistemetarako laguntza nahi badugu, exekuzio paralelorako laguntza behar dugu.
  2. Garapen-abiadura behar badugu, garapen lehiakorra onartzen duen hizkuntza behar dugu, programazio lehiakorra. Inork ez badu desberdintasunik aurkitu, oso erraza da:
    • programazio paraleloa bi hari ezberdin nukleo ezberdinetan nola exekutatzen diren buruzkoa da;
    • aldibereko exekuzioa, zehazkiago aldibereko euskarria, hizkuntzak (edo exekuzio-denborak, edozein dela ere) exekuzio paralelotik datorren konplexutasun guztia ezkutatzen laguntzen duenari buruzkoa da.
  3. Egonkortasun handia. Jakina, kluster bat behar genuen, eta saltzaileen produktuan genuena baino hobea zen.

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Ez geneukan aukera askorik, gogoan baduzue. Lehenik eta behin, Erlang - maite dugu eta badakigu, nire gogoko pertsonal eta pertsonala zen. Bigarrenik, Java ez da Java ere, Scala baizik. Hirugarrenik, garai hartan batere ezagutzen ez genuen hizkuntza - Go. Orduan agertu berria zen, zehatzago esanda, bi urte inguru zeramatzan jada, baina oraindik kaleratu gabe zegoen.

Garaitua Go!

Go-ren historia

Plataforma bat egin genuen bertan. Saiatuko naiz zergatik azaltzen.

Go-ren historia laburra. 2007an hasia, 2009an irekia, lehen bertsioa 2012an kaleratu zen (hau da, lehen bertsioa baino lehen hasi ginen lanean). Hasitzailea Google izan zen, eta horrek Java ordezkatu nahi zuen, susmoa dudanez.

Egileak oso famatuak dira:

  • Ken Thomsonek, Unix-en atzean zegoena, UTF-8 asmatu zuen, Plan 9 sisteman lan egin zuen;
  • Rob Pike, Kenekin UTF-8 diseinatu zuenak, Plan 9, Inferno, Limbo-n ere lan egin zuen Bell Labs-en;
  • Robert Gizmer, ezagutzen eta maite duguna Java HotSpot Compiler asmatzeagatik eta V8-n (Google-ren Javascript interpretea) sorgailuarekin lan egiteagatik;
  • Eta 700 laguntzaile baino gehiago, gure adabaki batzuk barne.

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Begiratu batean joan

Hizkuntza gehiago edo gutxiago sinplea eta ulergarria dela ikusten dugu. Mota nabariak ditugu: kasu batzuetan deklaratu behar dira, beste batzuetan ez (motak hala ere ondorioztatzen direla esan nahi du).

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Ikusten da modan dagoela egiturak deskribatzea. Erakusle kontzeptua dugula ikus daiteke (izartxoa dagoen lekuan). Ikus daiteke matrizeen eta array elkartuen hasierako deklaraziorako euskarri berezia dagoela.

Gutxi gorabehera ulergarria - bizi zaitezke. Kaixo, mundua idazten saiatzen ari naiz:

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Zer ikusten dugu? Hau C antzeko sintaxia da, puntu eta koma aukerakoa da. Bi lerroren bereizlea izan daiteke, baina horiek zuzen berdinean dauden bi eraikuntza badira soilik.

Kontrol egituretako parentesiak (14. lerroan) aukerakoak direla ikusten dugu, baina kizkurdunak beti behar dira. Idazketa estatikoa dela ikusten dugu. Tim kasu gehienetan bistaratzen da. Adibide hau ohikoa den Kaixo, mundua baino apur bat konplikatuagoa da, liburutegi bat dagoela erakusteko.

Zer gehiago ikusten dugu garrantzitsua? Kodea paketeetan antolatuta dago. Eta paketea zure kodean erabiltzeko, inportazio zuzentaraua erabiliz inportatu behar duzu - hori ere garrantzitsua da. Hasi gara - funtzionatzen du. Bikaina!

Saia gaitezen zerbait konplikatuagoa: Kaixo, mundua, baina orain http zerbitzari bat da. Zer ikusten dugu interesgarri hemen?

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Lehenik eta behin, funtzioak parametro gisa jokatzen du. Horrek esan nahi du daukagun funtzioa β€œlehen mailako herritarra” dela eta horrekin gauza interesgarri asko egin ditzakezula estilo funtzional batean. Ezustekoa ikusten dugu hurrengoa: inportazio zuzentarauak GitHub biltegiari egiten dio erreferentzia zuzenean. Hori bai, horrela da –gainera, horrela egin behar da–.

Go-n, pakete baten identifikatzaile unibertsala bere biltegiaren url-a da. Goget utilitate berezi bat dago menpekotasun guztietarako, deskargatu, instalatu, konpilatu eta behar izanez gero erabiltzeko prestatzen dituena. Aldi berean, Gogetek html-meta ezagutzen du. Horren arabera, http direktorio bat gorde dezakezu, zure biltegi zehatzerako estekak izango dituena (guk, adibidez, egiten dugun bezala).

Zer gehiago ikusten dugu? Http eta Json ohiko liburutegian. Bada, jakina, introspekzioa - hausnarketa, / json kodetzean erabili beharko litzatekeena, objektu arbitrarioren bat ordezkatzen dugulako.

Exekutatzen dugu eta ikusten dugu 20 kode erabilgarria konpilatzen, exekutatzen eta makinaren egungo batez besteko karga ematen duena (exekutatzen ari den makinan).
Zer gehiago da garrantzitsua hemen berehala ikus dezakegunaren arabera? Bitar estatiko batean (buinary) konpilatzen da. Binario honek ez du inolako menpekotasunik, ez liburutegirik! Edozein sistematara kopiatu daiteke, berehala exekutatu eta funtzionatuko du.

Aurrera.

Joan: metodoak eta interfazeak

Go metodoak ditu. Edozein motatako pertsonalizatutako metodo bat deklara dezakezu. Gainera, hau ez da zertan egitura bat, baina nolabaiteko alias bat izan daiteke. N32-rako alias bat deklara dezakezu eta metodoak idatzi ditzakezu zerbait erabilgarria egiteko.

Eta hortxe erortzen gara lehen aldiz estuporean... Go-k ez duela klaserik horrela gertatzen da. Go ezagutzen dutenek esan dezakete mota inklusioa dagoela, baina hau guztiz ezberdina da. Garatzaileak zenbat eta lehenago utzi herentzia gisa pentsatzeari, orduan eta hobeto. Go-n ez dago klaserik, eta ez dago herentziarik ere.

Galdera! Zer eman digu Googlek zuzentzen duen egileen konpainiak munduaren konplexutasuna erakusteko? Interfazeak eman dizkigute!

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

Interfaze bat metodo sinpleak, metodo sinadurak idazteko aukera ematen duen mota berezi bat da. Gainera, metodo hauek existitzen diren (exekutatzen diren) edozein motatako interfaze honi dagokio. Horrek esan nahi du mota bateko, beste baterako (interfaze mota horri dagokiona) dagokion funtzioa idatzi dezakezula. Ondoren, adierazi interfaze honen motako aldagai bat eta esleitu objektu horietako edozein.

Hardcore zaleentzat, aldagai honek benetan bi erakusle izango dituela esan dezaket: bata datuetara, bestea mota jakin honetarako espezifikoa den deskribatzaile-taula berezi batera, mota honetako interfazera. Hau da, konpilatzaileak honelako deskribatzaileen taulak egiten ditu lotzeko unean.

Eta, noski, hutsunearen erakusleak daude Go-n. Interfazea {} hitza (bi giltza kizkurrekin) printzipioz edozein objektu seinalatzeko aukera ematen duen aldagaia da.
Orain arte, dena ondo dago, dena ezaguna da. Ezer harritzekoa.

Joan: goroutinak

Orain interesatzen zaiguna iritsiko gara: prozesu arinak - goroutinak (goroutines) Go terminologian.

Alexey Naidenov. ITooLabs. Garapen kasua Go (Golang) telefono plataforman. 1. zatia

  1. Lehenik eta behin, benetan arinak dira (2 Kb baino gutxiago).
  2. Bigarrenik, halako goroutine bat sortzearen kostua arbuiagarria da: horietako mila sor ditzakezu segundoko - ez da ezer gertatuko.
  3. Beren programatzaileak zerbitzatzen ditu, eta horrek kontrola goroutine batetik bestera transferitzen du.
  4. Kasu honetan, kontrola kasu hauetan transferitzen da:
    • go adierazpena aurkitzen bada (goroutineak hurrengo goroutina hasten badu);
    • Sarrera/Irteerako dei blokeatzailea gaituta badago;
    • zabor bilketa abiarazten bada;
    • kanalekin eragiketaren bat hasten bada.

Hau da, Go programa bat ordenagailu batean exekutatzen den bakoitzean, sistemako nukleo kopurua detektatzen du, behar adina hari hasten ditu (sistemak zenbat nukleo dituen edo zenbat esan diozun). Horren arabera, programatzaileak exekuzio hari arin hauek exekutatu egingo ditu sistema eragilearen hari guztietan nukleo bakoitzean.

Kontuan izan behar da burdina erabiltzeko modurik eraginkorrena dela. Erakutsi dugunaz gain, askoz gehiago egiten dugu. Unitate batean 40 gigabit zerbitzatzea ahalbidetzen duten DPI sistemak egiten ditugu, adibidez (lerro hauetan gertatzen denaren arabera).

Bertan, Go baino lehen ere, eskema bera erabili genuen arrazoi honengatik: prozesadorearen cachearen kokapena gordetzeko aukera ematen duelako, sistema eragilearen testuinguru-aldaketen kopurua nabarmen murriztea (hori ere oso denbora luzea behar da). Berriro diot: hau da burdina erabiltzeko modurik eraginkorrena.

21 lerroko adibide sinple hau oihartzun-zerbitzaria egiten duen adibide bat da. Aldi berean, kontuan izan zerbitzari funtzioa oso erraza dela, lineala dela. Ez dago deirik, ez dago kezkatu eta pentsatu beharrik... Irakurri eta idatzi besterik ez duzu!

Aldi berean, irakurtzen eta idazten baduzu, benetan blokeatu beharko litzateke - goroutine hau ilaran jartzen eta programatzaileak hartzen du exekuzioa berriro posible denean. Hau da, kode sinple honek oihartzun zerbitzari gisa jardun dezake makina honetako OSak ahalbidetuko dituen hainbat konexiotarako.

Oso laster jarraitzeko...

Iragarki batzuk πŸ™‚

Eskerrik asko gurekin geratzeagatik. Gustuko dituzu gure artikuluak? Eduki interesgarri gehiago ikusi nahi? Lagun iezaguzu eskaera bat eginez edo lagunei gomendatuz, Garatzaileentzako hodeiko VPS 4.99 $-tik aurrera, sarrera-mailako zerbitzarien analogo paregabea, guk zuretzat asmatu duguna: VPS (KVM) E5-2697 v3 (6 Nukleoak) 10GB DDR4 480GB SSD 1Gbps 19Gbps-ri buruzko egia osoa XNUMX $-tik edo zerbitzari bat nola partekatu? (RAID1 eta RAID10-ekin erabilgarri, 24 nukleoraino eta 40 GB DDR4 arte).

Dell R730xd 2 aldiz merkeagoa Amsterdameko Equinix Tier IV datu-zentroan? Hemen bakarrik 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 telebista 199 $-tik aurrera Herbehereetan! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 $-tik aurrera! Irakurri buruz Nola eraiki azpiegitura korporazioa. klasea Dell R730xd E5-2650 v4 zerbitzarien erabilerarekin 9000 euroko balioa duten zentimo baten truke?

Iturria: www.habr.com

Gehitu iruzkin berria