Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында иштеп чыгуу иши. 1-бөлүк

Алексей Найденов, башкы директор ITooLabs, Go (Голанг) программалоо тилинде байланыш операторлору үчүн телекоммуникациялык платформаны иштеп чыгуу жөнүндө сөз кылат. Алексей ошондой эле платформаны үн почтасы (VoiceMail) жана Virtual PBX (Cloud PBX) кызматтарын көрсөтүү үчүн колдонгон Азиянын ири байланыш операторлорунун биринде платформаны жайылтуу жана иштетүү тажрыйбасы менен бөлүшөт.

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында иштеп чыгуу иши. 1-бөлүк

Алексей Найденов (мындан ары - А.Н.): - Баарына салам! Менин атым Алексей Найденов. Мен ITooLabs директорумун. Биринчиден, мен бул жерде эмне кылып жүргөнүм жана бул жерге кантип келип калганыма жооп бергим келет.

Эгер Bitrix24 Marketplace ("Телефония" бөлүмү) карасаңыз, анда 14 тиркеме жана 36 тиркеме (40%) биз болуп саналат:

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында иштеп чыгуу иши. 1-бөлүк

Тагыраак айтканда, булар биздин өнөктөш операторлорубуз, бирок мунун баарынын артында биздин платформа (Платформа катары кызмат) турат – биз аларга кичине тыйынга сатабыз. Чындыгында, мен бул платформанын өнүгүшү жана Go'го кантип келгенибиз жөнүндө айткым келет.

Биздин платформа үчүн сандар азыр:

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында иштеп чыгуу иши. 1-бөлүк

44 өнөктөш операторлор, анын ичинде MegaFon. Жалпысынан алганда, биз укмуштуу окуяларга барууну жакшы көрөбүз жана биз Россиядагы 100 оператордун 44 миллион абонентине кире алабыз. Ошондуктан, кимдир бирөө кандайдыр бир бизнес-идеялары болсо, биз ар дайым аларды угууга кубанычтабыз.

  • 5000 колдонуучу компаниялар.
  • Жалпысынан 20 000 жазылуучу. Мунун баары b2b - биз компаниялар менен гана иштейбиз.
  • Күн ичинде мүнөтүнө 300 чалуу.
  • Өткөн жылы 100 миллион чалуу мүнөтү (биз майрамдаганбыз). Бул биздин платформада болуп жаткан ички сүйлөшүүлөрдү эске албаганда.

Ал кантип башталды?

Туура жигиттер кантип өздөрүнүн платформасын түзө башташат? Ошондой эле бизде "катуу ишкананын" өнүгүү тарыхы болгондугун эске алышыбыз керек, ал тургай ишкана үчүн жылдын эң так убагында! Кардарга келип: "Бизге дагы бир нече сервер керек" деп айтканыңыз ошол бактылуу учур эле. Ал эми кардар: «Ооба, суроо жок! Бизде ондук бар.

Ошентип, биз Oracle, Java, WebSphere, Db2 жана ошонун баарын жасадык. Ошондуктан, биз, албетте, мыкты сатуучу чечимдерди кабыл алып, аларды бириктирип, аны менен чечүүгө аракет кылышкан. Алар өз алдынча ойногон. Бул ички стартап болмок.

Мунун баары 2009-жылы башталган. 2006-жылдан бери биз тигил же бул жол менен оператордун чечимдерине жакындан катышып келебиз. Биз бир нече ыңгайлаштырылган виртуалдык АТСтерди жасадык (мисалы, бизде азыр буйрутма боюнча): биз карап көрдүк, бул жакшы деп чечтик жана ички стартапты козгоону чечтик.

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында иштеп чыгуу иши. 1-бөлүк

VMWare алыңыз. Биз өз алдынча басып жүргөндүктөн, биз дароо салкын сатуучу Storage таштоого туура келди. Биз алардын бардыгын билебиз: убадалар 3кө бөлүнүшү керек, ал эми чыгым 10го көбөйүшү керек. Ошондуктан, биз DirDB ж.б.у.с. кылдык.

Андан кийин ал өсө баштады. Буга эсеп-кысап кызматы кошулду, анткени платформа мындан ары туруштук бере албайт. Андан кийин MySQLден эсептешүү сервери Монгого көчтү. Натыйжада, биз ал жакка келген бардык чалууларды иштеткен жумушчу чечимге ээ болдук:

Алексей Найденов. 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 тарыхы

Биз ага аянтча жасадык. Мен себебин түшүндүрүүгө аракет кылам.

Go кыскача тарыхы. 2007-жылы башталып, 2009-жылы ачылган, биринчи версиясы 2012-жылы чыккан (башкача айтканда, биз биринчи релизге чейин эле иштей баштаганбыз). Демилгечи Google болгон, ал мен ойлойм, Java-ны алмаштыргысы келген.

Жазуучулар абдан белгилүү:

  • Unixтин артында турган Кен Томсон, UTF-8ди ойлоп тапкан, План 9 системасында иштеген;
  • Кен менен UTF-8ди иштеп чыккан Роб Пайк, ошондой эле Bell лабораториясында План 9, Inferno, Limbo боюнча иштеген;
  • Роберт Гизмер, биз билген жана Java HotSpot Compiler программасын ойлоп тапканы жана 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 сап пайдалуу код бар экенин көрөбүз, ал компиляциялоочу, иштеткен жана машинанын учурдагы орточо жүгүн (ал иштеп жаткан машинада) берет.
