Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Alexey Naydenov, Mkurugenzi Mtendaji IToolLabs, inazungumza kuhusu maendeleo ya jukwaa la mawasiliano ya simu kwa waendeshaji wa mawasiliano ya simu katika lugha ya programu ya Go (Golang). Alexey pia anashiriki uzoefu wake katika kupeleka na kuendesha jukwaa katika mojawapo ya waendeshaji wakubwa wa mawasiliano ya simu ya Asia, ambayo ilitumia jukwaa kutoa huduma za barua ya sauti (VoiceMail) na Virtual PBX (Cloud PBX).

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Alexey Naydenov (baadaye - AN): - Salaam wote! Jina langu ni Alexey Naydenov. Mimi ni mkurugenzi wa ITooLabs. Kwanza kabisa, ningependa kujibu ninachofanya hapa na jinsi nilivyoishia hapa.

Ukiangalia Soko la Bitrix24 (sehemu ya β€œSimu”), basi maombi 14 na 36 yaliyopo (40%) ni sisi:

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Kwa usahihi zaidi, hawa ni washirika wetu wa waendeshaji, lakini nyuma ya haya yote ni jukwaa letu (Jukwaa kama Huduma) - tunachowauzia kwa senti ndogo. Kwa kweli, ningependa kuzungumza juu ya maendeleo ya jukwaa hili na jinsi tulivyokuja Go.

Nambari za jukwaa letu sasa:

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Washirika 44 wa waendeshaji, pamoja na Megafon. Kwa ujumla, tunapenda sana kuendelea na matukio tofauti, na tuna ufikiaji halisi wa watumiaji milioni 100 wa waendeshaji 44 hapa nchini Urusi. Kwa hivyo, ikiwa mtu yeyote ana maoni yoyote ya biashara, tutafurahiya kuwasikiliza kila wakati.

  • Kampuni 5000 za watumiaji.
  • Jumla ya waliojisajili 20. Hii yote ni b000b - tunafanya kazi na makampuni pekee.
  • Simu 300 kwa dakika wakati wa mchana.
  • Dakika za kupiga simu milioni 100 mwaka jana (tulisherehekea). Hii haizingatii mazungumzo ya ndani ambayo yanapatikana kwenye jukwaa letu.

Ilianzaje?

Je! watu wazuri wanaanzaje kutengeneza jukwaa lao? Ni lazima pia kuzingatia kwamba tuna historia ya maendeleo ya "biashara ngumu", na hata wakati sahihi zaidi wa mwaka kwa biashara! Ilikuwa wakati huo wa furaha unapokuja kwa mteja na kusema: "Tunahitaji seva kadhaa zaidi." Na mteja: "Hakuna swali! Tuna kumi kwenye rack."

Kwa hivyo tulifanya Oracle, Java, WebSphere, Db2 na vitu hivyo vyote. Kwa hiyo, tulichukua, bila shaka, ufumbuzi bora wa muuzaji, tukawaunganisha na tukajaribu kuondoka nayo. Tulitembea wenyewe. Hii itakuwa ni mwanzo wa ndani.

Haya yote yalianza mnamo 2009. Tangu 2006, tumehusika kwa karibu katika suluhisho za waendeshaji, kwa njia moja au nyingine. Tulitengeneza PBX kadhaa maalum (kama ile tuliyoagiza sasa): tuliiangalia, tukaamua kuwa ni nzuri, na tukaamua kuanzisha uanzishaji wa ndani.

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Tulichukua VMWare. Kwa kuwa tulikuwa peke yetu, tulilazimika kuachana mara moja na Hifadhi ya muuzaji baridi. Tunajua kila kitu kuhusu wao: ahadi hizo zinapaswa kugawanywa na 3, na gharama lazima iongezwe na 10. Ndiyo sababu walifanya DirDB na kadhalika.

