Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Alexey Naidenov, izvršni direktor ITooLabs, govori o razvoju telekomunikacijske platforme za teleoperatere u programskom jeziku Go (Golang). Alexey također dijeli svoje iskustvo implementacije i rada platforme u jednom od najvećih azijskih telekom operatera, koji je koristio platformu za pružanje usluga govorne pošte (VoiceMail) i Virtualne PBX (Cloud PBX).

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Alexey Naydenov (u daljnjem tekstu - AN): - Bok svima! Moje ime je Alexey Naidenov. Ja sam direktor ITooLabs-a. Prije svega, htio bih odgovoriti što ja ovdje radim i kako sam se ovdje našao.

Ako pogledate Bitrix24 Marketplace (odjeljak "Telefonija"), onda smo mi 14 aplikacija i 36 (40%):

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Točnije, radi se o našim partnerskim operaterima, ali iza svega toga stoji naša platforma (Platform as a Service) - ono što im prodajemo za sitne pare. Zapravo, želio bih govoriti o razvoju ove platforme i kako smo došli do Go.

Brojevi za našu platformu sada su:

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

44 partnerska operatera, uključujući MegaFon. Općenito govoreći, volimo ići u avanture i zapravo imamo pristup do 100 milijuna pretplatnika 44 operatera ovdje u Rusiji. Stoga, ako netko ima neke poslovne ideje, uvijek ih rado saslušamo.

  • 5000 tvrtki korisnika.
  • Ukupno 20 pretplatnika. Sve je to b000b - radimo samo s tvrtkama.
  • 300 poziva u minuti tijekom dana.
  • 100 milijuna minuta poziva prošle godine (slavili smo). Ovo je bez uzimanja u obzir internih pregovora koji su na našoj platformi.

Kako je počelo?

Kako pravi tipovi počnu stvarati vlastitu platformu? Također treba uzeti u obzir da smo imali povijest razvoja “hardcore enterprisea”, pa čak iu najtočnijem dobu godine za poduzeće! Bilo je to ono sretno vrijeme kada dođete kupcu i kažete: "Trebamo još par servera." A kupac: “Da, nema pitanja! Imamo desetku u stalku.

Pa smo napravili Oracle, Java, WebSphere, Db2 i sve to. Stoga smo uzeli, naravno, najbolja rješenja proizvođača, integrirali ih i pokušali s njima krenuti. Igrali su sami. Bio bi to takav interni startup.

Sve je počelo 2009. godine. Od 2006. godine blisko smo uključeni u odluke operatora, na ovaj ili onaj način. Napravili smo nekoliko prilagođenih virtualnih PBX-ova (poput onoga što sada imamo po narudžbi): pogledali smo, zaključili da je to dobro i odlučili pokrenuti interni startup.

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Uzmite VMWare. Budući da smo hodali sami, morali smo odmah napustiti cool dobavljača Storage. Znamo sve o njima: da obećanja treba podijeliti s 3, a trošak pomnožiti s 10. Stoga smo radili DirDB i tako dalje.

Onda je počelo rasti. Tome je pridodana usluga naplate, jer platforma više nije mogla izdržati. Zatim se poslužitelj za naplatu iz MySQL-a preselio u Mongo. Kao rezultat toga, dobili smo radno rješenje koje obrađuje sve pozive koji idu tamo:

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Ali negdje tamo, unutra, vrti se isti proizvod dobavljača - onaj glavni, nuklearni, koji smo jednom uzeli. Otprilike do kraja 2011. sami smo shvatili da će nam glavno usko grlo, naravno, biti upravo ovaj proizvod - na njega ćemo naletjeti. Vidjeli smo zid ispred nas, u koji smo trčali u punom galopu, dok su mušterije hodale.
Sukladno tome, morali smo nešto učiniti. Naravno, dosta smo istraživali razne proizvode - i one otvorenog koda i one dobavljača. Neću sada na ovome – nije to poenta. Zadnja zamjena o kojoj smo razmišljali bila je izrada vlastite platforme.

