Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Алексеј Најденов, извршен директор ITooLabs, зборува за развој на телекомуникациска платформа за телекомуникациски оператори на програмскиот јазик Go (Голанг). Алексеј, исто така, го споделува своето искуство за распоредување и управување со платформата во еден од најголемите азиски телекомуникациски оператори, кој ја користел платформата за да обезбеди услуги за говорна пошта (Главна пошта) и виртуелна PBX (Cloud PBX).

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Алексеј Најденов (во натамошниот текст - А.Н.): - Здраво на сите! Јас се викам Алексеј Најденов. Јас сум директор на ITooLabs. Најпрвин би сакал да одговорам што правам овде и како завршив овде.

Ако го погледнете пазарот Bitrix24 (дел „Телефонија“), тогаш 14 апликации и 36 што се таму (40%) сме ние:

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Поточно, тоа се нашите партнерски оператори, но зад сето ова стои нашата платформа (Платформа како сервис) - тоа што им го продаваме за мал денар. Всушност, би сакал да зборувам за развојот на оваа платформа и како дојдовме до Go.

Броевите за нашата платформа сега се:

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

44 партнерски оператори, вклучувајќи го и МегаФон. Општо земено, ние сме многу љубители да се впуштаме во разни авантури и имаме вистински пристап до 100 милиони претплатници на 44 оператори овде во Русија. Затоа, ако некој има некои бизнис идеи, ние секогаш со задоволство ги слушаме.

  • 5000 компании корисници.
  • Вкупно 20 претплатници. Сè е b000b - работиме само со компании.
  • 300 повици во минута во текот на денот.
  • Минатата година 100 милиони минути за разговор (прославивме). Тоа е без да се земат предвид внатрешните преговори кои се на нашата платформа.

Како започна?

Како вистинските фраери почнуваат да прават своја платформа? Мора да земеме предвид и дека имавме историја на развој на „хардкор претпријатие“, па дури и во најпрецизниот период од годината за претпријатие! Беше тоа среќно време кога доаѓате кај клиентот и му велите: „Ни требаат уште неколку сервери“. И клиентот: „Да, нема прашање! Имаме десетка во решетката.

Така направивме Oracle, Java, WebSphere, Db2 и сето тоа. Затоа, ги зедовме, се разбира, најдобрите решенија за продавачи, ги интегриравме и се обидовме да ги преземеме со него. Тие играа сами. Тоа би бил таков внатрешен стартап.

Сè започна во 2009 година. Од 2006 година, ние сме тесно вклучени во одлуките на операторот, на овој или оној начин. Направивме неколку сопствени виртуелни PBX (како она што сега го имаме по нарачка): погледнавме, решивме дека е добро и решивме да поттикнеме внатрешен стартап.

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Земете VMWare. Бидејќи одевме сами, моравме веднаш да го напуштиме кул продавачот Storage. Знаеме сè за нив: дека ветувањата треба да се поделат со 3, а трошокот да се помножи со 10. Затоа, направивме DirDB и така натаму.

Потоа почна да расте. На ова беше додадена услугата за наплата, бидејќи платформата повеќе не можеше да се справи. Потоа серверот за наплата од MySQL се пресели во Mongo. Како резултат на тоа, добивме работно решение кое ги обработува сите повици што одат таму:

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Но, таму некаде, внатре, се врти истиот продавач - главниот, нуклеарен, што некогаш го земавме. Приближно до крајот на 2011 година, самите сфативме дека главното тесно грло за нас, се разбира, ќе биде токму овој производ - ќе налетаме на него. Видовме ѕид пред нас, во кој трчавме со полн галоп, додека клиентите одеа, беа додадени.
Според тоа, моравме да направиме нешто. Се разбира, направивме доста истражувања за различни производи - и со отворен код и со оние од продавачите. Сега нема да се задржувам на ова - тоа не е поентата. Последната резерва за која размислувавме беше да направиме сопствена платформа.

На крајот, дојдовме до оваа опција. Зошто? Бидејќи сите производи на продавачот и софтверот со отворен код беа направени за да ги решат проблемите пред 10 години. Па, ако 10-годишно дете, и уште некои! Изборот стана очигледен за нас: или ќе се збогуваме со нашата одлична идеја за идеална услуга (за партнери, оператори и нас самите), или ќе направиме нешто свое.

Решивме да направиме нешто поинаку!

Барања на платформата

