Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Aleksey Naidenov, baş direktor ITooLabs, telekommunikasiya operatorları üçün Go (Qolanq) proqramlaşdırma dilində telekommunikasiya platformasının hazırlanmasından bəhs edir. Aleksey həmçinin platformanın səsli poçt (Səsli Poçt) və Virtual PBX (Cloud PBX) xidmətlərini təmin etmək üçün istifadə edən ən böyük Asiyanın telekommunikasiya operatorlarından birində yerləşdirilməsi və istismarı təcrübəsini bölüşür.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Aleksey Naydenov (bundan sonra - A.N.): - Hamıya salam! Mənim adım Aleksey Naidenovdur. Mən ITooLabs-ın direktoruyam. İlk öncə burada nə işlə məşğul olduğumu və bura necə düşdüyümə cavab vermək istərdim.

Bitrix24 Marketplace-ə ("Telefoniya" bölməsi) baxsanız, 14 tətbiq və orada olan 36 tətbiq (40%) bizik:

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Daha doğrusu, bunlar bizim partnyor operatorlarımızdır, lakin bütün bunların arxasında bizim platformamız (Platforma Xidmət kimi) dayanır - onlara kiçik qəpik-quruş üçün satdığımız şeylər. Əslində mən bu platformanın inkişafı və Go-a necə gəldiyimiz haqqında danışmaq istərdim.

İndi platformamız üçün nömrələr:

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

MegaFon da daxil olmaqla 44 tərəfdaş operator. Ümumiyyətlə, biz sərgüzəştlərə getməyi sevirik və əslində Rusiyada 100 operatorun 44 milyon abunəçisinə çıxışımız var. Ona görə də kiminsə hansısa biznes ideyası varsa, biz onları həmişə məmnuniyyətlə dinləyirik.

  • 5000 istifadəçi şirkəti.
  • Ümumilikdə 20 abunəçi. Hamısı b000b - biz yalnız şirkətlərlə işləyirik.
  • Gün ərzində dəqiqədə 300 zəng.
  • Keçən il 100 milyon zəng dəqiqəsi (biz qeyd etdik). Bu, bizim platformamızda olan daxili danışıqları nəzərə almadandır.

Necə başladı?

Doğru dostlar öz platformalarını yaratmağa necə başlayırlar? Həm də nəzərə almalıyıq ki, bizim "hardkor müəssisə" inkişaf tariximiz olub və hətta müəssisə üçün ilin ən dəqiq vaxtında! Müştərinin yanına gəlib: "Bizə daha bir neçə server lazımdır" dediyiniz o xoşbəxt vaxt idi. Və müştəri: “Bəli, sual yoxdur! Rəfdə on nəfərimiz var.

Beləliklə, biz Oracle, Java, WebSphere, Db2 və bütün bunları etdik. Buna görə də, əlbəttə ki, ən yaxşı satıcı həllərini götürdük, onları birləşdirdik və onunla yola çıxmağa çalışdıq. Onlar özbaşına oynayırdılar. Belə bir daxili başlanğıc olardı.

Hər şey 2009-cu ildə başladı. 2006-cı ildən biz bu və ya digər şəkildə operator qərarlarında yaxından iştirak edirik. Biz bir neçə fərdi virtual ATS yaratdıq (indi sifarişdə olanlar kimi): biz baxdıq, bunun yaxşı olduğuna qərar verdik və daxili startapı işə salmağa qərar verdik.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

VMWare-i götürün. Özümüz getdiyimiz üçün sərin satıcı Storage-dən dərhal imtina etməli olduq. Biz onlar haqqında hər şeyi bilirik: vədlər 3-ə bölünməlidir və xərclər 10-a vurulmalıdır. Ona görə də DirDB və s.

