Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Алексей Найденов, бас директор ITooLabs, Go (Golang) бағдарламалау тілінде байланыс операторлары үшін телекоммуникациялық платформаны дамыту туралы айтады. Алексей сонымен қатар платформаны дауыстық пошта қызметтерін (VoiceMail) және Виртуалды PBX (Cloud PBX) ұсыну үшін пайдаланған ірі азиялық байланыс операторларының бірінде платформаны орналастыру және пайдалану тәжірибесімен бөліседі.

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Алексей Найденов (бұдан әрі – А.Н.): - Бәріңе сәлем! Менің атым Алексей Найденов. Мен ITooLabs директорымын. Ең алдымен, мен мұнда не істеп жатырмын және осында қалай жеткеніме жауап бергім келеді.

Bitrix24 Marketplace («Телефония» бөлімі) қарасаңыз, онда 14 қолданба және 36 (40%) біз:

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Дәлірек айтқанда, бұл біздің оператор серіктестеріміз, бірақ мұның бәрінің артында біздің платформамыз (Платформа қызмет көрсету) тұр - біз оларға аз тиынға сатамыз. Негізі мен бұл платформаның дамуы және Go-ға қалай келгеніміз туралы айтқым келеді.

Біздің платформаға арналған сандар:

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

44 оператор серіктестері, соның ішінде Мегафон. Жалпы алғанда, біз әртүрлі шытырман оқиғаларға барғанды ​​ұнатамыз және біз Ресейдегі 100 оператордың 44 миллион абонентіне нақты қол жеткізе аламыз. Сондықтан, кімде-кім бизнес-идеялары болса, біз әрқашан оларды қуана тыңдаймыз.

  • 5000 пайдаланушы компаниялар.
  • Барлығы 20 000 жазылушы. Мұның бәрі b2b - біз тек компаниялармен жұмыс істейміз.
  • Күні бойы минутына 300 қоңырау.
  • Өткен жылы 100 миллион қоңырау минуты (біз тойладық). Бұл біздің платформада қолжетімді ішкі келіссөздерді есепке алмайды.

Бұл қалай басталды?

Дұрыс жігіттер өздерінің платформаларын қалай бастайды? Сондай-ақ бізде «қатты кәсіпорынның» даму тарихы бар екенін ескеру керек, тіпті кәсіпорын үшін жылдың ең дәл уақытында! Тұтынушыға келіп: «Бізге тағы бірнеше сервер керек» деп айтатын бақытты кез еді. Ал тұтынушы: «Сұрақ жоқ! Біздің сөреде он бар».

Сонымен, біз Oracle, Java, WebSphere, Db2 және осының бәрін жасадық. Сондықтан, біз, әрине, ең жақсы сатушы шешімдерін қабылдадық, оларды біріктірдік және онымен бірге шығуға тырыстық. Біз өз бетімізше жүрдік. Бұл ішкі стартап болар еді.

Мұның бәрі іс жүзінде 2009 жылы басталды. 2006 жылдан бері біз операторлық шешімдермен тығыз араласып келеміз. Біз бірнеше реттелетін виртуалды АТС жасадық (қазір тапсырыс бойынша бар сияқты): біз оны қарап шықтық, бұл жақсы деп шештік және ішкі іске қосуды бастауды шештік.

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Біз VMWare бағдарламасын алдық. Біз өзіміз болғандықтан, салқын сатушы қоймасынан дереу бас тартуға тура келді. Біз олар туралы бәрін білеміз: бұл уәделерді 3-ке бөлу керек, ал шығындарды 10-ға көбейту керек. Сондықтан олар DirDB жасады және т.б.