Kisha ilianza kukua. Huduma ya utozaji iliongezwa kwa hili kwa sababu mfumo haukuweza kustahimili tena. Kisha seva ya malipo kutoka MySQL ilihamia Mongo. Kama matokeo, tulipata suluhisho la kufanya kazi ambalo huchakata simu zote zinazoenda huko:

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Lakini mahali fulani ndani, bidhaa hiyo hiyo ya muuzaji inazunguka - kuu, moja ya nyuklia, ambayo tuliwahi kuchukua. Karibu na mwisho wa 2011, tuligundua kuwa kizuizi kikuu kwetu, bila shaka, itakuwa bidhaa hii - tungeikimbia. Tuliona ukuta mbele yetu, ambao tulikimbia kwa kasi kubwa, huku wateja wengi wakiendelea kuja.
Kwa hiyo, tulihitaji kufanya jambo fulani. Kwa kweli, tulifanya utafiti mwingi juu ya bidhaa anuwai - chanzo wazi na wauzaji. Sitakaa juu ya hili sasa - sio kile tunachozungumza. Chaguo la mwisho kabisa tulilofikiria lilikuwa kutengeneza jukwaa letu wenyewe.

Hatimaye, tulikuja kwa chaguo hili. Kwa nini? Kwa sababu bidhaa zote za muuzaji na chanzo wazi zilitengenezwa kutatua shida ambazo zilikuwa na umri wa miaka 10. Kweli, ikiwa ni umri wa miaka 10, na wengine zaidi! Chaguo likawa dhahiri kwetu: ama tunasema kwaheri wazo letu kubwa la huduma bora (kwa washirika, waendeshaji na sisi wenyewe), au tunafanya kitu chetu wenyewe.

Tuliamua kufanya kitu chetu wenyewe!

Mahitaji ya jukwaa

Ikiwa umekuwa ukifanya kitu kwa muda mrefu (kwa kutumia bidhaa ya mtu mwingine), basi mawazo yanaunda polepole katika kichwa chako: ningefanyaje hili mwenyewe? Kwa kuwa sisi sote ni watengenezaji programu katika kampuni (isipokuwa kwa wauzaji, hakuna wasio waandaaji programu), mahitaji yetu yalitengenezwa muda mrefu uliopita, na yalikuwa wazi:

  1. Kasi ya juu ya maendeleo. Bidhaa ya muuzaji ambayo ilitutesa haikuwa ya kuridhisha, kwanza kabisa, kwa sababu kila kitu kiligeuka kwa muda mrefu na polepole. Tulitaka haraka - tulikuwa na mawazo mengi! Bado tuna maoni mengi, lakini basi orodha ya maoni ilikuwa hivi kwamba ilionekana kama miaka kumi mapema. Sasa kwa mwaka mmoja tu.
  2. Upeo wa matumizi ya chuma-msingi. Hii pia ilikuwa muhimu kwetu, kwani tuliona kuwa kutakuwa na cores zaidi na zaidi.
  3. Kuegemea juu. Kitu ambacho pia tulilia nacho.
  4. Upinzani wa juu kwa kushindwa.
  5. Tulitaka kuishia na mchakato wa matoleo ya kila siku. Kwa hili tulihitaji chaguo la lugha.

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Ipasavyo, kutokana na mahitaji ya bidhaa ambayo tumejiwekea, mahitaji ya lugha hukua kwa njia ya kimantiki.

  1. Ikiwa tunataka usaidizi kwa mifumo ya msingi nyingi, basi tunahitaji usaidizi kwa utekelezaji sambamba.
  2. Iwapo tunahitaji kasi ya maendeleo, tunahitaji lugha inayounga mkono maendeleo ya ushindani, programu shindani. Ikiwa mtu yeyote hajakutana na tofauti, ni rahisi sana:
    • Upangaji wa programu sambamba ni juu ya jinsi nyuzi mbili tofauti zinatekelezwa kwenye cores tofauti;
    • Utekelezaji wa wakati mmoja, au kwa usahihi zaidi, usaidizi wa upatanishi, ni kuhusu jinsi lugha (au wakati wa kukimbia, haijalishi) husaidia kuficha utata wote unaotokana na utekelezaji sambamba.
  3. Utulivu wa juu. Ni wazi, tulihitaji kundi, na bora kuliko tulivyokuwa kwenye bidhaa ya muuzaji.

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Kwa kweli hatukuwa na chaguo nyingi kama unakumbuka. Kwanza, Erlang - tunaipenda na tunaijua, ilikuwa ni kipenzi changu cha kibinafsi. Pili, Java sio hata Java, lakini haswa Scala. Tatu, lugha ambayo wakati huo hatukuijua kabisa - Nenda. Ilikuwa imeonekana tu wakati huo, au tuseme, ilikuwa tayari imekuwepo kwa karibu miaka miwili, lakini ilikuwa bado haijatolewa.