Sonra böyüməyə başladı. Hesablama xidməti buna əlavə edildi, çünki platforma artıq öhdəsindən gələ bilmədi. Sonra MySQL-dən hesablama serveri Mongo-ya keçdi. Nəticədə, ora gedən bütün zəngləri emal edən işləyən bir həll əldə etdik:

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Ancaq orada, içəridə eyni satıcı məhsulu fırlanır - bir vaxtlar götürdüyümüz əsas, nüvə məhsulu. Təxminən 2011-ci ilin sonuna qədər biz özümüz üçün başa düşdük ki, bizim üçün əsas darboğaz, əlbəttə ki, bu xüsusi məhsul olacaq - biz onunla qarşılaşacağıq. Qarşımızda gördük ki, müştərilər getdikcə tam çapa qaçdığımız divar əlavə olundu.
Buna uyğun olaraq nəsə etməli idik. Əlbəttə ki, biz müxtəlif məhsullar - həm açıq mənbə, həm də satıcı məhsullar üzərində kifayət qədər çox araşdırma apardıq. İndi bunun üzərində dayanmayacağam - məsələ bu deyil. Düşündüyümüz ən son dönüş öz platformamızı yaratmaq idi.

Nəhayət, bu varianta gəldik. Niyə? Çünki bütün satıcı və açıq mənbə məhsulları 10 il əvvəl problemləri həll etmək üçün hazırlanmışdır. Yaxşı, əgər 10 yaşında və bir az daha çox! Seçim bizim üçün aydın oldu: ya biz ideal xidmət haqqında böyük ideyamızla vidalaşırıq (tərəfdaşlar, operatorlar və özümüz üçün), ya da özümüz üçün nəsə edirik.

Fərqli bir şey etmək qərarına gəldik!

Platforma Tələbləri

Əgər siz uzun müddət nəyisə edirsinizsə (başqasının məhsulunu istismar edirsiniz), onda yavaş-yavaş beyninizdə belə bir fikir formalaşır: bunu özüm necə edərdim? Şirkətdə hamımız proqramçı olduğumuz üçün (satıcılardan başqa proqramçı olmayanlar yoxdur), tələblərimiz çoxdan formalaşıb və onlar aydın idi:

  1. Yüksək inkişaf sürəti. Bizə əzab verən satıcının məhsulu ilk növbədə bizə yaraşmadı, çünki hər şey uzun müddət və yavaş-yavaş getdi. Tez istəyirdik – çoxlu ideyalarımız var idi! Hələ çoxlu ideyalarımız var, amma sonra ideyaların siyahısı elə idi ki, sanki on il qabaqda idi. İndi yalnız bir ildir.
  2. Çox nüvəli dəmirdən maksimum istifadə. Bu da bizim üçün vacib idi, çünki biz gördük ki, daha çox nüvə olacaq.
  3. Yüksək etibarlılıq. Bizim də ağladığımız.
  4. Yüksək qüsurlara dözümlülük.
  5. Gündəlik buraxılış prosesini bitirmək istədik. Bunun üçün bizə dil seçimi lazım idi.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Müvafiq olaraq, özümüz üçün təqdim etdiyimiz məhsula olan tələblərdən dilə olan tələblər aydın məntiqli şəkildə böyüyür.

  1. Çox nüvəli sistemlər üçün dəstək istəyiriksə, o zaman paralel icra üçün dəstəyə ehtiyacımız var.
  2. İnkişaf sürətinə ehtiyacımız varsa, rəqabətə davamlı inkişafı, rəqabətli proqramlaşdırmanı dəstəkləyən bir dil lazımdır. Kimsə fərqlə qarşılaşmayıbsa, o zaman çox sadədir:
    • paralel proqramlaşdırma iki fərqli mövzunun müxtəlif nüvələrdə necə işlədiyini göstərir;
    • paralel icra, daha dəqiq desək, paralellik dəstəyi, dilin (və ya iş vaxtı, nə olursa olsun) paralel icradan irəli gələn bütün mürəkkəbliyi gizlətməyə necə kömək etməsi ilə bağlıdır.
  3. Yüksək sabitlik. Aydındır ki, bizə çoxluq lazım idi və bu, satıcı məhsulunda olandan daha yaxşı idi.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Yadınızdadırsa, bizim çox variantımız yox idi. Birincisi, Erlanq - biz bunu sevirik və bilirik, bu mənim şəxsi, şəxsi sevimlim idi. İkincisi, Java hətta Java deyil, konkret olaraq Scala-dır. Üçüncüsü, o zaman heç bilmədiyimiz dil - Get. O, təzəcə ortaya çıxmışdı, daha dəqiq desək, artıq iki ilə yaxın idi ki, mövcud idi, amma hələ də buraxılmamışdı.