Содан кейін ол өсе бастады. Бұған шот ұсыну қызметі қосылды, себебі платформа бұдан былай жеңе алмайды. Содан кейін MySQL төлем сервері Mongo-ға көшті. Нәтижесінде біз сол жерге баратын барлық қоңырауларды өңдейтін жұмыс шешімін алдық:

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Бірақ бір жерде, іште, сол бір сатушы өнім - біз бір кездері алған негізгі, ядролық өнім айналдырады. Шамамен 2011 жылдың аяғында біз үшін басты кедергі, әрине, дәл осы өнім болатынын түсіндік - біз оған тап боламыз. Біз алдымызда қабырғаны көрдік, оған біз барған сайын жүгіре бердік, өйткені көбірек клиенттер келе бастады.
Тиісінше, бізге бірдеңе істеу керек болды. Әрине, біз әртүрлі өнімдерге - ашық бастапқы кодқа да, сатушыға да көптеген зерттеулер жүргіздік. Мен қазір бұл туралы тоқталмаймын - бұл біз туралы емес. Біз ойлаған ең соңғы қалпына келтіру нұсқасы - өз платформамызды жасау.

Ақырында, біз осы нұсқаға келдік. Неліктен? Өйткені барлық сатушы және ашық бастапқы өнімдер 10 жыл бұрын болған мәселелерді шешу үшін жасалған. Ал, егер 10 жаста болса және одан да көп болса! Таңдау бізге айқын болды: не идеалды қызмет туралы тамаша идеямызбен қоштасамыз (серіктестер, операторлар және өзіміз үшін), немесе біз өзіміздің бірдеңе жасаймыз.

Біз өз қолымыздан бір нәрсе жасауды шештік!

Платформаға қойылатын талаптар

Егер сіз ұзақ уақыт бойы бірдеңемен айналыссаңыз (біреудің өнімін пайдаланып), онда сіздің басыңызда бірте-бірте ой пайда болады: мұны өзім қалай істей аламын? Біз барлығымыз компанияда бағдарламашы болғандықтан (сатушыларды қоспағанда, бағдарламашы еместер жоқ), біздің талаптарымыз бұрыннан қалыптасқан және олар анық болды:

  1. Жоғары даму жылдамдығы. Бізді қинаған сатушы өнімі, ең алдымен, қанағаттанарлық емес еді, өйткені бәрі ұзақ және баяу шықты. Біз мұны тез қаладық - бізде көптеген идеялар болды! Бізде әлі де көп идеялар бар, бірақ ол кезде идеялар тізімі он жыл бұрын сияқты көрінетін. Енді бір жылға ғана.
  2. Көп ядролы темірді максималды пайдалану. Бұл біз үшін де маңызды болды, өйткені біз барған сайын көбірек ядролардың болатынын көрдік.
  3. Жоғары сенімділік. Бір нәрсеге біз де жыладық.
  4. Сәтсіздіктерге жоғары төзімділік.
  5. Біз күнделікті шығарылымдар процесін аяқтағымыз келді. Ол үшін бізге тіл таңдау керек болды.

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Тиісінше, өзімізге қойған өнімге қойылатын талаптардан тілге қойылатын талаптар айқын қисынды түрде өседі.

  1. Егер біз көп ядролы жүйелерге қолдау алғымыз келсе, онда параллель орындау үшін қолдау қажет.
  2. Даму жылдамдығы қажет болса, бәсекеге қабілетті дамуды, бәсекеге қабілетті бағдарламалауды қолдайтын тіл керек. Егер біреу айырмашылыққа тап болмаса, бұл өте қарапайым:
    • Параллельді бағдарламалау екі түрлі ағынның әртүрлі ядроларда қалай орындалатыны туралы;
    • Бір мезгілде орындау немесе дәлірек айтқанда, параллельді қолдау тілдің (немесе орындалу уақыты маңызды емес) параллель орындаудан туындайтын барлық күрделілікті жасыруға қалай көмектесетіні туралы.
  3. Жоғары тұрақтылық. Әлбетте, бізге кластер керек болды және сатушының өніміндегіден жақсырақ.

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Естеріңізде болса, бізде онша көп нұсқа болған жоқ. Біріншіден, Ерланг - біз оны жақсы көреміз және білеміз, бұл менің жеке сүйіктім болды. Екіншіден, Java тіпті Java емес, әсіресе Scala. Үшіншіден, ол кезде мүлде білмейтін тіл – Бар. Ол сол кезде ғана пайда болды, дәлірек айтсақ, ол екі жылдай болды, бірақ әлі шығарылмаған.