Nenda kashinda!

Historia ya Go

Tulitengeneza jukwaa juu yake. Nitajaribu kueleza kwa nini.

Historia fupi ya Go. Ilianza mwaka wa 2007, ilifunguliwa mwaka wa 2009, toleo la kwanza lilitolewa mwaka wa 2012 (yaani, tulianza kufanya kazi hata kabla ya kutolewa kwa kwanza). Mwanzilishi alikuwa Google, ambayo ilitaka kuchukua nafasi, kama ninavyoshuku, Java.

Waandishi ni maarufu sana:

  • Ken Thomson, ambaye alikuwa nyuma ya Unix, aligundua UTF-8, alifanya kazi kwenye mfumo wa Mpango wa 9;
  • Rob Pike, ambaye aligundua UTF-8 na Ken, pia alifanya kazi kwenye Mpango wa 9, Inferno, Limbo katika Bell Labs;
  • Robert Giesmer, ambaye tunamjua na kumpenda kwa kuvumbua Kikusanyaji cha Java HotSpot na kwa kazi yake ya jenereta katika V8 (mkalimani wa Javascript wa Google);
  • Na zaidi ya wachangiaji 700, ikijumuisha baadhi ya viraka vyetu.

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Nenda: angalia kwanza

Tunaona kwamba lugha ni zaidi au chini rahisi na kueleweka. Tuna aina za wazi: katika baadhi ya matukio wanahitaji kutangazwa, kwa wengine sio lazima (hii ina maana kwamba aina zinaingizwa kwa njia moja au nyingine).

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Inaweza kuonekana kuwa ni mtindo kuelezea miundo. Inaweza kuonekana kuwa tunayo dhana ya pointer (ambapo nyota iko). Inaweza kuonekana kuwa kuna usaidizi maalum wa kutangaza uanzishaji wa safu na safu shirikishi.

Ni karibu wazi - unaweza kuishi. Wacha tujaribu kuandika Hello, ulimwengu:

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Tunaona nini? Hii ni sintaksia inayofanana na C, nusu-koloni ni ya hiari. Inaweza kuwa kitenganishi cha mistari miwili, lakini tu ikiwa hizi ni miundo miwili iliyo kwenye mstari mmoja.

Tunaona kwamba mabano katika miundo ya udhibiti (katika mstari wa 14) ni ya hiari, lakini braces curly daima inahitajika. Tunaona kwamba kuandika ni tuli. Tim hutolewa nje mara nyingi. Mfano huu ni mgumu zaidi kuliko ule wa kawaida Hujambo, ulimwengu - ili tu kuonyesha kuwa kuna maktaba.

Ni nini kingine tunachoona ambacho ni muhimu? Nambari imepangwa katika vifurushi. Na ili kutumia kifurushi katika msimbo wako mwenyewe, unahitaji kuagiza kwa kutumia maagizo ya kuagiza - hii pia ni muhimu. Tunazindua - inafanya kazi. Kubwa!

Hebu tujaribu kitu ngumu zaidi ijayo: Hello, dunia, lakini sasa tu ni seva ya http. Je, tunaona nini cha kuvutia hapa?

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Kwanza, chaguo la kukokotoa hufanya kama kigezo. Hii ina maana kwamba kazi yetu ni "raia wa daraja la kwanza" na unaweza kufanya mambo mengi ya kuvutia nayo kwa mtindo wa kazi. Ifuatayo tunaona jambo lisilotarajiwa: maagizo ya kuagiza yanaunganisha moja kwa moja kwenye hazina ya GitHub. Hiyo ni kweli, ndivyo ilivyo - zaidi ya hayo, ndivyo inavyopaswa kufanywa.

