Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Aleksey Naidenov, bosh direktor ITooLabs, Go (Golang) dasturlash tilida aloqa operatorlari uchun telekommunikatsiya platformasini ishlab chiqish haqida gapiradi. Aleksey, shuningdek, ovozli pochta (VoiceMail) va Virtual PBX (Cloud PBX) xizmatlarini taqdim etish uchun platformadan foydalangan eng yirik Osiyo telekommunikatsiya operatorlaridan birida platformani joylashtirish va ishlatish tajribasi bilan o'rtoqlashadi.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Aleksey Naydenov (keyingi o'rinlarda - AN): - Hammaga salom! Mening ismim Aleksey Naidenov. Men ITooLabs direktoriman. Avvalo, men bu erda nima qilayotganim va bu erga qanday kelganimga javob bermoqchiman.

Agar siz Bitrix24 Marketplace-ga ("Telefoniya" bo'limi) qarasangiz, u holda 14 ta ilova va 36 tasi (40%) biz:

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Aniqrog'i, bu bizning hamkor operatorlarimiz, ammo bularning barchasi ortida bizning platformamiz (Platforma xizmat sifatida) turibdi - biz ularga kichik bir tiyinga sotadigan narsamiz. Aslida, men ushbu platformaning rivojlanishi va Go'ga qanday kelganimiz haqida gapirmoqchiman.

Endi bizning platformamiz uchun raqamlar:

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

44 ta hamkor operatorlar, shu jumladan MegaFon. Umuman olganda, biz sarguzashtlarni boshdan kechirishni yaxshi ko'ramiz va biz Rossiyadagi 100 ta operatorning 44 million abonentiga kirish imkoniga egamiz. Shuning uchun, agar kimdir biznes g'oyalariga ega bo'lsa, biz doimo ularni tinglashdan xursandmiz.

  • 5000 foydalanuvchi kompaniyalar.
  • Hammasi bo'lib 20 000 obunachi. Hammasi b2b - biz faqat kompaniyalar bilan ishlaymiz.
  • Kun davomida daqiqasiga 300 ta qo'ng'iroq.
  • O'tgan yili 100 million qo'ng'iroq daqiqasi (biz nishonladik). Bu bizning platformamizdagi ichki muzokaralarni hisobga olmagan holda.

Bu qanday boshlandi?

Qanday qilib to'g'ri dudlar o'zlarining platformalarini yaratishni boshlaydilar? Shuni ham hisobga olish kerakki, bizda "qattiq korxona" rivojlanish tarixi bo'lgan va hatto korxona uchun yilning eng aniq vaqtida! Mijozning oldiga kelib: "Bizga yana bir nechta server kerak" deganingizda, o'sha baxtli vaqt edi. Va mijoz: β€œHa, savol yo'q! Bizda o'ntalik bor.

Shunday qilib, biz Oracle, Java, WebSphere, Db2 va boshqalarni qildik. Shuning uchun, biz, albatta, sotuvchining eng yaxshi echimlarini oldik, ularni birlashtirdik va u bilan ishlashga harakat qildik. Ular o'zlari o'ynashdi. Bu shunday ichki startap bo'ladi.

Hammasi 2009 yilda boshlangan. 2006 yildan beri biz operator qarorlarida u yoki bu tarzda yaqindan qatnashamiz. Biz bir nechta maxsus virtual PBXlarni yaratdik (masalan, bizda hozir buyurtma bo'yicha): biz ko'rib chiqdik, yaxshi deb qaror qildik va ichki startapni qo'zg'atishga qaror qildik.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

VMWare-ni oling. Biz o'zimiz yurganimiz sababli, biz darhol sovuq sotuvchi Storagedan voz kechishimiz kerak edi. Biz ular haqida hamma narsani bilamiz: va'dalar 3 ga bo'linishi kerak va xarajat 10 ga ko'paytirilishi kerak. Shuning uchun biz DirDB ni qildik va hokazo.

Keyin u o'sishni boshladi. Bunga hisob-kitob xizmati qo'shildi, chunki platforma endi bardosh bera olmadi. Keyin MySQL-dan billing serveri Mongo-ga o'tdi. Natijada biz u yerga kiradigan barcha qo'ng'iroqlarni qayta ishlaydigan ishchi yechimga ega bo'ldik:

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Ammo u erda, ichkarida xuddi shu sotuvchi mahsulot aylanmoqda - biz bir vaqtlar olgan asosiy, yadroviy mahsulot. Taxminan 2011 yil oxiriga kelib, biz o'zimiz uchun tushundikki, biz uchun asosiy to'siq, albatta, aynan shu mahsulot bo'ladi - biz unga duch kelamiz. Biz oldimizda bir devorni ko'rdik, biz uning ichiga to'liq yugurdik, xaridorlar yurganda, qo'shildi.
Shunga ko'ra, biz nimadir qilishimiz kerak edi. Albatta, biz turli xil mahsulotlar - ochiq manbalar va sotuvchilar bo'yicha juda ko'p tadqiqotlar o'tkazdik. Men hozir bu haqda to'xtalmayman - bu gap emas. Biz o'ylagan so'nggi nuqta - o'z platformamizni yaratish edi.

Oxir-oqibat, biz ushbu variantga keldik. Nega? Chunki barcha sotuvchi va ochiq kodli mahsulotlar 10 yil oldin muammolarni hal qilish uchun yaratilgan. Xo'sh, agar 10 yoshli bola bo'lsa va yana bir oz! Tanlov biz uchun ayon bo'ldi: yo biz ideal xizmat haqidagi ajoyib g'oyamiz bilan xayrlashamiz (hamkorlar, operatorlar va o'zimiz uchun) yoki biz o'zimiznikini qilamiz.

Biz boshqacha qilishga qaror qildik!

Platformaga qo'yiladigan talablar

Agar siz uzoq vaqt davomida biror narsa qilsangiz (birovning mahsulotidan foydalansangiz), u holda sizning boshingizda asta-sekin fikr shakllanadi: buni o'zim qanday qilardim? Biz hammamiz kompaniyada dasturchi bo'lganimiz sababli (sotuvchilardan tashqari, dasturchi bo'lmaganlar yo'q), bizning talablarimiz uzoq vaqtdan beri shakllangan va ular aniq edi:

  1. Yuqori rivojlanish tezligi. Bizni qiynagan sotuvchining mahsuloti birinchi navbatda bizga mos kelmadi, chunki hamma narsa uzoq vaqt va asta-sekin ishladi. Biz tezda xohladik - bizda juda ko'p g'oyalar bor edi! Bizda hali ko'p g'oyalar bor, lekin keyin g'oyalar ro'yxati shunday ediki, o'n yil oldinda bo'lib tuyuldi. Endi faqat bir yil.
  2. Ko'p yadroli temirdan maksimal darajada foydalanish. Bu biz uchun ham muhim edi, chunki biz faqat ko'proq yadrolar bo'lishini ko'rdik.
  3. Yuqori ishonchlilik. Biz ham yig'laganimiz.
  4. Yuqori xatoga chidamlilik.
  5. Biz kunlik reliz jarayonini yakunlamoqchi edik. Buning uchun bizga til tanlash kerak edi.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Shunga ko'ra, biz o'zimiz uchun taqdim etgan mahsulotga qo'yiladigan talablardan tilga qo'yiladigan talablar aniq mantiqiy tarzda o'sib boradi.

  1. Agar biz ko'p yadroli tizimlarni qo'llab-quvvatlamoqchi bo'lsak, unda parallel bajarish uchun yordam kerak.
  2. Rivojlanish tezligi kerak bo'lsa, raqobatbardosh rivojlanishni, raqobatbardosh dasturlashni qo'llab-quvvatlaydigan til kerak. Agar kimdir farqga duch kelmagan bo'lsa, unda bu juda oddiy:
    • parallel dasturlash turli yadrolarda ikki xil ipning qanday ishlashi haqida;
    • bir vaqtning o'zida bajarish, aniqrog'i, bir vaqtning o'zida qo'llab-quvvatlash, til (yoki ish vaqti, nima bo'lishidan qat'iy nazar) parallel bajarishdan kelib chiqadigan barcha murakkablikni yashirishga qanday yordam berishi haqida.
  3. Yuqori barqarorlik. Shubhasiz, bizga klaster kerak edi va u bizda sotuvchi mahsulotdagidan yaxshiroq edi.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Yodingizda bo'lsa, bizda juda ko'p variantlar yo'q edi. Birinchidan, Erlang - biz buni yaxshi ko'ramiz va bilamiz, bu mening shaxsiy, shaxsiy sevimli narsam edi. Ikkinchidan, Java hatto Java emas, balki Scala. Uchinchidan, o'sha paytda biz umuman bilmagan til - Go. U endigina paydo bo'lgan edi, aniqrog'i, u allaqachon ikki yil davomida mavjud edi, lekin hali chiqarilmagan edi.

Mag'lub Go!

Go tarixi

Biz uning ustiga platforma yasadik. Buning sababini tushuntirishga harakat qilaman.

Goning qisqacha tarixi. 2007 yilda boshlangan, 2009 yilda ochilgan, birinchi versiyasi 2012 yilda chiqarilgan (ya'ni biz birinchi nashrdan oldin ham ishlay boshladik). Tashabbuskor Google edi, u menimcha, Java-ni almashtirmoqchi edi.

Mualliflar juda mashhur:

  • Unix ortida turgan Ken Tomson UTF-8 ni ixtiro qilgan, Plan 9 tizimida ishlagan;
  • Ken bilan UTF-8 ni ishlab chiqqan Rob Pike, shuningdek, Bell Labs-da Plan 9, Inferno, Limbo ustida ishlagan;
  • Robert Gizmer, biz biladigan va Java HotSpot kompilyatorini ixtiro qilgani va V8 (Google'ning Javascript tarjimoni) generatori ustida ishlagani uchun yaxshi ko'ramiz;
  • Va 700 dan ortiq ishtirokchilar, jumladan, bizning yamoqlarimiz.

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Bir qarashda o'ting

Til ozmi-koβ€˜pmi sodda va tushunarli ekanligini koβ€˜ramiz. Bizda aniq turlari bor: ba'zi hollarda ular e'lon qilinishi kerak, boshqalarida esa yo'q (ya'ni, turlar baribir xulosa qilinadi).

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Tuzilmalarni tasvirlash moda ekanligini ko'rish mumkin. Ko'rinib turibdiki, bizda ko'rsatkich tushunchasi mavjud (yulduzcha qaerda). Ko'rinib turibdiki, massivlar va assotsiativ massivlarni ishga tushirishni e'lon qilish uchun maxsus yordam mavjud.

Taxminan tushunarli - siz yashashingiz mumkin. Salom, dunyo yozishga harakat qilaman:

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Biz nimani ko'ramiz? Bu C-ga o'xshash sintaksis, nuqta-vergul ixtiyoriy. Bu ikkita satr uchun ajratuvchi bo'lishi mumkin, lekin faqat bir xil chiziqda joylashgan ikkita konstruktsiya bo'lsa.

Biz nazorat tuzilmalarida (14-qatorda) qavslar ixtiyoriy ekanligini ko'ramiz, lekin jingalak bo'lganlar har doim talab qilinadi. Biz yozishning statik ekanligini ko'ramiz. Ko'p hollarda Tim ko'rsatiladi. Bu misol odatdagidek Salom, dunyodan biroz murakkabroq - shunchaki kutubxona borligini ko'rsatish uchun.

Yana nimani muhim deb bilamiz? Kod paketlarga ajratilgan. Paketni o'z kodingizda ishlatish uchun uni import direktivasi yordamida import qilishingiz kerak - bu ham muhimdir. Biz boshlaymiz - u ishlaydi. Ajoyib!

Keling, murakkabroq narsani sinab ko'raylik: Salom, dunyo, lekin endi bu http serveri. Bu erda biz nimani qiziqtirmoqdamiz?

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Birinchidan, funktsiya parametr sifatida ishlaydi. Bu shuni anglatadiki, bizda mavjud bo'lgan funktsiya "birinchi darajali fuqaro" va siz u bilan funktsional uslubda juda ko'p qiziqarli narsalarni qilishingiz mumkin. Biz kutilmagan holatni ko'ramiz: import direktivasi to'g'ridan-to'g'ri GitHub omboriga ishora qiladi. To'g'ri, shunday - bundan tashqari, shunday qilish kerak.

Go'da paketning universal identifikatori uning omborining URL manzilidir. Barcha bog'liqliklar uchun ketadigan, ularni yuklab oladigan, o'rnatadigan, kompilyatsiya qiladigan va kerak bo'lganda foydalanishga tayyorlaydigan maxsus Goget yordam dasturi mavjud. Shu bilan birga, Goget html-meta haqida biladi. Shunga ko'ra, siz http katalogini saqlab qo'yishingiz mumkin, u sizning maxsus omboringizga havolalarni o'z ichiga oladi (masalan, biz shunday qilamiz).

Yana nimani ko'ramiz? Oddiy kutubxonada Http va Json. Shubhasiz, / json kodlashda foydalanish kerak bo'lgan introspektsiya - aks ettirish mavjud, chunki biz uning o'rniga biron bir ixtiyoriy ob'ektni qo'yamiz.

Biz uni ishga tushiramiz va bizda kompilyatsiya qiluvchi, ishlaydigan va mashinaning joriy o'rtacha yukini (u ishlayotgan mashinada) beradigan 20 qator foydali kod borligini ko'ramiz.
Bu erda biz darhol ko'rishimiz mumkin bo'lgan yana nima muhim? U bitta statik ikkilik (buinary) ga kompilyatsiya qiladi. Bu ikkilik hech qanday bog'liqlikka ega emas, kutubxonalar yo'q! U har qanday tizimga ko'chirilishi mumkin, darhol ishga tushiriladi va u ishlaydi.

Biz davom etamiz.

Go: usullar va interfeyslar

Goning usullari bor. Siz har qanday maxsus turdagi usulni e'lon qilishingiz mumkin. Bundan tashqari, bu tuzilma bo'lishi shart emas, balki qandaydir turdagi taxallus bo'lishi mumkin. Siz N32 uchun taxallusni e'lon qilishingiz va foydali narsalarni qilish uchun usullarni yozishingiz mumkin.

Va bu erda biz birinchi marta ahmoq bo'lamiz ... Ma'lum bo'lishicha, Go'da bunday darslar yo'q. Go'ni biladiganlar, inklyuziya turi borligini aytishlari mumkin, ammo bu butunlay boshqacha. Ishlab chiquvchi uni meros sifatida o'ylashni qanchalik tez to'xtatsa, shuncha yaxshi. Go'da hech qanday sinf yo'q va meros ham yo'q.

Savol! Google boshchiligidagi mualliflar kompaniyasi dunyoning murakkabligini ko'rsatish uchun bizga nima berdi? Bizga interfeyslar berildi!

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

Interfeys - bu oddiy usullar, usul imzolarini yozish imkonini beruvchi maxsus tur. Bundan tashqari, ushbu usullar mavjud bo'lgan (bajariladigan) har qanday tur ushbu interfeysga mos keladi. Bu shuni anglatadiki, siz bir tur uchun mos keladigan funktsiyani boshqasiga yozishingiz mumkin (bu interfeys turiga mos keladi). Keyinchalik, ushbu interfeys turidagi o'zgaruvchini e'lon qiling va unga ushbu ob'ektlardan birini tayinlang.

Qattiq ishqibozlar uchun shuni aytishim mumkinki, bu o'zgaruvchi aslida ikkita ko'rsatgichni o'z ichiga oladi: biri ma'lumotlarga, ikkinchisi esa ushbu turdagi interfeysga xos bo'lgan maxsus tavsif jadvaliga. Ya'ni, kompilyator bog'lanish vaqtida shunday deskriptorlar jadvallarini tuzadi.

Va, albatta, Go'da bekor qilish uchun ko'rsatmalar mavjud. Interfeys so'zi {} (ikkita jingalak qavs bilan) printsipial jihatdan umuman istalgan ob'ektga ishora qilish imkonini beruvchi o'zgaruvchidir.
Hozircha hammasi joyida, hammasi tanish. Hech narsa ajablanarli emas.

Boring: gorutinlar

Endi bizni qiziqtirgan narsaga keldik: engil jarayonlar - Go terminologiyasida goroutinlar (goroutinlar).

Aleksey Naidenov. ITooLabs. Go (Golang) telefon platformasida ishlab chiqish ishi. 1-qism

  1. Birinchidan, ular haqiqatan ham engil (2 Kb dan kam).
  2. Ikkinchidan, bunday gorutinni yaratishning narxi ahamiyatsiz: siz soniyada mingtasini yaratishingiz mumkin - hech narsa bo'lmaydi.
  3. Ularga o'zlarining rejalashtiruvchisi xizmat ko'rsatadi, bu shunchaki boshqaruvni bir gorutindan boshqasiga o'tkazadi.
  4. Bunday holda, nazorat quyidagi hollarda o'tkaziladi:
    • agar go iborasi uchrasa (agar gorutin keyingi gorutinni boshlasa);
    • agar blokirovka qiluvchi kirish/chiqish qo'ng'irog'i yoqilgan bo'lsa;
    • agar axlat yig'ish ishga tushirilsa;
    • agar kanallar bilan ba'zi operatsiyalar boshlangan bo'lsa.

Ya'ni, har safar Go dasturi kompyuterda ishga tushirilsa, u tizimdagi yadrolar sonini aniqlaydi, kerak bo'lganda ko'p oqimlarni ishga tushiradi (tizimda nechta yadro bor yoki siz unga qancha dedingiz). Shunga ko'ra, rejalashtiruvchi har bir yadrodagi ushbu operatsion tizimning barcha ish zarralari bo'yicha ushbu engil bajarilish iplarini ishga tushiradi.

Shuni ta'kidlash kerakki, bu temirdan foydalanishning eng samarali usuli. Ko'rsatganimizdan tashqari, biz ko'proq narsani qilamiz. Biz, masalan, bir birlikda 40 gigabitga xizmat ko'rsatishga imkon beruvchi DPI tizimlarini yaratamiz (bu qatorlarda nima sodir bo'lishiga qarab).

U erda, Go'dan oldin ham, biz aynan shu sababga ko'ra aynan bir xil sxemadan foydalanganmiz: chunki u protsessor keshining joylashishini saqlashga, OS kontekstli kalitlari sonini sezilarli darajada kamaytirishga imkon beradi (bu ham juda uzoq vaqt talab etadi). Takror aytaman: bu temirdan foydalanishning eng samarali usuli.

Ushbu oddiy 21 qatorli misol shunchaki echo-serverni bajaradigan misoldir. Shu bilan birga, e'tibor bering, xizmat ko'rsatish funktsiyasi juda oddiy, u chiziqli. Qayta qo'ng'iroqlar yo'q, bezovtalanish va o'ylashning hojati yo'q ... Siz shunchaki o'qing va yozing!

Shu bilan birga, agar siz o'qisangiz va yozsangiz, u haqiqatan ham bloklanishi kerak - bu gorutin oddiygina navbatga qo'yiladi va uni bajarish yana mumkin bo'lganda rejalashtiruvchi tomonidan olinadi. Ya'ni, bu oddiy kod ushbu mashinadagi OT ruxsat bergan darajada ko'p ulanishlar uchun echo server vazifasini bajarishi mumkin.

Davomi tez orada...

Ba'zi reklamalar πŸ™‚

Biz bilan qolganingiz uchun tashakkur. Bizning maqolalarimiz sizga yoqdimi? Ko'proq qiziqarli tarkibni ko'rishni xohlaysizmi? Buyurtma berish yoki do'stlaringizga tavsiya qilish orqali bizni qo'llab-quvvatlang, 4.99 dollardan boshlab ishlab chiquvchilar uchun bulutli VPS, Siz uchun biz tomonidan ixtiro qilingan boshlang'ich darajadagi serverlarning noyob analogi: VPS (KVM) E5-2697 v3 (6 yadroli) 10GB DDR4 480GB SSD 1Gbps 19 dollardan yoki serverni qanday almashish haqida butun haqiqat? (RAID1 va RAID10, 24 tagacha yadro va 40 Gb gacha DDR4 bilan mavjud).

Amsterdamdagi Equinix Tier IV ma'lumotlar markazida Dell R730xd 2 baravar arzonmi? Faqat shu yerda 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 televizor 199 dollardan Gollandiyada! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 dollardan! Haqida o'qing Infratuzilma korporatsiyasini qanday qurish kerak. bir tiyinga 730 evroga teng Dell R5xd E2650-4 v9000 serverlaridan foydalanish bilan sinf?

Manba: www.habr.com

a Izoh qo'shish