Жеңіске барыңыз!

Go тарихы

Біз оған платформа жасадық. Мен неге екенін түсіндіруге тырысамын.

Go қысқаша тарихы. Ол 2007 жылы басталды, 2009 жылы ашылды, бірінші нұсқасы 2012 жылы шықты (яғни біз бірінші шығарылымға дейін де жұмыс істей бастадық). Бастамашы Google болды, ол менің ойымша, Java-ны ауыстырғысы келді.

Авторлары өте танымал:

  • Unix-тің артында тұрған, UTF-8 ойлап тапқан Кен Томсон 9-жоспар жүйесінде жұмыс істеді;
  • Кенмен бірге UTF-8 ойлап тапқан Роб Пайк сонымен қатар Bell Labs-те 9-жоспар, Inferno, Limbo бойынша жұмыс істеді;
  • Роберт Гисмер, біз білетін және Java HotSpot компиляторын ойлап тапқаны үшін және V8 генераторындағы жұмысы үшін (Google-дың Javascript аудармашысы);
  • Біздің кейбір патчтарды қосқанда 700-ден астам қатысушы.

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Бару: бірінші қарау

Тілінің азды-көпті қарапайым, түсінікті екенін көреміз. Бізде айқын түрлері бар: кейбір жағдайларда оларды жариялау қажет, басқаларында олар қажет емес (бұл түрлердің қандай да бір жолмен шығарылатынын білдіреді).

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Құрылымдарды сипаттау сәнге айналғанын байқауға болады. Бізде көрсеткіш (жұлдызша қайда орналасқан) ұғымы бар екенін көруге болады. Массивтер мен ассоциативті массивтердің инициализациясын жариялау үшін арнайы қолдау бар екенін көруге болады.

Бұл анық - сіз өмір сүре аласыз. Сәлем, әлем деп жазуға тырысайық:

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Біз не көріп тұрмыз? Бұл C тәрізді синтаксис, нүктелі үтір міндетті емес. Ол екі жол үшін бөлгіш болуы мүмкін, бірақ бұл бір сызықта орналасқан екі конструкция болса ғана.

Басқару құрылымдарындағы жақшалар (14-жолда) міндетті емес екенін көреміз, бірақ бұйра жақшалар әрқашан қажет. Теру статикалық екенін көреміз. Тимді көбіне алып кетеді. Бұл мысал кәдімгі Сәлем, әлемге қарағанда біршама күрделірек - кітапхана бар екенін көрсету үшін ғана.

Тағы не маңызды екенін көріп отырмыз? Код пакеттерге бөлінген. Ал пакетті өзіңіздің кодыңызда пайдалану үшін оны импорттау директивасы арқылы импорттауыңыз керек - бұл да маңызды. Біз оны іске қосамыз - ол жұмыс істейді. Тамаша!

Енді күрделірек нәрсені қолданып көрейік: Сәлем, әлем, бірақ қазір ғана бұл http сервері. Мұнда не қызық көріп тұрмыз?

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Біріншіден, функция параметр ретінде әрекет етеді. Бұл біздің функциямыз «бірінші сыныпты азамат» екенін білдіреді және сіз онымен функционалды стильде көптеген қызықты нәрселерді жасай аласыз. Содан кейін біз күтпеген нәрсені көреміз: импорттау директивасы GitHub репозиторийіне тікелей сілтеме жасайды. Дұрыс, солай, оның үстіне солай істеу керек.

