Aleksey Naidenov, bosh direktor
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:
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:
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.
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:
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:
- 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.
- Ko'p yadroli temirdan maksimal darajada foydalanish. Bu biz uchun ham muhim edi, chunki biz faqat ko'proq yadrolar bo'lishini ko'rdik.
- Yuqori ishonchlilik. Biz ham yig'laganimiz.
- Yuqori xatoga chidamlilik.
- Biz kunlik reliz jarayonini yakunlamoqchi edik. Buning uchun bizga til tanlash kerak edi.
Shunga ko'ra, biz o'zimiz uchun taqdim etgan mahsulotga qo'yiladigan talablardan tilga qo'yiladigan talablar aniq mantiqiy tarzda o'sib boradi.
- Agar biz ko'p yadroli tizimlarni qo'llab-quvvatlamoqchi bo'lsak, unda parallel bajarish uchun yordam kerak.
- 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.
- Yuqori barqarorlik. Shubhasiz, bizga klaster kerak edi va u bizda sotuvchi mahsulotdagidan yaxshiroq edi.
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.
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).
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:
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?
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!
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).
- Birinchidan, ular haqiqatan ham engil (2 Kb dan kam).
- Ikkinchidan, bunday gorutinni yaratishning narxi ahamiyatsiz: siz soniyada mingtasini yaratishingiz mumkin - hech narsa bo'lmaydi.
- Ularga o'zlarining rejalashtiruvchisi xizmat ko'rsatadi, bu shunchaki boshqaruvni bir gorutindan boshqasiga o'tkazadi.
- 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,
Amsterdamdagi Equinix Tier IV ma'lumotlar markazida Dell R730xd 2 baravar arzonmi? Faqat shu yerda
Manba: www.habr.com