Na kraju smo došli do ove opcije. Zašto? Zato što su svi proizvodi dobavljača i proizvodi otvorenog koda napravljeni za rješavanje problema prije 10 godina. Pa, ako je 10-godišnjak, i nešto više! Izbor nam je postao očigledan: ili ćemo se oprostiti od naše sjajne ideje o idealnoj usluzi (za partnere, operatere i sebe), ili ćemo učiniti nešto svoje.

Odlučili smo napraviti nešto drugačije!

Zahtjevi platforme

Ako nešto radite dugo (iskorištavate tuđi proizvod), onda vam se u glavi polako stvara misao: kako bih ja to sam napravio? Budući da smo u tvrtki svi programeri (osim prodavača, nema neprogramera), naši zahtjevi su se formirali dugo vremena i bili su jasni:

  1. Visoka brzina razvoja. Proizvod dobavljača, koji nas je mučio, u prvom redu nije nam odgovarao jer je sve radilo dugo i sporo. Htjeli smo brzo – imali smo puno ideja! Imamo još puno ideja, ali tada je popis ideja bio takav da se činilo kao da je deset godina unaprijed. Sada samo na godinu dana.
  2. Maksimalno iskorištenje višejezgrenog željeza. To je bilo važno i za nas, jer smo vidjeli da će jezgri biti sve više.
  3. Visoka pouzdanost. Ona koju smo također plakali.
  4. Visoka tolerancija grešaka.
  5. Željeli smo završiti s dnevnim procesom izdavanja. Da bismo to učinili, potreban nam je izbor jezika.

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Sukladno tome, iz zahtjeva za proizvod koje smo si postavili, zahtjevi za jezikom rastu na jasno logičan način.

  1. Ako želimo podršku za multi-core sustave, onda trebamo podršku za paralelno izvođenje.
  2. Ako trebamo brzinu razvoja, trebamo jezik koji podržava konkurentni razvoj, konkurentno programiranje. Ako netko nije naišao na razliku, onda je vrlo jednostavna:
    • paralelno programiranje govori o tome kako dvije različite niti rade na različitim jezgrama;
    • paralelno izvođenje, točnije podrška za istovremenost, govori o tome kako jezik (ili vrijeme izvođenja, što god) pomaže sakriti svu složenost koja proizlazi iz paralelnog izvođenja.
  3. Visoka stabilnost. Očito nam je trebao klaster i bio je bolji od onoga što smo imali na proizvodu dobavljača.

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Nismo baš imali puno opcija, ako se sjećate. Prvo, Erlang - volimo ga i znamo, bio je moj osobni favorit. Drugo, Java nije čak ni Java, nego konkretno Scala. Treće, jezik koji tada uopće nismo poznavali – Go. Tada se tek pojavio, točnije, postojao je već oko dvije godine, ali još nije bio pušten u prodaju.

Poraženi Go!

Povijest Goa

Na njemu smo napravili platformu. Pokušat ću objasniti zašto.

Kratka povijest Goa. Pokrenut 2007., otvoren 2009., prva verzija izašla je 2012. (odnosno, počeli smo raditi i prije prvog izdanja). Inicijator je bio Google, koji je htio zamijeniti, pretpostavljam, Javu.

Autori su vrlo poznati:

  • Ken Thomson, koji je stajao iza Unixa, izumio je UTF-8, radio na sustavu Plan 9;
  • Rob Pike, koji je dizajnirao UTF-8 s Kenom, također je radio na Planu 9, Inferno, Limbo u Bell Labsu;
  • Robert Gizmer, kojeg poznajemo i volimo zbog izuma Java HotSpot Compiler-a i zbog rada na generatoru u V8 (Googleov Javascript interpreter);
  • I više od 700 suradnika, uključujući neke od naših zakrpa.

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Idi na prvi pogled

Vidimo da je jezik više-manje jednostavan i razumljiv. Imamo očite tipove: u nekim slučajevima ih treba deklarirati, u drugima ne (što znači da se tipovi ionako izvode).

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Vidi se da je moderno opisivati ​​strukture. Vidi se da imamo pojam pokazivača (gdje je zvjezdica). Vidi se da postoji posebna podrška za deklariranje inicijalizacije nizova i asocijativnih nizova.