Məğlub get!

Go tarixi

Onun üzərində platforma düzəltdik. Səbəbini izah etməyə çalışacağam.

Go'nun Qısa Tarixi. 2007-ci ildə başladı, 2009-cu ildə açıldı, ilk versiya 2012-ci ildə çıxdı (yəni ilk buraxılışdan əvvəl də işə başladıq). Təşəbbüskar, şübhələndiyim kimi, Java-nı əvəz etmək istəyən Google idi.

Müəlliflər çox məşhurdur:

  • Unix-in arxasında duran, UTF-8-i icad edən Ken Tomson, Plan 9 sistemi üzərində işləyirdi;
  • UTF-8-i Ken ilə birlikdə hazırlayan Rob Pike Bell Labs-da Plan 9, Inferno, Limbo üzərində də çalışmışdır;
  • Java HotSpot Kompilyatorunu icad etdiyinə və V8-də generator üzərində işləməsinə görə tanıdığımız və sevdiyimiz Robert Gizmer (Google-un Javascript tərcüməçisi);
  • Və bəzi yamaqlarımız da daxil olmaqla 700-dən çox iştirakçı.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Bir baxışda gedin

Dilin az-çox sadə və anlaşılan olduğunu görürük. Bizim açıq növlərimiz var: bəzi hallarda onları elan etmək lazımdır, digərlərində isə yoxdur (yani növlər hər halda təxmin edilir).

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Görünür ki, strukturları təsvir etmək dəbdədir. Görmək olar ki, bizdə göstərici anlayışı var (ulduz işarəsi olduğu yerdə). Görünür ki, massivlərin və assosiativ massivlərin inisializasiyasını elan etmək üçün xüsusi dəstək var.

Təxminən başa düşüləndir - yaşaya bilərsiniz. Salam, dünya yazmağa çalışıram:

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Biz nə görürük? Bu, C-yə bənzər sintaksisdir, nöqtəli vergül isteğe bağlıdır. Bu, iki sətir üçün ayırıcı ola bilər, ancaq bunlar eyni xətt üzərində olan iki konstruksiya olduqda.

Nəzarət strukturlarında (14-cü sətirdə) mötərizələrin isteğe bağlı olduğunu, lakin buruq olanların həmişə tələb olunduğunu görürük. Yazmanın statik olduğunu görürük. Tim əksər hallarda göstərilir. Bu misal adi “Salam, dünya” nümunəsindən bir qədər mürəkkəbdir – sadəcə olaraq kitabxananın olduğunu göstərmək üçün.

Başqa nəyi vacib görürük? Kod paketlərə bölünür. Paketi öz kodunuzda istifadə etmək üçün onu idxal direktivindən istifadə edərək idxal etməlisiniz - bu da vacibdir. Başlayırıq - işləyir. Əla!

Gəlin daha mürəkkəb bir şeyə cəhd edək: Salam, dünya, amma indi bu http serveridir. Burada maraqlı nə görürük?

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

Birincisi, funksiya parametr kimi çıxış edir. Bu o deməkdir ki, bizdə olan funksiya “birinci dərəcəli vətəndaş”dır və siz onunla funksional üslubda çoxlu maraqlı işlər görə bilərsiniz. Sonrakı gözlənilməzliyi görürük: idxal direktivi birbaşa GitHub repozitoriyasına aiddir. Düzdü, belədir - üstəlik, belə etmək lazımdır.