Go бағдарламасында пакеттің әмбебап идентификаторы оның репозиторийінің URL мекенжайы болып табылады. Арнайы Goget утилитасы бар, ол барлық тәуелділіктерді алып, жүктеп алып, орнатып, құрастырып, қажет болған жағдайда пайдалануға дайындайды. Сонымен бірге Гогет html-meta туралы біледі. Тиісінше, сіз өзіңіздің арнайы репозиторийіңізге сілтемелерді қамтитын http каталогын сақтай аласыз (мысалы, біз сияқты).

Тағы не көреміз? Стандартты кітапханада Http және Json. Әлбетте, интроспекция – рефлексия бар, оны кодтау/json кезінде қолдану керек, өйткені біз оның орнына қандай да бір ерікті нысанды қоямыз.

Біз оны іске қосамыз және машинаның ағымдағы орташа жүктемесін (ол іске қосылған машинада) құрастыратын, іске қосатын және есеп беретін 20 жолда пайдалы код бар екенін көреміз.
Мұнда біз бірден көре алатын тағы не маңызды? Ол бір статикалық екілік жүйеге (buinary) жинақталған. Бұл екілікте ешқандай тәуелділіктер, кітапханалар жоқ! Сіз оны кез келген жүйеге көшіре аласыз, оны дереу іске қосасыз және ол жұмыс істейді.

Жалғастыру.

Өтіңіз: Әдістер мен интерфейстер

Go әдістері бар. Кез келген теңшелетін түр үшін әдісті жариялай аласыз. Оның үстіне, бұл міндетті түрде құрылым емес, бірақ қандай да бір түрдегі бүркеншік ат болуы мүмкін. Сіз N32 үшін бүркеншік атын жариялай аласыз және оған пайдалы кез келген нәрсені істеу әдістерін жаза аласыз.

Міне, біз алғаш рет ессіздікке ұшырадық... Года ондай сабақтар жоқ екен. Go-ны білетіндер түрді қосу бар деп айтуы мүмкін, бірақ бұл мүлдем басқа нәрсе. Әзірлеуші ​​оны мұра ретінде қарастыруды неғұрлым тез тоқтатса, соғұрлым жақсы. Go бағдарламасында сыныптар жоқ, мұрагерлік те жоқ.

Сұрақ! Google бастаған авторлар компаниясы әлемнің күрделілігін көрсету үшін бізге не берді? Олар бізге интерфейстер берді!

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

Интерфейс - қарапайым әдістерді, әдіс қолтаңбаларын жазуға мүмкіндік беретін арнайы тип. Әрі қарай, осы әдістер бар (орындалатын) кез келген түр осы интерфейске сәйкес келеді. Бұл бір түрге, екіншісіне (ол интерфейс түріне сәйкес келетін) сәйкес функцияны жай ғана сипаттай алатыныңызды білдіреді. Содан кейін осы интерфейс түрінің айнымалы мәнін жариялаңыз және оған осы нысандардың кез келгенін тағайындаңыз.

Хардкор жанкүйерлері үшін бұл айнымалының шын мәнінде екі көрсеткіші болады деп айта аламын: біреуі деректерге, екіншісі - осы типтегі интерфейс үшін осы нақты типке тән дескрипторлардың арнайы кестесіне. Яғни, компилятор мұндай дескриптор кестелерін байланыстыру кезінде жасайды.

Және Go бағдарламасында, әрине, жарамсыз деп санайтын көрсеткіштер бар. Интерфейс сөзі {} (екі бұйра жақшамен) принцип бойынша кез келген нысанды көрсетуге мүмкіндік беретін айнымалы.
Әзірге бәрі жақсы, бәрі таныс. Таңқаларлық ештеңе жоқ.

Барыңыз: горутиндер

Енді бізді қызықтыратын нәрсеге келдік: жеңіл процестер – Go терминологиясындағы горутиндер (горутиндер).

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында даму жағдайы. 1 бөлім

  1. Біріншіден, олар шынымен жеңіл (2 КБ-тан аз).
  2. Екіншіден, мұндай горутинді құруға кететін шығындар шамалы: секундына олардың мыңын жасауға болады - ештеңе болмайды.
  3. Оларға жеке жоспарлаушы қызмет көрсетеді, ол басқаруды бір горутиннен екіншісіне ауыстырады.
  4. Бұл жағдайда бақылау келесі жағдайларда беріледі:
    • егер go өрнегі кездессе (горутин келесі горутинді бастаса);
    • блоктаушы кіріс/шығыс қоңырауы қосылған болса;
    • қоқыс жинау басталса;
    • арналармен кейбір операция іске қосылса.

