Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Alexey Naidenov, ĉefoficisto ITooLabs, parolas pri la evoluo de telekomunika platformo por telekomunikaj operatoroj en la programlingvo Go (Golang). Alexey ankaŭ dividas sian sperton pri deplojado kaj funkciigado de la platformo en unu el la plej grandaj aziaj teleentreprenistoj, kiu uzis la platformon por disponigi voĉpoŝton (Voĉpoŝto) kaj Virtualan PBX (Cloud PBX) servojn.

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Alexey Naydenov (ĉi-poste - AN): - Saluton al ĉiuj! Mia nomo estas Alexey Naidenov. Mi estas la direktoro de ITooLabs. Antaŭ ĉio, mi ŝatus respondi, kion mi faras ĉi tie kaj kiel mi alvenis ĉi tie.

Se vi rigardas la Bitrix24 Marketplace (sekcio "Telefonio"), tiam 14 aplikoj kaj 36 kiuj estas tie (40%) estas ni:

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Pli precize, ĉi tiuj estas niaj partneraj funkciigistoj, sed malantaŭ ĉio ĉi estas nia platformo (Platform as a Service) - kion ni vendas al ili por malgranda penco. Efektive, mi ŝatus paroli pri la evoluo de ĉi tiu platformo kaj kiel ni venis al Go.

Nombroj sur nia platformo nun:

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

44 partneraj funkciigistoj, inkluzive de MegaFon. Ĝenerale, ni amas aventuri, kaj ni fakte havas aliron al 100 milionoj da abonantoj de 44 telefonistoj ĉi tie en Rusio. Tial, se iu havas kelkajn komercajn ideojn, ni ĉiam feliĉas aŭskulti ilin.

  • 5000 uzantaj kompanioj.
  • 20 abonantoj entute. Ĉio estas b000b - ni laboras nur kun kompanioj.
  • 300 vokoj po minuto dum la tago.
  • 100 milionoj da vokaj minutoj pasintjare (ni festis). Ĉi tio estas sen konsideri la internajn intertraktadojn, kiuj estas en nia platformo.

Kiel ĝi komenciĝis?

Kiel la ĝustaj uloj komencas krei sian propran platformon? Ni devas ankaŭ konsideri, ke ni havis historion de disvolviĝo de "hardcore enterprise", kaj eĉ en la plej preciza tempo de la jaro por entrepreno! Estis tiu feliĉa tempo kiam vi venas al la kliento kaj diras: "Ni bezonas kelkajn pliajn servilojn." Kaj la kliento: “Jes, neniu demando! Ni havas dekon en la rako.

Do ni faris Oracle, Java, WebSphere, Db2 kaj ĉion tion. Tial ni kompreneble prenis la plej bonajn vendistajn solvojn, integris ilin kaj provis ekflugi kun ĝi. Ili ludis memstare. Estus tia interna starto.

Ĉio komenciĝis en 2009. Ekde 2006, ni estis proksime implikitaj en operaciistdecidoj, unu maniero aŭ alia. Ni faris plurajn kutimajn virtualajn PBX-ojn (kiel tio, kion ni nun havas sur ordono): ni rigardis, decidis, ke ĝi estas bona, kaj decidis stimuli internan lanĉon.

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Prenu VMWare. Ĉar ni promenis memstare, ni devis tuj forlasi la bonegan vendiston Stokado. Ni scias ĉion pri ili: ke promesoj estu dividitaj per 3, kaj la kosto devus esti multobligita per 10. Tial, ni faris DirDB kaj tiel plu.

Tiam ĝi komencis kreski. Al tio aldoniĝis la faktura servo, ĉar la platformo ne plu povis elteni. Tiam la faktura servilo de MySQL translokiĝis al Mongo. Kiel rezulto, ni ricevis funkciantan solvon, kiu prilaboras ĉiujn vokojn, kiuj iras tien:

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Sed ie interne turniĝas la sama vendistoprodukto - la ĉefa, nuklea, kiun ni iam prenis. Proksimume antaŭ la fino de 2011, ni mem komprenis, ke la ĉefa proplemkolo por ni, kompreneble, estos ĉi tiu aparta produkto - ni renkontos ĝin. Ni vidis antaŭ ni muron, en kiun ni kuris plengalope, dum klientoj marŝis, estis aldonitaj.
Sekve, ni devis fari ion. Kompreneble, ni multe esploris pri diversaj produktoj - kaj malfermfonte kaj vendistaj. Mi nun ne pritraktos ĉi tion - tio ne estas la afero. La plej lasta repliko, pri kiu ni pensis, estis krei nian propran platformon.