Ако правите нешто долго време (искористувате туѓ производ), тогаш во вашата глава полека се формира мислата: како би го направил тоа сам? Бидејќи сите сме програмери во компанијата (освен продавачите, нема непрограмери), нашите барања се формирани долго време, и тие беа јасни:

  1. Висока брзина на развој. Производот на продавачот, кој не измачуваше, не ни одговараше на прво место бидејќи сè функционираше долго и полека. Сакавме брзо - имавме многу идеи! Имаме уште многу идеи, но тогаш листата на идеи беше таква што изгледаше како десет години пред нас. Сега само една година.
  2. Максимално искористување на повеќежилно железо. Ова беше исто така важно за нас, бидејќи видовме дека ќе има само се повеќе и повеќе јадра.
  3. Висока сигурност. Оној што и ние плачевме.
  4. Висока толеранција на грешки.
  5. Сакавме да завршиме со дневен процес на ослободување. За да го направиме ова, ни требаше избор на јазик.

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Според тоа, од барањата за производот што самите си ги претставивме, барањата за јазикот растат на јасно логичен начин.

  1. Ако сакаме поддршка за повеќејадрени системи, тогаш ни треба поддршка за паралелно извршување.
  2. Ако ни треба брзина на развој, потребен ни е јазик кој поддржува конкурентен развој, конкурентно програмирање. Ако некој не ја сретнал разликата, тогаш тоа е многу едноставно:
    • паралелното програмирање е за тоа како две различни нишки работат на различни јадра;
    • истовременото извршување, поконкретно поддршката за истовремено, е за тоа како јазикот (или времето на работа, што било) помага да се скрие сета сложеност што доаѓа од паралелното извршување.
  3. Висока стабилност. Очигледно, ни требаше кластер и беше подобар од она што го имавме на производот од продавачот.

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Немавме навистина многу опции, ако се сеќавате. Прво, Ерланг - го сакаме и го знаеме, ми беше личен, личен фаворит. Второ, Јава не е ни Јава, туку конкретно Скала. Трето, јазикот кој во тоа време воопшто не го знаевме - Го. Штотуку се појави тогаш, поточно, веќе постоеше околу две години, но сè уште не беше пуштен во продажба.

Поразен Го!

Историја на Го

Направивме платформа на неа. Ќе се обидам да објаснам зошто.

Кратка историја на Go. Започна во 2007 година, отворена во 2009 година, првата верзија беше објавена во 2012 година (односно, почнавме да работиме уште пред првото издание). Иницијатор беше Google, кој сакаше да го замени, како што се сомневам, Java.

Авторите се многу познати:

  • Кен Томсон, кој стоеше зад Unix, го измисли UTF-8, работеше на системот План 9;
  • Роб Пајк, кој дизајнираше UTF-8 со Кен, исто така работеше на План 9, Пекол, Лимбо во Bell Labs;
  • Роберт Гизмер, кого го познаваме и го сакаме за измислување на Java HotSpot компајлерот и за работа на генератор во V8 (преведувач на Javascript на Google);
  • И преку 700 соработници, вклучително и некои од нашите закрпи.

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Одете на прв поглед

Гледаме дека јазикот е повеќе или помалку едноставен и разбирлив. Имаме очигледни типови: во некои случаи тие треба да се декларираат, во други не (што значи дека типовите сепак се заклучуваат).

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Се гледа дека е модерно да се опишуваат структури. Се гледа дека го имаме концептот на покажувач (каде што е ѕвездичката). Може да се види дека постои посебна поддршка за декларирање на иницијализација на низи и асоцијативни низи.

Приближно разбирливо - можете да живеете. Се обидувам да напишам Здраво, свето:

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Што гледаме? Ова е синтакса слична на C, точка-запирка е изборна. Може да биде раздвојувач за две линии, но само ако тоа се два конструкции кои се точно на иста линија.

Гледаме дека заградите во контролните структури (на 14-та линија) се опционални, но секогаш се потребни кадрави. Гледаме дека пишувањето е статично. Времето во повеќето случаи се прикажува. Овој пример е малку покомплициран од вообичаениот Здраво, свето - само за да се покаже дека има библиотека.

Што друго гледаме важно? Кодот е организиран во пакети. И за да го користите пакетот во сопствен код, треба да го увезете користејќи ја директивата за увоз - ова е исто така важно. Почнуваме - работи. Одлично!

Ајде да пробаме нешто покомплицирано: Здраво, свет, но сега тоа е http сервер. Што гледаме интересно овде?

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Прво, функцијата делува како параметар. Тоа значи дека функцијата што ја имаме е „граѓанин од прва класа“ и со неа можете да направите многу интересни работи во функционален стил. Го гледаме следното неочекувано: директивата за увоз се однесува директно на складиштето GitHub. Така е, така е - згора на тоа, така треба да се прави.

Во Go, универзалниот идентификатор на пакетот е URL-то на неговото складиште. Постои специјална алатка Goget која работи за сите зависности, ги презема, ги инсталира, ги компајлира и ги подготвува за употреба доколку е потребно. Во исто време, Гогет знае за html-мета. Според тоа, можете да чувате http директориум, кој ќе содржи врски до вашето специфично складиште (како што правиме ние, на пример).

Што друго гледаме? Http и Json во редовната библиотека. Очигледно постои интроспекција - рефлексија, што треба да се користи при кодирање / json, бидејќи едноставно заменуваме некој произволен објект за него.

Ја извршуваме и гледаме дека имаме 20 линии корисен код кој се компајлира, работи и го дава моменталното просечно оптоварување на машината (на машината на која работи).
Што друго е важно од она што веднаш можеме да го видиме овде? Се компајлира во еден статичен бинарен (буинарен). Овој бинар воопшто нема зависност, нема библиотеки! Може да се копира на кој било систем, да се изврши веднаш и ќе работи.