Go-da paketin universal identifikatoru onun deposunun URL-idir. Bütün asılılıqlar üçün gedən, onları yükləyən, quraşdıran, tərtib edən və lazım olduqda istifadəyə hazırlayan xüsusi Goget yardım proqramı var. Eyni zamanda, Goget html-meta haqqında bilir. Müvafiq olaraq, siz http qovluğunu saxlaya bilərsiniz, bu qovluqda xüsusi deponuza keçidlər olacaq (məsələn, biz etdiyimiz kimi).

Başqa nə görürük? Adi kitabxanada Http və Json. Aydındır ki, introspeksiya var - əksi, kodlaşdırmada / json istifadə edilməlidir, çünki biz sadəcə olaraq bunun üçün hansısa ixtiyari obyekti əvəz edirik.

Biz onu işə salırıq və görürük ki, maşının cari orta yükünü (işlədiyi maşında) tərtib edən, işlədən və verən 20 sətir faydalı kodumuz var.
Burada dərhal görə biləcəyimiz başqa nə vacibdir? Bir statik ikiliyə (buinary) tərtib edir. Bu binarın heç bir asılılığı, kitabxanası yoxdur! İstənilən sistemə kopyalana bilər, dərhal işə salın və işləyəcək.

Davam etmək.

Get: metodlar və interfeyslər

Go-nun üsulları var. İstənilən xüsusi tip üçün metod elan edə bilərsiniz. Üstəlik, bu, mütləq struktur deyil, hansısa tipli ləqəb ola bilər. Siz N32 üçün ləqəb elan edə və faydalı bir şey etmək üçün metodlar yaza bilərsiniz.

Və burada ilk dəfə stupor vəziyyətinə düşürük... Belə çıxır ki, Go-nun belə dərsləri yoxdur. Go'nu tanıyanlar deyə bilər ki, tip daxilolma var, amma bu tamam başqadır. Tərtibatçı bunu miras kimi düşünməyi nə qədər tez dayandırsa, bir o qədər yaxşıdır. Go-da heç bir sinif yoxdur və miras da yoxdur.

Sual! Google-un rəhbərlik etdiyi müəlliflər şirkəti dünyanın mürəkkəbliyini göstərmək üçün bizə nə verdi? Bizə interfeyslər verildi!

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

İnterfeys sadə üsulları, metod imzalarını yazmağa imkan verən xüsusi tipdir. Bundan əlavə, bu metodların mövcud olduğu (icra olunan) istənilən növ bu interfeysə uyğun olacaq. Bu o deməkdir ki, siz sadəcə olaraq bir növ üçün, digəri üçün (həmin interfeys növünə uyğundur) uyğun funksiyanı yaza bilərsiniz. Sonra, bu interfeysin tipli dəyişəni elan edin və bu obyektlərdən hər hansı birini ona təyin edin.

Sərt həvəskarlar üçün deyə bilərəm ki, bu dəyişən əslində iki göstəricidən ibarət olacaq: biri verilənlərə, digəri bu xüsusi tipə xas olan xüsusi deskriptor cədvəlinə, bu tip interfeysə. Yəni kompilyator əlaqələndirmə zamanı belə deskriptor cədvəllərini düzəldir.

Və əlbəttə ki, Go-da ləğv etmək üçün göstəricilər var. İnterfeys sözü {} (iki qıvrım mötərizə ilə) prinsipcə istənilən obyekti göstərməyə imkan verən dəyişəndir.
Hələlik hər şey qaydasındadır, hər şey tanışdır. Təəccüblü heç nə yoxdur.

Get: gorutinlər