Finfine, ni venis al ĉi tiu opcio. Kial? Ĉar ĉiuj vendistaj kaj malfermfontaj produktoj estis faritaj por solvi problemojn antaŭ 10 jaroj. Nu, se 10-jaraĝa, kaj iom pli! La elekto fariĝis evidenta por ni: aŭ ni adiaŭas nian bonegan ideon pri ideala servo (por partneroj, funkciigistoj kaj ni mem), aŭ ni faras ion propran.

Ni decidis fari ion alian!

Platformaj Postuloj

Se vi faras ion dum longa tempo (vi ekspluatas la produkton de aliulo), tiam malrapide formiĝas en via kapo la penso: kiel mi mem farus tion? Ĉar ni ĉiuj estas programistoj en la kompanio (krom vendistoj, ne ekzistas ne-programistoj), niaj postuloj estas formitaj delonge, kaj ili estis klaraj:

  1. Alta disvolva rapido. La produkto de la vendisto, kiu turmentis nin, unue ne konvenis al ni, ĉar ĉio funkciis dum longa tempo kaj malrapide. Ni volis rapide - ni havis multajn ideojn! Ni ankoraŭ havas multajn ideojn, sed tiam la listo de ideoj estis tia, ke ĝi ŝajnis antaŭ dek jaroj. Nun nur dum unu jaro.
  2. Maksimuma utiligo de plurkerna fero. Tio ankaŭ estis grava por ni, ĉar ni vidis, ke nur pli kaj pli da kernoj estos.
  3. Alta fidindeco. Tiun ni ankaŭ ploris.
  4. Alta misfunkciadotoleremo.
  5. Ni volis fini kun ĉiutaga eldonprocezo. Por fari tion, ni bezonis elekton de lingvo.

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Sekve el la postuloj por la produkto, kiun ni prezentis por ni mem, la postuloj por la lingvo kreskas en klare logika maniero.

  1. Se ni volas subtenon por plurkernaj sistemoj, tiam ni bezonas subtenon por paralela ekzekuto.
  2. Se ni bezonas evolurapidecon, ni bezonas lingvon kiu subtenas konkurencivan disvolviĝon, konkurencivan programadon. Se iu ne renkontis la diferencon, tiam ĝi estas tre simpla:
    • paralela programado temas pri kiel du malsamaj fadenoj funkcias sur malsamaj kernoj;
    • samtempa ekzekuto, pli specife samtempa subteno, temas pri kiel la lingvo (aŭ rultempo, kio ajn) helpas kaŝi la tutan kompleksecon kiu venas de paralela ekzekuto.
  3. Alta stabileco. Evidente, ni bezonis areton, kaj ĝi estis pli bona ol tio, kion ni havis sur la vendistoprodukto.

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Ni vere ne havis multajn eblojn, se vi memoras. Unue, Erlang - ni amas ĝin kaj konas ĝin, ĝi estis mia persona, persona ŝatata. Due, Java eĉ ne estas Java, sed specife Scala. Trie, la lingvo, kiun ni en tiu tempo tute ne sciis - Iru. Ĝi ĵus aperis tiam, pli precize, ĝi jam ekzistis de ĉirkaŭ du jaroj, sed ankoraŭ ne estis liberigita.

Venkita Iru!

Historio de Go

Ni faris platformon sur ĝi. Mi provos klarigi kial.

Mallonga Historio de Go. Komencita en 2007, malfermita en 2009, la unua versio estis publikigita en 2012 (tio estas, ni eklaboris eĉ antaŭ la unua eldono). La iniciatinto estis Guglo, kiu volis anstataŭigi, kiel mi suspektas, Java.

La aŭtoroj estas tre famaj:

  • Ken Thomson, kiu estis malantaŭ Unikso, inventis UTF-8, laboris pri la Plano 9-sistemo;
  • Rob Pike, kiu dizajnis UTF-8 kun Ken, ankaŭ laboris pri Plan 9, Inferno, Limbo ĉe Bell Labs;
  • Robert Gizmer, kiun ni konas kaj amas pro la invento de la Java HotSpot Kompililo kaj pro laboro pri la generatoro en V8 (la Javascript-interpretilo de Guglo);
  • Kaj pli ol 700 kontribuantoj, inkluzive de kelkaj el niaj flikaĵoj.

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Iru je unu ekrigardo

Ni vidas, ke la lingvo estas pli-malpli simpla kaj komprenebla. Ni havas evidentajn tipojn: en kelkaj kazoj ili devas esti deklaritaj, en aliaj ili ne (tio signifas, ke la tipoj estas konkludeblaj ĉiukaze).

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Oni povas vidi, ke estas modo priskribi strukturojn. Oni povas vidi, ke ni havas la koncepton de montrilo (kie estas la asterisko). Oni povas vidi, ke ekzistas speciala subteno por deklari inicialigon de tabeloj kaj asociaj tabeloj.

