Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Alexey Naidenov, forstjóri ITooLabs, fjallar um þróun fjarskiptavettvangs fyrir fjarskiptafyrirtæki á forritunarmálinu Go (Golang). Alexey deilir einnig reynslu sinni af því að dreifa og reka vettvanginn hjá einum stærsta símafyrirtækinu í Asíu, sem notaði vettvanginn til að veita talhólf (VoiceMail) og Virtual PBX (Cloud PBX) þjónustu.

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Alexey Naydenov (hér eftir - AN): - Hæ allir! Ég heiti Alexey Naidenov. Ég er forstjóri ITooLabs. Í fyrsta lagi vil ég svara því sem ég er að gera hér og hvernig ég endaði hér.

Ef þú skoðar Bitrix24 Marketplace (kafla "Símatækni"), þá erum við 14 forrit og 36 sem eru þar (40%):

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Nánar tiltekið eru þetta rekstraraðilar samstarfsaðila okkar, en á bak við þetta allt er vettvangurinn okkar (Platform as a Service) - það sem við seljum þeim fyrir litla eyri. Reyndar langar mig að tala um þróun þessa vettvangs og hvernig við komumst að Go.

Númerin fyrir vettvanginn okkar eru:

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

44 rekstraraðilar samstarfsaðila, þar á meðal MegaFon. Almennt séð elskum við að fara í ævintýri og við höfum í raun aðgang að 100 milljónum áskrifenda 44 rekstraraðila hér í Rússlandi. Þess vegna, ef einhver hefur einhverjar viðskiptahugmyndir, erum við alltaf fús til að hlusta á þær.

  • 5000 notendafyrirtæki.
  • Alls 20 áskrifendur. Þetta er allt b000b - við vinnum bara með fyrirtækjum.
  • 300 símtöl á mínútu yfir daginn.
  • 100 milljónir símtalamínúta í fyrra (við fögnuðum). Þetta er án þess að taka tillit til innri samningaviðræðna sem eru á vettvangi okkar.

Hvernig byrjaði það?

Hvernig byrja réttu náungarnir að búa til sinn eigin vettvang? Við verðum líka að taka með í reikninginn að við áttum sögu um þróun „harðkjarna fyrirtækja“ og jafnvel á nákvæmasta tíma ársins fyrir fyrirtæki! Það var þessi gleðitími þegar þú kemur til viðskiptavinarins og segir: „Við þurfum nokkra netþjóna í viðbót.“ Og viðskiptavinurinn: „Já, engin spurning! Við erum með tíu í rekkanum.

Svo við gerðum Oracle, Java, WebSphere, Db2 og allt það. Þess vegna tókum við að sjálfsögðu bestu sölulausnirnar, samþættum þær og reyndum að taka af skarið með það. Þeir léku sér sjálfir. Það væri svona innri gangsetning.

Þetta byrjaði allt árið 2009. Frá árinu 2006 höfum við tekið náið þátt í ákvörðunum rekstraraðila, með einum eða öðrum hætti. Við bjuggum til nokkrar sérsniðnar sýndar PBX (eins og það sem við höfum núna í pöntun): við skoðuðum, ákváðum að það væri gott og ákváðum að hræra upp innri gangsetningu.

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Taktu VMWare. Þar sem við vorum að labba á eigin spýtur þurftum við strax að yfirgefa flotta söluaðilann Storage. Við vitum allt um þau: að deila ætti loforðum með 3, og kostnaðinn ætti að margfalda með 10. Þess vegna gerðum við DirDB og svo framvegis.

Svo fór það að vaxa. Innheimtuþjónustan var bætt við þetta, vegna þess að pallurinn réði ekki lengur við. Þá flutti innheimtuþjónninn frá MySQL til Mongo. Fyrir vikið fengum við vinnulausn sem vinnur úr öllum símtölum sem fara þangað:

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

En einhvers staðar inni snýst sama söluvaran - sú helsta, kjarnorku, sem við tókum einu sinni. Um það bil í lok árs 2011 áttuðum við okkur á því að aðal flöskuhálsinn fyrir okkur verður auðvitað þessi tiltekna vara - við munum lenda í henni. Við sáum vegg fyrir framan okkur, sem við hlupum á fullu stökki, þegar viðskiptavinir gengu, bættust við.
Í samræmi við það urðum við að gera eitthvað. Auðvitað gerðum við töluvert miklar rannsóknir á ýmsum vörum - bæði opnum uppsprettu og söluaðilum. Ég ætla ekki að fjölyrða um þetta núna - það er ekki málið. Það síðasta sem við hugsuðum um var að búa til okkar eigin vettvang.