Katika Go, kitambulisho cha jumla cha kifurushi ni url ya hazina yake. Kuna matumizi maalum ya Goget ambayo itachukua tegemezi zote, kupakua, kusakinisha, kukusanya na kutayarisha kwa matumizi ikiwa ni lazima. Wakati huo huo, Goget anajua kuhusu html-meta. Ipasavyo, unaweza kuweka saraka ya http ambayo itakuwa na viungo kwa hazina yako maalum (kama tunavyofanya, kwa mfano).

Nini kingine tunaona? Http na Json kwenye maktaba ya kawaida. Kuna, ni wazi, ukaguzi - tafakari, ambayo inapaswa kutumika katika usimbuaji/json, kwa sababu tunabadilisha tu kitu fulani cha kiholela.

Tunaendesha na kuona kwamba tunayo msimbo muhimu katika mistari 20, ambayo inakusanya, inaendesha na kuripoti mzigo wa sasa wa wastani wa mashine (kwenye mashine ambayo imezinduliwa).
Ni nini kingine muhimu ambacho tunaweza kuona mara moja hapa? Imejumuishwa katika binary moja tuli (buinary). binary hii haina tegemezi hata kidogo, hakuna maktaba! Unaweza kuinakili kwa mfumo wowote, kuiendesha mara moja, na itafanya kazi.

Hebu tuendelee.

Nenda: Mbinu na Maingiliano

Go ina mbinu. Unaweza kutangaza mbinu kwa aina yoyote maalum. Kwa kuongezea, hii sio lazima muundo, lakini labda jina la aina fulani. Unaweza kutangaza lakabu ya N32 na uandike njia za kufanya chochote muhimu.

Na hapa tunaanguka kwa usingizi kwa mara ya kwanza ... Inageuka kuwa Go haina madarasa kama hayo. Wale wanaojua Go wanaweza kusema kwamba kuna aina ya ujumuishaji, lakini hiyo ni kitu kingine kabisa. Kadiri msanidi programu atakavyoacha kuifikiria kama urithi, ndivyo inavyokuwa bora zaidi. Hakuna madarasa katika Go, na hakuna urithi pia.

Swali! Je, kampuni ya waandishi inayoongozwa na Google imetupa nini ili kuakisi ugumu wa ulimwengu? Walitupa miingiliano!

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

Interface ni aina maalum ambayo hukuruhusu kuandika njia rahisi, saini za njia. Zaidi ya hayo, aina yoyote ambayo njia hizi zipo (zinatekelezwa) zitalingana na kiolesura hiki. Hii inamaanisha kuwa unaweza kuelezea tu kazi inayolingana kwa aina moja, kwa nyingine (ambayo inalingana na aina hiyo ya kiolesura). Ifuatayo, tangaza kigezo cha aina ya kiolesura hiki na ukabidhi kitu chochote kati ya hivi.

Kwa mashabiki wa hardcore, naweza kusema kwamba tofauti hii itakuwa na viashiria viwili: moja kwa data, nyingine kwa meza maalum ya maelezo, ambayo ni ya kawaida kwa aina hii, kwa interface ya aina hii. Hiyo ni, mkusanyaji huunda meza za maelezo wakati wa kuunganisha.

Na katika Go, bila shaka, kuna kuyatumia kwa utupu. Neno kiolesura {} (yenye braces mbili zilizopinda) ni kigezo ambacho hukuruhusu kuelekeza kitu chochote kimsingi.
Hadi sasa kila kitu ni sawa, kila kitu kinajulikana. Hakuna cha kushangaza.

Nenda: goroutines

Sasa tunakuja kwa kile kinachotuvutia: michakato nyepesi - goroutines (goroutines) katika istilahi ya Go.