Proksimume komprenebla - vi povas vivi. Provante skribi Saluton, mondo:

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Kion ni vidas? Ĉi tio estas C-simila sintakso, la punktokomo estas laŭvola. Ĝi povas esti apartigilo por du linioj, sed nur se ĉi tiuj estas du konstruaĵoj kiuj estas ĝuste sur la sama linio.

Ni vidas, ke la krampoj en la kontrolstrukturoj (sur la 14-a linio) estas laŭvolaj, sed buklaj estas ĉiam postulataj. Ni vidas, ke la tajpado estas statika. Tim en la plej multaj kazoj estas montrata. Ĉi tiu ekzemplo estas iomete pli komplika ol la kutima Saluton, mondo - nur por montri ke ekzistas biblioteko.

Kion alian ni vidas grava? La kodo estas organizita en pakaĵojn. Kaj por uzi la pakaĵon en via propra kodo, vi devas importi ĝin per la importdirektivo - tio ankaŭ gravas. Ni komencas - ĝi funkcias. Bonege!

Ni provu ion pli komplikan: Saluton, mondo, sed nun ĝi estas http-servilo. Kion ni vidas ĉi tie interesa?

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Unue, la funkcio funkcias kiel parametro. Ĉi tio signifas, ke la funkcio, kiun ni havas, estas "unuaklasa civitano" kaj vi povas fari multajn interesajn aferojn per ĝi en funkcia stilo. Ni vidas la neatenditan sekvan: la importdirektivo rilatas rekte al la deponejo de GitHub. Ĝuste, tiel estas — cetere, tiel oni faru.

En Go, la universala identigilo de pako estas la url de sia deponejo. Estas speciala ilo Goget, kiu iras por ĉiuj dependecoj, elŝutas ilin, instalas ilin, kompilas ilin kaj preparas ilin por uzo se necese. Samtempe Goget scias pri html-meta. Sekve, vi povas konservi http-dosierujon, kiu enhavos ligilojn al via specifa deponejo (kiel ni, ekzemple, faras).

Kion alian ni vidas? Http kaj Json en la regula biblioteko. Ekzistas, evidente, introspekto - reflektado, kiu devus esti uzata en kodigo / json, ĉar ni simple anstataŭigas iun arbitran objekton por ĝi.

Ni rulas ĝin kaj vidas, ke ni havas 20 liniojn da utila kodo, kiu kompilas, funkcias kaj donas la nunan averaĝan ŝarĝon de la maŝino (sur la maŝino, sur kiu ĝi funkcias).
Kio alia estas grava el tio, kion ni tuj povas vidi ĉi tie? Ĝi kompilas en unu senmovan binaron (buinary). Ĉi tiu binaro tute ne havas dependecojn, neniujn bibliotekojn! Ĝi povas esti kopiita al ajna sistemo, ruliĝi tuj, kaj ĝi funkcios.

Ni pluiru.

Iru: metodoj kaj interfacoj

Go havas metodojn. Vi povas deklari metodon por iu ajn kutima tipo. Krome, ĉi tio ne estas nepre strukturo, sed povas esti kaŝnomo de iu speco. Vi povas deklari kaŝnomon por N32 kaj skribi metodojn por ke ĝi faru ion utilan.

Kaj ĉi tie ni falas en stuporon por la unua fojo... Rezultas, ke Go ne havas klasojn kiel tia. Tiuj, kiuj konas Go, povas diri, ke ekzistas tipo-inkludo, sed ĉi tio estas tute malsama. Ju pli frue la programisto ĉesas pensi pri ĝi kiel heredo, des pli bone. Ne estas klasoj en Go, kaj ankaŭ ne estas heredo.

Demando! Kion donis al ni la kompanio de aŭtoroj gvidataj de Google por montri la kompleksecon de la mondo? Ni ricevis interfacojn!

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

Interfaco estas speciala tipo, kiu permesas vin skribi simplajn metodojn, metodajn subskribojn. Plue, ajna tipo por kiu ĉi tiuj metodoj ekzistas (estas ekzekutitaj) respondas al ĉi tiu interfaco. Tio signifas, ke vi povas simple skribi la respondan funkcion por unu tipo, por alia (kiu respondas al tiu interfaca tipo). Poste, deklaru variablon de la tipo de ĉi tiu interfaco kaj asignu iun el ĉi tiuj objektoj al ĝi.