Á endanum komumst við að þessum möguleika. Hvers vegna? Vegna þess að allar seljendur og opinn uppspretta vörur voru gerðar til að leysa vandamál fyrir 10 árum síðan. Jæja, ef 10 ára gamall, og sumir fleiri! Valið er orðið augljóst fyrir okkur: annað hvort kveðjum við frábæra hugmynd okkar um kjörna þjónustu (fyrir samstarfsaðila, rekstraraðila og okkur sjálf), eða við gerum eitthvað upp á eigin spýtur.

Við ákváðum að gera eitthvað öðruvísi!

Kröfur um vettvang

Ef þú gerir eitthvað í langan tíma (þú nýtir þér vöru einhvers annars), þá myndast hugsunin hægt og rólega í höfðinu á þér: hvernig myndi ég gera það sjálfur? Þar sem við erum öll forritarar í fyrirtækinu (nema seljendur, það eru engir ekki forritarar) hafa kröfur okkar verið mótaðar í langan tíma og þær voru skýrar:

  1. Hár þróunarhraði. Vara söluaðilans, sem kvaldi okkur, hentaði okkur ekki til að byrja með því allt gekk upp í langan tíma og hægt. Okkur langaði hratt - við höfðum fullt af hugmyndum! Við erum enn með fullt af hugmyndum en svo var hugmyndalistinn þannig að hann virtist vera tíu ár fram í tímann. Nú aðeins í eitt ár.
  2. Hámarksnýting á fjölkjarna járni. Þetta var líka mikilvægt fyrir okkur því við sáum að það yrðu bara fleiri og fleiri kjarnar.
  3. Mikill áreiðanleiki. Sá sem við grétum líka.
  4. Mikið bilanaþol.
  5. Við vildum enda á daglegu útgáfuferli. Til þess þurftum við að velja tungumál.

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Samkvæmt því, af kröfum til vörunnar sem við höfum sett fram fyrir okkur sjálf, vaxa kröfurnar til tungumálsins á greinilega rökréttan hátt.

  1. Ef við viljum stuðning við fjölkjarna kerfi, þá þurfum við stuðning við samhliða framkvæmd.
  2. Ef við þurfum þróunarhraða þurfum við tungumál sem styður samkeppnisþróun, samkeppnishæfa forritun. Ef einhver hefur ekki rekist á muninn, þá er það mjög einfalt:
    • samhliða forritun snýst um hvernig tveir ólíkir þræðir liggja á mismunandi kjarna;
    • samhliða framkvæmd, nánar tiltekið samhliða stuðningur, snýst um hvernig tungumálið (eða keyrslutími, hvað sem er) hjálpar til við að fela allt það flókið sem kemur frá samhliða framkvæmd.
  3. Mikill stöðugleiki. Augljóslega þurftum við klasa og það var betra en það sem við höfðum á söluaðila vörunni.

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Við höfðum í raun ekki marga möguleika, ef þú manst. Í fyrsta lagi Erlang - við elskum það og vitum það, það var mitt persónulega, persónulega uppáhald. Í öðru lagi er Java ekki einu sinni Java, heldur sérstaklega Scala. Í þriðja lagi tungumálið sem við kunnum alls ekki á þeim tíma - Farðu. Það var nýbúið að birtast þá, nánar tiltekið, það hafði þegar verið til í um tvö ár, en hafði ekki enn verið gefið út.

Sigraði Go!

Saga Go

Við gerðum pall á það. Ég skal reyna að útskýra hvers vegna.

Stutt saga Go. Byrjaði árið 2007, opnaði árið 2009, fyrsta útgáfan kom út árið 2012 (þ.e.a.s. við byrjuðum að vinna jafnvel fyrir fyrstu útgáfuna). Upphafsmaðurinn var Google sem vildi koma í stað Java, eins og mig grunar.

Höfundarnir eru mjög frægir:

  • Ken Thomson, sem var á bak við Unix, fann upp UTF-8, vann að Plan 9 kerfinu;
  • Rob Pike, sem hannaði UTF-8 með Ken, vann einnig að Plan 9, Inferno, Limbo á Bell Labs;
  • Robert Gizmer, sem við þekkjum og elskum fyrir að hafa fundið upp Java HotSpot þýðandann og fyrir að vinna á rafalanum í V8 (Javascript túlkur Google);
  • Og yfir 700 þátttakendur, þar á meðal sumir plástra okkar.

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Farðu í hnotskurn

Við sjáum að tungumálið er meira og minna einfalt og skiljanlegt. Við höfum augljósar tegundir: í sumum tilfellum þarf að gefa upp þær, í öðrum ekki (sem þýðir að gerðir eru samt ályktaðar).

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Það má sjá að það er í tísku að lýsa mannvirkjum. Það má sjá að við höfum hugtakið bendil (þar sem stjörnumerkið er). Það má sjá að það er sérstakur stuðningur við að lýsa yfir frumstillingu fylkja og tengdra fylkja.