Otprilike razumljivo – može se živjeti. Pokušavam napisati Hello, world:

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Što vidimo? Ovo je sintaksa slična C-u, točka-zarez nije obavezan. Može biti razdjelnik za dva retka, ali samo ako su to dva konstrukta koji su točno na istom retku.

Vidimo da zagrade u kontrolnim strukturama (u 14. redu) nisu obavezne, ali su vitičaste uvijek potrebne. Vidimo da je tipkanje statično. Tim se u većini slučajeva prikazuje. Ovaj primjer je malo kompliciraniji od uobičajenog Hello, world - samo da pokaže da postoji knjižnica.

Što još vidimo važnim? Kod je organiziran u pakete. A kako biste koristili paket u vlastitom kodu, trebate ga uvesti pomoću direktive za uvoz - ovo je također važno. Počinjemo - radi. Sjajno!

Pokušajmo nešto kompliciranije: Pozdrav, svijete, ali sada je to http poslužitelj. Što tu vidimo zanimljivo?

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Prvo, funkcija djeluje kao parametar. To znači da je funkcija koju imamo “građanin prvog reda” i s njom možete raditi puno zanimljivih stvari u funkcionalnom stilu. Sljedeće vidimo neočekivano: direktiva za uvoz upućuje izravno na GitHub repozitorij. Tako je, tako je – štoviše, tako treba i raditi.

U Gou, univerzalni identifikator paketa je url njegovog repozitorija. Postoji poseban uslužni program Goget koji radi za sve ovisnosti, preuzima ih, instalira, kompajlira i priprema za upotrebu ako je potrebno. U isto vrijeme, Goget zna za html-meta. U skladu s tim, možete voditi http direktorij, koji će sadržavati veze na vaše specifično spremište (kao što mi, na primjer, radimo).

Što još vidimo? Http i Json u redovnoj knjižnici. Tu je, očito, introspekcija - refleksija, koju treba koristiti u kodiranju / json, jer jednostavno zamijenimo neki proizvoljni objekt umjesto nje.

Pokrećemo ga i vidimo da imamo 20 redaka korisnog koda koji se kompajlira, pokreće i daje trenutno prosječno opterećenje stroja (na stroju na kojem se izvodi).
Što je još važno od onoga što ovdje odmah vidimo? Sastavlja se u jedan statički binarni (buinary). Ova binarna datoteka uopće nema ovisnosti, nema knjižnica! Može se kopirati u bilo koji sustav, odmah pokrenuti i radit će.

Idemo dalje.

Go: metode i sučelja

Go ima metode. Možete deklarirati metodu za bilo koju prilagođenu vrstu. Štoviše, ovo nije nužno struktura, već može biti pseudonim neke vrste. Možete deklarirati alias za N32 i napisati metode za njega da učini nešto korisno.

I tu prvi put padamo u stupor ... Ispostavilo se da Go nema klase kao takve. Oni koji poznaju Go mogu reći da postoji uključivanje tipova, ali ovo je potpuno drugačije. Što prije programer prestane o tome razmišljati kao o naslijeđu, to bolje. U Gou nema klasa, a nema ni nasljeđivanja.

Pitanje! Što nam je dalo društvo autora predvođenih Googleom kako bismo prikazali kompleksnost svijeta? Dobili smo sučelja!

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

Sučelje je posebna vrsta koja vam omogućuje pisanje jednostavnih metoda, potpisa metoda. Nadalje, bilo koji tip za koji ove metode postoje (izvode se) će odgovarati ovom sučelju. To znači da možete jednostavno napisati odgovarajuću funkciju za jednu vrstu, za drugu (koja odgovara toj vrsti sučelja). Zatim deklarirajte varijablu tipa ovog sučelja i dodijelite joj bilo koji od ovih objekata.

Za tvrdokorne fanove mogu reći da će ova varijabla zapravo sadržavati dva pokazivača: jedan na podatke, drugi na posebnu tablicu deskriptora koja je specifična za ovaj određeni tip, na sučelje ovog tipa. Odnosno, kompajler pravi takve tablice deskriptora u vrijeme povezivanja.