İndi bizi maraqlandıran şeyə gəlirik: yüngül proseslər - Go terminologiyasında goroutines (goroutines).

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasında inkişaf işi. 1-ci hissə

  1. Birincisi, onlar həqiqətən yüngüldürlər (2 Kb-dən az).
  2. İkincisi, belə bir gorutinin yaradılmasının dəyəri əhəmiyyətsizdir: saniyədə onlardan min yarada bilərsiniz - heç bir şey olmayacaq.
  3. Onlara sadəcə nəzarəti bir gorutindən digərinə ötürən öz planlaşdırıcısı xidmət göstərir.
  4. Bu halda nəzarət aşağıdakı hallarda ötürülür:
    • go ifadəsi ilə qarşılaşdıqda (qorutin növbəti qorutinə başlayırsa);
    • bloklayan Giriş/Çıxış zəngi aktivdirsə;
    • zibil yığılması işə salınarsa;
    • kanallarla bəzi əməliyyatlar başlasa.

Yəni, hər dəfə kompüterdə Go proqramı işə salındıqda, o, sistemdəki nüvələrin sayını aşkar edir, lazım olan qədər mövzunu işə salır (sistemdə neçə nüvə var və ya siz ona nə qədər dediyiniz). Müvafiq olaraq, planlaşdırıcı hər bir nüvədə bu əməliyyat sistemi iplərinin hamısında bu yüngül icra iplərini işlədəcək.

Qeyd etmək lazımdır ki, bu, dəmirdən istifadə etməyin ən səmərəli yoludur. Göstərdiklərimizdən əlavə, biz daha çox şey edirik. Biz, məsələn, bir vahiddə 40 gigabitə xidmət etməyə imkan verən DPI sistemləri edirik (bu xətlərdə baş verənlərdən asılı olaraq).

Orada, hətta Go-dan əvvəl, biz məhz bu səbəbdən tam olaraq eyni sxemdən istifadə etdik: çünki bu, prosessor keşinin lokalizasiyasını saxlamağa, ƏS kontekstində keçidlərin sayını əhəmiyyətli dərəcədə azaltmağa imkan verir (bu da çox uzun vaxt aparır). Təkrar edirəm: dəmirdən istifadə etməyin ən təsirli yolu budur.

Bu sadə 21 sətirlik nümunə sadəcə echo-server edən bir nümunədir. Eyni zamanda qeyd edək ki, xidmət funksiyası son dərəcə sadədir, xəttidir. Zənglər yoxdur, narahat olmağa və düşünməyə ehtiyac yoxdur... Sadəcə oxuyub yazın!

Eyni zamanda, əgər siz oxuyub yazırsınızsa, o, əslində bloklanmalıdır - bu qorutin sadəcə növbəyə qoyulur və icra yenidən mümkün olduqda planlaşdırıcı tərəfindən götürülür. Yəni, bu sadə kod bu maşındakı OS-nin icazə verdiyi qədər çox əlaqə üçün əks-səda serveri kimi çıxış edə bilər.

Tezliklə davamı olacaq...

Bəzi reklamlar 🙂

Bizimlə qaldığınız üçün təşəkkür edirik. Məqalələrimiz xoşunuza gəlirmi? Daha maraqlı məzmun görmək istəyirsiniz? Sifariş verməklə və ya dostlarınıza tövsiyə etməklə bizə dəstək olun, developers üçün bulud VPS 4.99 dollardan, Sizin üçün bizim tərəfimizdən icad edilmiş giriş səviyyəli serverlərin unikal analoqu: VPS (KVM) E5-2697 v3 (6 nüvəli) 10GB DDR4 480GB SSD 1Gbps haqqında 19 dollardan bütün həqiqət və ya serveri necə paylaşmaq olar? (RAID1 və RAID10, 24 nüvəyə qədər və 40 GB DDR4 ilə mövcuddur).

Dell R730xd Amsterdamdakı Equinix Tier IV məlumat mərkəzində 2 dəfə ucuzdur? Yalnız burada 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV 199$-dan başlayan qiymətlərlə Hollandiyada! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 dollardan! haqqında oxuyun İnfrastruktur korporasiyasını necə qurmaq olar. bir qəpik üçün 730 avro dəyərində Dell R5xd E2650-4 v9000 serverlərinin istifadəsi ilə sinif?

Mənbə: www.habr.com

Добавить комментарий