Í grófum dráttum skiljanlegt - þú getur lifað. Reynir að skrifa Halló, heimur:

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Hvað sjáum við? Þetta er C-lík setningafræði, semíkomma er valfrjáls. Það getur verið aðskilnaður fyrir tvær línur, en aðeins ef þetta eru tvær smíðar sem eru nákvæmlega á sömu línu.

Við sjáum að svigarnir í stjórnbyggingunum (á 14. línu) eru valfrjálsir, en krullaðir eru alltaf nauðsynlegir. Við sjáum að vélritunin er kyrrstæð. Tim birtist í flestum tilfellum. Þetta dæmi er aðeins flóknara en venjulega Halló, heimur - bara til að sýna að það er bókasafn.

Hvað annað sjáum við mikilvægt? Kóðanum er raðað í pakka. Og til að nota pakkann í þínum eigin kóða þarftu að flytja hann inn með því að nota innflutningstilskipunina - þetta er líka mikilvægt. Við byrjum - það virkar. Frábært!

Prófum eitthvað flóknara: Halló, heimur, en núna er þetta http þjónn. Hvað sjáum við áhugavert hér?

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Í fyrsta lagi virkar aðgerðin sem færibreyta. Þetta þýðir að hlutverkið sem við höfum er „fyrsta flokks borgari“ og þú getur gert margt áhugavert með það í hagnýtum stíl. Við sjáum hið óvænta næst: innflutningstilskipunin vísar beint til GitHub geymslunnar. Það er rétt, svona er það - þar að auki ætti það að vera þannig.

Í Go er alhliða auðkenni pakka slóð geymslu hans. Það er sérstakt Goget tól sem fer fyrir allar ósjálfstæðin, hleður þeim niður, setur þau upp, safnar þeim saman og undirbýr þau til notkunar ef þörf krefur. Á sama tíma veit Goget um html-meta. Í samræmi við það geturðu haldið http möppu, sem mun innihalda tengla á tiltekna geymsluna þína (eins og við, til dæmis, gerum).

Hvað sjáum við annað? Http og Json í venjulegu bókasafni. Það er augljóslega sjálfskoðun - spegilmynd, sem ætti að nota í kóðun / json, vegna þess að við skiptum einfaldlega einhverjum handahófskenndum hlut fyrir það.

Við keyrum hana og sjáum að við erum með 20 línur af gagnlegum kóða sem safnar saman, keyrir og gefur upp núverandi meðalálag vélarinnar (á vélinni sem hún er í gangi á).
Hvað annað er mikilvægt af því sem við sjáum strax hér? Það safnast saman í eina kyrrstöðu tvíundir (buinary). Þessi tvöfaldur hefur alls engin ósjálfstæði, engin bókasöfn! Það er hægt að afrita það yfir í hvaða kerfi sem er, keyra það strax og það mun virka.

Halda áfram.

Go: aðferðir og viðmót

Go hefur aðferðir. Þú getur lýst yfir aðferð fyrir hvaða sérsniðna gerð sem er. Þar að auki er þetta ekki endilega mannvirki, heldur getur verið samnefni af einhverri gerð. Þú getur lýst yfir samnefni fyrir N32 og skrifað aðferðir fyrir það til að gera eitthvað gagnlegt.

Og þetta er þar sem við föllum í dofna í fyrsta skipti ... Það kemur í ljós að Go er ekki með námskeið sem slíkt. Þeir sem þekkja Go segja kannski að það sé tegundainnihald, en þetta er allt öðruvísi. Því fyrr sem verktaki hættir að hugsa um það sem arf, því betra. Það eru engir flokkar í Go og það er engin arfleifð heldur.

Spurning! Hvað gaf fyrirtæki höfunda undir forystu Google okkur til að sýna hversu flókinn heimurinn er? Við höfum fengið viðmót!

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

Viðmót er sérstök gerð sem gerir þér kleift að skrifa einfaldar aðferðir, aðferðaundirskriftir. Ennfremur mun hvaða tegund sem þessar aðferðir eru til fyrir (eru keyrðar) samsvara þessu viðmóti. Þetta þýðir að þú getur einfaldlega skrifað samsvarandi aðgerð fyrir eina tegund, fyrir aðra (sem samsvarar þeirri viðmótsgerð). Næst skaltu lýsa yfir breytu af gerð þessa viðmóts og úthluta einhverjum af þessum hlutum til hennar.