Продолжува.

Go: методи и интерфејси

Go има методи. Може да декларирате метод за кој било приспособен тип. Покрај тоа, ова не е нужно структура, туку може да биде алијас од некој тип. Можете да декларирате алијас за N32 и да напишете методи за да направи нешто корисно.

И тука за прв пат паѓаме во ступор... Излегува дека Go нема часови како такви. Оние кои го знаат Go може да кажат дека има инклузија на тип, но ова е сосема поинаку. Колку побрзо инвеститорот престане да го смета за наследство, толку подобро. Во Го нема часови, а нема ни наследство.

Прашање! Што ни даде компанијата на автори предводена од Google за да ја прикаже сложеноста на светот? Ни беа дадени интерфејси!

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

Интерфејсот е посебен тип кој ви овозможува да пишувате едноставни методи, потписи на методи. Понатаму, секој тип за кој постојат овие методи (се извршуваат) ќе одговара на овој интерфејс. Ова значи дека можете едноставно да ја напишете соодветната функција за еден тип, за друг (што одговара на тој тип на интерфејс). Следно, прогласете променлива од типот на овој интерфејс и доделете некој од овие објекти на него.

За љубителите на хардкор, можам да кажам дека оваа променлива всушност ќе содржи два покажувачи: еден до податоци, другиот до специјална табела со дескриптори што е специфична за овој конкретен тип, за интерфејсот од овој тип. Односно, компајлерот прави такви табели на дескриптори во моментот на поврзување.

И има, се разбира, покажувачи за поништување во Go. Зборот интерфејс {} (со две кадрави загради) е променлива која во принцип ви овозможува да укажете на кој било објект.
Засега се е во ред, се е познато. Ништо изненадувачки.

Одете: горутини

Сега доаѓаме до она што нè интересира: лесни процеси - горутини (горутини) во терминологијата Go.

Алексеј Најденов. ITooLabs. Развојна футрола на телефонската платформа Go (Golang). Дел 1

  1. Прво, тие се навистина лесни (помалку од 2 Kb).
  2. Второ, трошоците за создавање таква горутина се занемарливи: можете да создадете илјада од нив во секунда - ништо нема да се случи.
  3. Нив ги опслужува нивниот сопствен распоредувач, кој едноставно ја пренесува контролата од една на друга горутина.
  4. Во овој случај, контролата се пренесува во следниве случаи:
    • ако се сретне изјава за оди (ако горутинот го започнува следниот горутин);
    • ако е овозможен блокирачки влез/излезен повик;
    • ако се активира собирање ѓубре;
    • ако се започне некоја операција со канали.

Односно, секогаш кога програма Go се извршува на компјутер, таа го открива бројот на јадра во системот, започнува онолку нишки колку што е потребно (колку јадра има во системот или колку сте му кажале). Според тоа, распоредувачот ќе ги изврши овие лесни нишки на извршување на сите овие нишки на оперативниот систем во секое јадро.

Треба да се напомене дека ова е најефикасниот начин за искористување на железото. Покрај тоа што го покажавме, правиме и многу повеќе. Ние правиме, на пример, DPI системи кои овозможуваат опслужување на 40 гигабити во една единица (во зависност од тоа што се случува во овие линии).

Таму, дури и пред Go, ја користевме токму истата шема поради оваа причина: бидејќи ви овозможува да ја зачувате локацијата на кешот на процесорот, значително да го намалите бројот на прекинувачи за контекст на ОС (што исто така трае многу долго). Повторувам: ова е најефективниот начин за искористување на железото.

Овој едноставен пример од 21 линија е пример кој едноставно прави ехо-сервер. Во исто време, забележете дека функцијата за сервирање е исклучително едноставна, таа е линеарна. Нема повратни повици, нема потреба да се замарате и размислувате... Вие само читате и пишувате!

Во исто време, ако читате и пишувате, тоа всушност треба да блокира - оваа горутина едноставно се става во ред и ја зема распоредувачот кога извршувањето ќе стане возможно повторно. Односно, овој едноставен код може да дејствува како сервер за ехо за онолку врски колку што ќе дозволи ОС на оваа машина.

Продолжува наскоро...

Некои реклами 🙂

Ви благодариме што останавте со нас. Дали ви се допаѓаат нашите написи? Сакате да видите поинтересна содржина? Поддржете не со нарачка или препорака на пријатели, облак VPS за програмери од 4.99 долари, уникатен аналог на сервери на почетно ниво, кој беше измислен од нас за вас: Целата вистина за VPS (KVM) E5-2697 v3 (6 јадра) 10GB DDR4 480GB SSD 1Gbps од 19 долари или како да споделите сервер? (достапен со RAID1 и RAID10, до 24 јадра и до 40 GB DDR4).

Dell R730xd 2 пати поевтин во центарот за податоци Equinix Tier IV во Амстердам? Само овде 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 телевизор од 199 долари во Холандија! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - од 99 долари! Прочитајте за Како да се изгради инфраструктурна корп. класа со употреба на сервери Dell R730xd E5-2650 v4 вредни 9000 евра за денар?

Извор: www.habr.com

Додадете коментар