Бул жерде биз дароо көрө турган нерседен дагы эмне маанилүү? Ал бир статикалык бинардыкка (буинардык) түзүлөт. Бул бинардык эч кандай көз карандылыкты, китепканаларды жок! Аны каалаган системага көчүрсө болот, дароо иштетсе болот жана ал иштейт.

Биз улантабыз.

Go: методдор жана интерфейстер

Go ыкмалары бар. Сиз каалаган типтеги ыкманы жарыялай аласыз. Анын үстүнө, бул сөзсүз түрдө структура эмес, бирок кандайдыр бир түрдөгү лакап ат болушу мүмкүн. Сиз N32 үчүн лакап ат жарыялап, ал үчүн пайдалуу бир нерсе кылуу үчүн ыкмаларды жаза аласыз.

Мына ушул жерден биз биринчи жолу эси ооп калдык... Көрсө, Годо андай класстар жок экен. Go билгендер түрүн кошуу бар деп айтышы мүмкүн, бирок бул такыр башка. Иштеп чыгуучу аны мурас катары кароону канчалык эрте токтотсо, ошончолук жакшы. Goдо класстар жок, мурас да жок.

Суроо! Дүйнөнүн татаалдыгын көрсөтүү үчүн Google жетектеген авторлор компаниясы бизге эмне берди? Бизге интерфейстер берилди!

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында иштеп чыгуу иши. 1-бөлүк

Интерфейс – бул жөнөкөй ыкмаларды, метод кол тамгаларын жазууга мүмкүндүк берүүчү өзгөчө тип. Андан ары, бул ыкмалар бар (аткарылган) бардык түр бул интерфейске туура келет. Бул сиз жөн гана бир түргө, экинчиси үчүн (ошол интерфейс түрүнө туура келген) тиешелүү функцияны жаза аласыз дегенди билдирет. Андан кийин, бул интерфейстин түрүнүн өзгөрмөсүн жарыялаңыз жана ага бул объекттердин каалаганын дайындаңыз.

Хардкор күйөрмандары үчүн мен бул өзгөрмө чындыгында эки көрсөткүчтү камтыйт деп айта алам: бири маалыматтарга, экинчиси ушул типке мүнөздүү болгон атайын дескриптор таблицасына, ушул типтеги интерфейске. Башкача айтканда, компилятор дескрипторлордун мындай таблицаларын байланыштыруу учурунда түзөт.

Жана, албетте, Go'до жокко чыгаруу үчүн көрсөткүчтөр бар. Интерфейс сөзү {} (эки тармал кашаа менен) принцибинде кандайдыр бир объектти көрсөтүүгө мүмкүндүк берген өзгөрмө.
Азырынча баары өз ордунда, баары тааныш. Таң калыштуу эч нерсе жок.

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

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

Алексей Найденов. ITooLabs. Go (Голанг) телефон платформасында иштеп чыгуу иши. 1-бөлүк

  1. Биринчиден, алар чындап эле жеңил (2 Кбдан аз).
  2. Экинчиден, мындай горутинди жасоого кеткен чыгым анчалык деле жок: секундасына алардын миң даанасын түзө аласыз – эч нерсе болбойт.
  3. Аларды жөн гана башкарууну бир горутинден экинчисине өткөрүп берүүчү өздөрүнүн пландоочусу тейлейт.
  4. Бул учурда контролдоо төмөнкү учурларда өткөрүлүп берилет:
    • go оператору кездешсе (эгерде горутин кийинки горутинди баштаса);
    • бөгөттөөчү Киргизүү/Чыгуу чалуу иштетилген болсо;
    • таштанды чогултуу ишке кирсе;
    • каналдар менен кандайдыр бир операция башталса.

Башкача айтканда, компьютерде Go программасы иштетилген сайын, ал системадагы өзөктөрдүн санын аныктайт, керек болсо, ошончо жипти баштайт (системада канча ядро ​​бар же сиз ага канча айттыңыз). Демек, пландоочу бул жеңил салмактагы аткаруу жиптерин ар бир өзөктөгү ушул операциялык тутум жиптеринин бардыгында иштетет.

Бул темирди колдонуунун эң натыйжалуу жолу экенин белгилей кетүү керек. Биз көрсөткөн нерселерден тышкары, биз дагы көп нерселерди жасайбыз. Биз, мисалы, бир бирдикте 40 гигабитти тейлөөгө мүмкүндүк берген DPI системаларын жасайбыз (бул саптарда эмне болуп жатканына жараша).

Ал жерде, Go программасына чейин, биз дал ушул себептен улам дал ушундай схеманы колдондук: анткени ал процессордун кэшинин локализациясын сактоого, OS контексттик которгучтарынын санын олуттуу кыскартууга мүмкүндүк берет (бул да абдан көп убакытты талап кылат). Дагы бир жолу айтам: бул темирди колдонуунун эң эффективдүү жолу.

Бул жөнөкөй 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.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ 199 доллардан баштап Нидерландыда! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 доллардан! Жөнүндө окуу Инфраструктураны кантип куруу керек. бир тыйынга 730 евро турган Dell R5xd E2650-4 v9000 серверлерин колдонуу менен класс?

Source: www.habr.com

Комментарий кошуу