Fyrir harðkjarna aðdáendur get ég sagt að þessi breyta mun í raun innihalda tvær ábendingar: einn á gögn, hinn á sérstaka lýsingartöflu sem er sértæk fyrir þessa tilteknu tegund, að viðmóti þessarar tegundar. Það er að þýðandinn gerir slíkar töflur með lýsingum á þeim tíma sem tengt er.

Og það eru auðvitað vísbendingar um ógildingu í Go. Orðið tengi {} (með tveimur hrokknum axlaböndum) er breyta sem gerir þér kleift að benda á hvaða hlut sem er í grundvallaratriðum.
Enn sem komið er er allt í lagi, allt er kunnuglegt. Ekkert sem kemur á óvart.

Fara: goroutines

Nú komum við að því sem við höfum áhuga á: léttum ferlum - goroutines (goroutines) í Go hugtökum.

Alexey Naidenov. ITooLabs. Þróunarmál á Go (Golang) símapalli. 1. hluti

  1. Í fyrsta lagi eru þeir mjög léttir (minna en 2 Kb).
  2. Í öðru lagi er kostnaðurinn við að búa til svona goroutine hverfandi: þú getur búið til þúsund af þeim á sekúndu - ekkert mun gerast.
  3. Þeim er þjónað af sínum eigin tímaáætlun, sem einfaldlega flytur stjórn frá einum goroutine til annars.
  4. Í þessu tilviki er eftirlitið flutt í eftirfarandi tilvikum:
    • ef go setning kemur upp (ef goroutine byrjar næstu goroutine);
    • ef læst inn/út símtal er virkt;
    • ef sorphirða fer af stað;
    • ef einhver aðgerð með rásum er hafin.

Það er að segja, alltaf þegar Go forrit er keyrt á tölvu, skynjar það fjölda kjarna í kerfinu, byrjar eins marga þræði og þarf (hversu margir kjarna eru í kerfinu, eða hversu margir þú sagðir það til). Í samræmi við það mun tímaáætlunarmaðurinn keyra þessa léttu framkvæmdaþræði á öllum þessum stýrikerfisþráðum í hverjum kjarna.

Það skal tekið fram að þetta er hagkvæmasta leiðin til að nýta járn. Fyrir utan það sem við höfum sýnt gerum við miklu meira. Við gerum til dæmis DPI kerfi sem gera kleift að þjóna 40 gígabitum í einni einingu (fer eftir því hvað gerist í þessum línum).

Þar, jafnvel áður en Go, notuðum við nákvæmlega sama kerfi af þessari ástæðu: vegna þess að það gerir þér kleift að vista staðsetningu örgjörva skyndiminni, draga verulega úr fjölda OS samhengisrofa (sem tekur líka mjög langan tíma). Ég endurtek: þetta er áhrifaríkasta leiðin til að nýta járn.

Þetta einfalda 21 lína dæmi er dæmi sem gerir einfaldlega echo-server. Á sama tíma skaltu athuga að þjónaaðgerðin er afar einföld, hún er línuleg. Það eru engar hringingar, engin þörf á að nenna og hugsa... Maður les bara og skrifar!

Á sama tíma, ef þú lest og skrifar, ætti það í raun að loka - þessi goroutine er einfaldlega í biðröð og tekin af tímaáætlunarmanninum þegar framkvæmd verður möguleg aftur. Það er, þessi einfaldi kóði getur virkað sem bergmálsþjónn fyrir eins margar tengingar og stýrikerfið á þessari vél leyfir.

Framhald mjög fljótlega...

Nokkrar auglýsingar 🙂

Þakka þér fyrir að vera hjá okkur. Líkar þér við greinarnar okkar? Viltu sjá meira áhugavert efni? Styðjið okkur með því að leggja inn pöntun eða mæla með því við vini, cloud VPS fyrir forritara frá $4.99, einstök hliðstæða upphafsþjóna, sem var fundið upp af okkur fyrir þig: Allur sannleikurinn um VPS (KVM) E5-2697 v3 (6 kjarna) 10GB DDR4 480GB SSD 1Gbps frá $19 eða hvernig á að deila netþjóni? (fáanlegt með RAID1 og RAID10, allt að 24 kjarna og allt að 40GB DDR4).

Dell R730xd 2x ódýrari í Equinix Tier IV gagnaveri í Amsterdam? Aðeins hér 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 sjónvarp frá $199 í Hollandi! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - frá $99! Lestu um Hvernig á að byggja upp infrastructure Corp. flokki með notkun Dell R730xd E5-2650 v4 netþjóna að verðmæti 9000 evrur fyrir eyri?

Heimild: www.habr.com

Bæta við athugasemd