A tu su, naravno, i upućivači na void u Go-u. Riječ sučelje {} (s dvije vitičaste zagrade) je varijabla koja vam u načelu omogućuje da pokažete na bilo koji objekt.
Zasad je sve u redu, sve je poznato. Ništa iznenađujuće.

Idi: goroutines

Sada dolazimo do onoga što nas zanima: lagani procesi - goroutine (goroutine) u Go terminologiji.

Aleksej Najdenov. ITooLabs. Razvojni slučaj na Go (Golang) telefonskoj platformi. 1. dio

  1. Prvo, stvarno su lagani (manje od 2 Kb).
  2. Drugo, trošak stvaranja takve goroutine je zanemariv: možete ih stvoriti tisuću u sekundi - ništa se neće dogoditi.
  3. Opslužuje ih vlastiti planer, koji jednostavno prenosi kontrolu s jedne goroutine na drugu.
  4. U ovom slučaju, kontrola se prenosi u sljedećim slučajevima:
    • ako se naiđe na naredbu go (ako goroutina pokrene sljedeću goroutinu);
    • ako je omogućen blokirajući Input/Out poziv;
    • ako se pokrene prikupljanje smeća;
    • ako se pokrene neka operacija s kanalima.

Odnosno, kad god se Go program pokrene na računalu, on detektira broj jezgri u sustavu, pokreće onoliko niti koliko je potrebno (koliko jezgri sustav ima ili koliko ste mu rekli). Sukladno tome, planer će pokrenuti ove lagane niti izvršavanja na svim ovim nitima operativnog sustava u svakoj jezgri.

Treba napomenuti da je to najučinkovitiji način iskorištavanja željeza. Osim ovoga što smo pokazali, radimo puno više. Izrađujemo, primjerice, DPI sustave koji omogućuju posluživanje 40 gigabita u jednoj jedinici (ovisno o tome što se događa u tim linijama).

Tamo smo, čak i prije Go-a, koristili potpuno istu shemu upravo iz ovog razloga: jer vam omogućuje da sačuvate lokaciju predmemorije procesora, značajno smanjite broj promjena konteksta OS-a (što također traje jako dugo). Ponavljam: ovo je najučinkovitiji način iskorištavanja željeza.

Ovaj jednostavan primjer od 21 reda je primjer koji jednostavno radi echo-server. Istodobno, imajte na umu da je funkcija posluživanja iznimno jednostavna, linearna je. Nema povratnih poziva, nema potrebe za mučenjem i razmišljanjem... Vi samo čitate i pišete!

U isto vrijeme, ako čitate i pišete, to bi zapravo trebalo blokirati - ova goroutina se jednostavno stavlja u red čekanja i preuzima je planer kada izvođenje ponovno postane moguće. To jest, ovaj jednostavni kod može djelovati kao echo poslužitelj za onoliko veza koliko OS na ovom stroju dopušta.

Nastavak uskoro...

Neki oglasi 🙂

Hvala što ste ostali s nama. Sviđaju li vam se naši članci? Želite li vidjeti više zanimljivog sadržaja? Podržite nas narudžbom ili preporukom prijateljima, cloud VPS za programere od 4.99 USD, jedinstveni analog poslužitelja početne razine, koji smo izmislili za vas: Cijela istina o VPS (KVM) E5-2697 v3 (6 jezgri) 10GB DDR4 480GB SSD 1Gbps od 19 USD ili kako podijeliti poslužitelj? (dostupno s RAID1 i RAID10, do 24 jezgre i do 40 GB DDR4).

Dell R730xd 2 puta jeftiniji u Equinix Tier IV podatkovnom centru u Amsterdamu? Samo ovdje 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV od 199 USD u Nizozemskoj! Dell R420 - 2x E5-2430 2.2 Ghz 6C 128 GB DDR3 2x960 GB SSD 1 Gbps 100 TB - od 99 USD! Pročitaj o Kako izgraditi infrastrukturu corp. klase uz korištenje Dell R730xd E5-2650 v4 servera vrijednih 9000 eura za lipu?

Izvor: www.habr.com

Dodajte komentar