Яғни, Go бағдарламасы компьютерде жұмыс істеген сайын, ол жүйедегі ядролардың санын анықтайды, қажетінше көптеген ағындарды іске қосады (жүйеде қанша ядро ​​бар немесе сіз оны қанша айттыңыз). Сәйкесінше, жоспарлаушы осы жеңіл орындау ағындарын әрбір ядродағы осы операциялық жүйенің барлық ағындарында іске қосады.

Айта кету керек, бұл темірді пайдаланудың ең тиімді жолы. Көрсетілгеннен басқа, біз көп нәрсені жасаймыз. Біз, мысалы, бір блокқа 40 гигабитке қызмет көрсетуге мүмкіндік беретін DPI жүйелерін жасаймыз (осы жолдарда не болатынына байланысты).

Онда Go бағдарламасына дейін біз дәл осы себепті дәл сол схеманы қолдандық: өйткені ол процессор кэшінің локализациясын сақтауға және ОЖ контекстік қосқыштарының санын айтарлықтай азайтуға мүмкіндік береді (бұл да көп уақытты алады). Қайталап айтамын: бұл темірді пайдаланудың ең тиімді жолы.

Бұл қарапайым 21 жолдық мысал эхо-серверді жай ғана орындайтын мысал. Қызмет көрсету функциясы өте қарапайым, ол сызықты екенін ескеріңіз. Кері қоңыраулар жоқ, алаңдап, ойланудың қажеті жоқ... Тек оқып, жазасыз!

Сонымен қатар, егер сіз оқысаңыз және жазсаңыз, ол іс жүзінде блокталуы керек - бұл горутин жай кезекке қойылады және орындау қайтадан мүмкін болған кезде жоспарлаушы қабылдайды. Яғни, бұл қарапайым код осы құрылғыдағы ОЖ мүмкіндік беретін көптеген қосылымдар үшін жаңғырық сервері ретінде әрекет ете алады.

Жақында жалғасын табады...

Кейбір жарнамалар 🙂

Бізбен бірге болғандарыңызға рахмет. Сізге біздің мақалалар ұнайды ма? Қызықты мазмұнды көргіңіз келе ме? Тапсырыс беру немесе достарыңызға ұсыну арқылы бізге қолдау көрсетіңіз, әзірлеушілерге арналған бұлтты VPS $4.99, Сіз үшін біз ойлап тапқан бастапқы деңгейдегі серверлердің бірегей аналогы: VPS (KVM) E5-2697 v3 (6 ядросы) 10 ГБ DDR4 480 ГБ SSD 1 Гбит/с 19 доллардан немесе серверді қалай бөлісуге болатыны туралы барлық шындық? (RAID1 және RAID10, 24 ядроға дейін және 40 ГБ DDR4 дейін қол жетімді).

Dell R730xd Амстердамдағы Equinix Tier IV деректер орталығында 2 есе арзан ба? Тек осында 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6 ГГц 14C 64 ГБ DDR4 4x960 ГБ SSD 1 Гбит/с 100 теледидар 199 доллардан бастап Нидерландыда! Dell R420 - 2x E5-2430 2.2 ГГц 6C 128 ГБ DDR3 2x960 ГБ SSD 1 Гбит/с 100 ТБ - 99 доллардан бастап! туралы оқыңыз Инфрақұрылымдық корпорацияны қалай құруға болады. бір тиынға 730 еуро тұратын Dell R5xd E2650-4 v9000 серверлерін қолданатын класс?

Ақпарат көзі: www.habr.com

пікір қалдыру