Por ĝisostaj ŝatantoj, mi povas diri, ke ĉi tiu variablo efektive enhavos du montrilojn: unu al datumoj, la alia al speciala priskriba tabelo, kiu estas specifa por ĉi tiu aparta tipo, al la interfaco de ĉi tiu tipo. Tio estas, la kompililo faras tiajn tabelojn de priskribiloj en la momento de ligo.

Kaj estas, kompreneble, montriloj por malplenigi en Go. La vorto interfaco {} (kun du krampoj) estas variablo, kiu principe ebligas al vi montri ajnan objekton.
Ĝis nun ĉio estas en ordo, ĉio estas konata. Nenio surpriza.

Iru: gorutinoj

Nun ni venas al tio, kion ni interesas: malpezaj procezoj - gorutinoj (gorutinoj) en terminologio de Go.

Aleksej Najdenov. ITooLabs. Disvolva kazo sur Go (Golang) telefona platformo. Parto 1

  1. Unue, ili estas vere malpezaj (malpli ol 2 Kb).
  2. Due, la kosto de kreado de tia gorutino estas nekonsiderinda: vi povas krei mil el ili sekundo - nenio okazos.
  3. Ili estas servataj de sia propra planisto, kiu simple transdonas kontrolon de unu goroutino al alia.
  4. En ĉi tiu kazo, kontrolo estas transdonita en la sekvaj kazoj:
    • se oni renkontas go deklaron (se la gorutino komencas la sekvan gorutinon);
    • se bloka enigo/elvoko estas ebligita;
    • se rubkolekto estas ekigita;
    • se iu operacio kun kanaloj estas komencita.

Tio estas, kiam ajn Go-programo estas rulita en komputilo, ĝi detektas la nombron da kernoj en la sistemo, komencas tiom da fadenoj kiom necesas (kiom da kernoj estas en la sistemo, aŭ kiom vi diris al ĝi). Sekve, la planisto funkcios ĉi tiujn malpezajn fadenojn de ekzekuto sur ĉiuj ĉi tiuj operaciumaj fadenoj en ĉiu kerno.

Oni devas rimarki, ke ĉi tiu estas la plej efika maniero uzi feron. Krom tio, kion ni montris, ni faras multe pli. Ni faras, ekzemple, DPI-sistemojn, kiuj permesas servi 40 gigabitojn en unu unuo (depende de kio okazas en ĉi tiuj linioj).

Tie, eĉ antaŭ Go, ni uzis ĝuste la saman skemon ĝuste pro tio: ĉar ĝi ebligas al vi konservi la lokon de la procesora kaŝmemoro, signife redukti la nombron da OS-kuntekstoŝaltiloj (kiu ankaŭ prenas tre longan tempon). Mi ripetas: ĉi tiu estas la plej efika maniero uzi feron.

Ĉi tiu simpla 21-linia ekzemplo estas ekzemplo kiu simple faras eĥo-servilon. Samtempe, notu, ke la servo-funkcio estas ekstreme simpla, ĝi estas lineara. Ne estas revokoj, ne necesas ĝeni kaj pensi... Vi nur legas kaj skribas!

Samtempe, se vi legas kaj skribas, ĝi efektive devus bloki - ĉi tiu gorutino estas simple vicigita kaj prenita de la planisto kiam ekzekuto fariĝas ebla denove. Tio estas, ĉi tiu simpla kodo povas funkcii kiel eĥservilo por tiom da konektoj kiom permesos la OS sur ĉi tiu maŝino.

Daŭrigota tre baldaŭ...

Kelkaj reklamoj 🙂

Dankon pro restado ĉe ni. Ĉu vi ŝatas niajn artikolojn? Ĉu vi volas vidi pli interesan enhavon? Subtenu nin farante mendon aŭ rekomendante al amikoj, nuba VPS por programistoj de $4.99, unika analogo de enirnivelaj serviloj, kiu estis inventita de ni por vi: La tuta vero pri VPS (KVM) E5-2697 v3 (6 Kernoj) 10GB DDR4 480GB SSD 1Gbps de $ 19 aŭ kiel dividi servilon? (havebla kun RAID1 kaj RAID10, ĝis 24 kernoj kaj ĝis 40GB DDR4).

Dell R730xd 2 fojojn pli malmultekosta en Equinix Tier IV datumcentro en Amsterdamo? Nur ĉi tie 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 televidilo ekde 199 USD en Nederlando! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - ekde $99! Legu pri Kiel konstrui infrastrukturan korpon. klaso kun la uzo de serviloj Dell R730xd E5-2650 v4 valorantaj 9000 eŭrojn por centono?

fonto: www.habr.com

Aldoni komenton