Alexey Naydenov. IToolLabs. Kesi ya maendeleo kwenye jukwaa la simu la Go (Golang). Sehemu 1

  1. Kwanza, ni nyepesi sana (chini ya 2 KB).
  2. Pili, gharama za kuunda goroutine kama hiyo hazizingatiwi: unaweza kuunda elfu moja kwa sekunde - hakuna kitakachotokea.
  3. Wanahudumiwa na mpangilio wao wenyewe, ambao huhamisha udhibiti kutoka kwa goroutine moja hadi nyingine.
  4. Katika kesi hii, udhibiti huhamishwa katika kesi zifuatazo:
    • ikiwa usemi wa kwenda unakabiliwa (ikiwa goroutine inaanza goroutine inayofuata);
    • ikiwa simu ya kuzuia Kuingiza/Kutoka imewezeshwa;
    • ikiwa ukusanyaji wa takataka huanza;
    • ikiwa operesheni fulani na chaneli imezinduliwa.

Hiyo ni, wakati wowote programu ya Go inaendeshwa kwenye kompyuta, huamua idadi ya cores kwenye mfumo, inazindua nyuzi nyingi inavyohitajika (ni cores ngapi kwenye mfumo au ni ngapi uliiambia). Ipasavyo, kipanga ratiba kitaendesha nyuzi hizi nyepesi za utekelezaji kwenye nyuzi hizi zote za mfumo wa uendeshaji katika kila msingi.

Ikumbukwe kwamba hii ndiyo njia bora zaidi ya kutumia chuma. Mbali na kile kinachoonyeshwa, tunafanya mengi zaidi. Tunatengeneza, kwa mfano, mifumo ya DPI ambayo inaruhusu kitengo kimoja kutumikia gigabits 40 (kulingana na kile kinachotokea katika mistari hii).

Huko, hata kabla ya Go, tulitumia mpango sawa kwa sababu hii: kwa sababu inatuwezesha kuhifadhi eneo la cache ya processor na kupunguza kwa kiasi kikubwa idadi ya swichi za muktadha wa OS (ambayo pia inachukua muda mwingi). Ninarudia: hii ndiyo njia bora zaidi ya kutumia chuma.

Mfano huu rahisi wa mstari 21 ni mfano ambao hufanya echo-server. Tafadhali kumbuka kuwa kazi ya kutumikia ni rahisi sana, ni ya mstari. Hakuna callbacks, hakuna haja ya kujisumbua na kufikiri ... Wewe tu kusoma na kuandika!

Wakati huo huo, ikiwa unasoma na kuandika, inapaswa kuzuia kweli - goroutine hii inawekwa tu kwenye foleni na kuchukuliwa na mpangaji wakati utekelezaji unawezekana tena. Hiyo ni, nambari hii rahisi inaweza kufanya kama seva ya echo kwa miunganisho mingi kama OS kwenye mashine hiyo inaruhusu.

Itaendelea hivi punde...

Baadhi ya matangazo πŸ™‚

Asante kwa kukaa nasi. Je, unapenda makala zetu? Je, ungependa kuona maudhui ya kuvutia zaidi? Tuunge mkono kwa kuweka agizo au kupendekeza kwa marafiki, VPS ya wingu kwa watengenezaji kutoka $4.99, analogi ya kipekee ya seva za kiwango cha kuingia, ambayo ilivumbuliwa na sisi kwa ajili yako: Ukweli wote kuhusu VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps kutoka $19 au jinsi ya kushiriki seva? (inapatikana kwa RAID1 na RAID10, hadi cores 24 na hadi 40GB DDR4).

Dell R730xd 2x nafuu katika kituo cha data cha Equinix Tier IV huko Amsterdam? Hapa tu 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV kutoka $199 nchini Uholanzi! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - kutoka $99! Soma kuhusu Jinsi ya kujenga miundombinu ya Corp. darasa na matumizi ya seva za Dell R730xd E5-2650 v4 zenye thamani ya euro 9000 kwa senti?

Chanzo: mapenzi.com

Kuongeza maoni