Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Alexey Naydenov, Prif Swyddog Gweithredol ITooLabs, yn sôn am ddatblygiad platfform telathrebu ar gyfer gweithredwyr telathrebu yn iaith raglennu Go (Golang). Mae Alexey hefyd yn rhannu ei brofiad o leoli a gweithredu'r platfform yn un o'r gweithredwyr telathrebu Asiaidd mwyaf, a ddefnyddiodd y platfform i ddarparu gwasanaethau post llais (VoiceMail) a Virtual PBX (Cloud PBX).

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Alexey Naydenov (o hyn ymlaen - AN): - Helo bawb! Fy enw i yw Alexey Naydenov. Fi yw cyfarwyddwr ITooLabs. Yn gyntaf oll, hoffwn ateb yr hyn yr wyf yn ei wneud yma a sut y diweddais yma.

Os edrychwch ar y Farchnad Bitrix24 (adran “Telephony”), yna 14 cais a 36 sydd yno (40%) yw ni:

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Yn fwy manwl gywir, dyma ein partneriaid gweithredol, ond y tu ôl i hyn i gyd yw ein platfform (Platfform fel Gwasanaeth) - yr hyn yr ydym yn ei werthu iddynt am geiniog fach. A dweud y gwir, hoffwn siarad am ddatblygiad y platfform hwn a sut y daethom i Go.

Y niferoedd ar gyfer ein platfform nawr:

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

44 o bartneriaid gweithredwr, gan gynnwys Megafon. A siarad yn gyffredinol, rydyn ni'n hoff iawn o fynd ar anturiaethau gwahanol, ac mae gennym ni fynediad gwirioneddol i 100 miliwn o danysgrifwyr o 44 o weithredwyr yma yn Rwsia. Felly, os oes gan unrhyw un unrhyw syniadau busnes, byddwn bob amser yn hapus i wrando arnynt.

  • 5000 o gwmnïau defnyddwyr.
  • 20 o danysgrifwyr i gyd. Mae hyn i gyd yn b000b - dim ond gyda chwmnïau rydyn ni'n gweithio.
  • 300 galwad y funud yn ystod y dydd.
  • 100 miliwn o funudau galw y llynedd (dathlu ni). Nid yw hyn yn cymryd i ystyriaeth y trafodaethau mewnol sydd ar gael ar ein platfform.

Sut y dechreuodd?

Sut mae'r dudes cywir hyd yn oed yn dechrau gwneud eu platfform? Rhaid inni hefyd gymryd i ystyriaeth fod gennym hanes o ddatblygiad “menter craidd caled”, a hyd yn oed ar yr adeg fwyaf manwl gywir o'r flwyddyn ar gyfer menter! Dyna’r amser hapus hwnnw pan ddowch at y cwsmer a dweud: “Mae angen cwpl mwy o weinyddion arnom.” A'r cwsmer: “Dim cwestiwn! Mae gennym ni ddeg yn y rhesel.”

Felly fe wnaethom Oracle, Java, WebSphere, Db2 a'r holl bethau hynny. Felly, fe wnaethom ni, wrth gwrs, gymryd yr atebion gwerthwr gorau, eu hintegreiddio a cheisio cychwyn ag ef. Cerddon ni ar ein pennau ein hunain. Byddai hwn yn fusnes mewnol o'r fath.

Dechreuodd hyn i gyd mewn gwirionedd yn 2009. Ers 2006, rydym wedi bod yn ymwneud yn agos ag atebion gweithredwr, un ffordd neu'r llall. Fe wnaethon ni sawl PBX rhithwir personol (fel yr un sydd gennym ni nawr ar archeb): fe wnaethon ni edrych arno, penderfynu ei fod yn dda, a phenderfynu cychwyn cychwyn mewnol.

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Cymerasom VMWare. Gan ein bod ar ein pennau ein hunain, bu'n rhaid i ni roi'r gorau ar unwaith i'r gwerthwr oer Storio. Rydyn ni'n gwybod popeth amdanyn nhw: rhaid rhannu'r addewidion hynny â 3, a rhaid lluosi'r gost â 10. Dyna pam y gwnaethon nhw DirDB ac ati.

Yna dechreuodd dyfu. Ychwanegwyd gwasanaeth bilio at hwn oherwydd ni allai'r platfform ymdopi mwyach. Yna symudodd y gweinydd bilio o MySQL i Mongo. O ganlyniad, cawsom ateb gweithredol sy'n prosesu'r holl alwadau sy'n mynd yno:

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Ond rhywle yno, y tu mewn, mae'r un cynnyrch gwerthwr yn troi - y prif un, niwclear, a gymerasom unwaith. Tua diwedd 2011, sylweddolom mai'r brif dagfa i ni, wrth gwrs, fyddai'r cynnyrch penodol hwn - byddem yn rhedeg i mewn iddo. Gwelsom wal o'n blaenau, yr oeddem yn rhedeg i mewn iddo ar garlam lawn, wrth i fwy o gleientiaid barhau i ddod.
Yn unol â hynny, roedd angen inni wneud rhywbeth. Wrth gwrs, fe wnaethom gynnal cryn dipyn o ymchwil ar wahanol gynhyrchion - rhai ffynhonnell agored a rhai gwerthwyr. Wna i ddim aros ar hyn nawr - nid dyna rydyn ni'n siarad amdano. Yr opsiwn wrth gefn olaf un i ni feddwl amdano oedd gwneud ein platfform ein hunain.

Yn y pen draw, daethom at yr opsiwn hwn. Pam? Oherwydd bod pob gwerthwr a chynhyrchion ffynhonnell agored wedi'u gwneud i ddatrys problemau a oedd yn 10 oed. Wel, os 10 oed, a rhai mwy! Daeth y dewis yn amlwg i ni: naill ai rydym yn ffarwelio â'n syniad gwych o wasanaeth delfrydol (ar gyfer partneriaid, gweithredwyr a ni ein hunain), neu rydym yn gwneud rhywbeth ein hunain.

Fe benderfynon ni wneud rhywbeth ein hunain!

Gofynion llwyfan

Os ydych chi wedi bod yn gwneud rhywbeth ers amser maith (gan ddefnyddio cynnyrch rhywun arall), yna mae'r meddwl yn raddol yn ffurfio yn eich pen: sut byddwn i'n gwneud hyn fy hun? Gan ein bod ni i gyd yn rhaglenwyr yn y cwmni (ac eithrio gwerthwyr, nid oes unrhyw rai nad ydynt yn rhaglenwyr), datblygodd ein gofynion amser maith yn ôl, ac roeddent yn glir:

  1. Cyflymder datblygu uchel. Nid oedd y cynnyrch gwerthwr a'n poenydiodd yn foddhaol, yn gyntaf oll, oherwydd trodd popeth allan yn hir ac yn araf. Roedden ni ei eisiau yn gyflym - roedd gennym ni lawer o syniadau! Mae gennym lawer o syniadau o hyd, ond yna roedd y rhestr o syniadau yn debyg ei bod yn ymddangos ddeng mlynedd ymlaen llaw. Nawr dim ond am flwyddyn.
  2. Y defnydd mwyaf posibl o haearn aml-graidd. Roedd hyn hefyd yn bwysig i ni, gan inni weld mai dim ond mwy a mwy o greiddiau fyddai.
  3. Dibynadwyedd uchel. Rhywbeth y buon ni'n crio hefyd.
  4. Gwrthwynebiad uchel i fethiannau.
  5. Roeddem am weld proses o ryddhau dyddiol yn y pen draw. Ar gyfer hyn roedd angen dewis iaith arnom.

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Yn unol â hynny, o'r gofynion ar gyfer y cynnyrch yr ydym wedi'u gosod i ni ein hunain, mae'r gofynion ar gyfer yr iaith yn tyfu mewn ffordd amlwg resymegol.

  1. Os ydym am gael cefnogaeth ar gyfer systemau aml-graidd, yna mae angen cefnogaeth arnom ar gyfer gweithredu cyfochrog.
  2. Os oes angen cyflymder datblygu, mae angen iaith sy'n cefnogi datblygiad cystadleuol, rhaglennu cystadleuol. Os nad yw unrhyw un wedi dod ar draws y gwahaniaeth, mae'n syml iawn:
    • Mae rhaglennu cyfochrog yn ymwneud â sut mae dwy edefyn gwahanol yn cael eu gweithredu ar greiddiau gwahanol;
    • Mae gweithredu cydamserol, neu yn fwy manwl gywir, cefnogaeth gydamserol, yn ymwneud â sut mae iaith (neu amser rhedeg, does dim ots) yn helpu i guddio'r holl gymhlethdod sy'n deillio o weithredu cyfochrog.
  3. Sefydlogrwydd uchel. Yn amlwg, roedd angen clwstwr arnom, ac un gwell nag oedd gennym ar gynnyrch y gwerthwr.

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Nid oedd gennym gymaint o opsiynau mewn gwirionedd, os cofiwch. Yn gyntaf, Erlang - rydyn ni'n ei garu ac yn ei adnabod, dyna oedd fy ffefryn personol, personol. Yn ail, nid yw Java hyd yn oed yn Java, ond yn benodol Scala. Yn drydydd, iaith nad oeddym y pryd hyny yn ei hadnabod o gwbl — Go. Roedd newydd ymddangos bryd hynny, neu yn hytrach, roedd eisoes wedi bodoli ers tua dwy flynedd, ond nid oedd wedi'i ryddhau eto.

Ewch i ennill!

Hanes Go

Fe wnaethon ni lwyfan arno. Byddaf yn ceisio egluro pam.

Hanes Byr o Go. Dechreuodd yn 2007, agorwyd yn 2009, rhyddhawyd y fersiwn gyntaf yn 2012 (hynny yw, dechreuon ni weithio hyd yn oed cyn y datganiad cyntaf). Y cychwynnwr oedd Google, a oedd am ddisodli, fel yr wyf yn amau, Java.

Mae'r awduron yn enwog iawn:

  • Dyfeisiodd Ken Thomson, a oedd y tu ôl i Unix, UTF-8, ar system Cynllun 9;
  • Bu Rob Pike, a ddyfeisiodd UTF-8 gyda Ken, hefyd yn gweithio ar Plan 9, Inferno, Limbo yn Bell Labs;
  • Robert Giesmer, yr ydym yn ei adnabod ac yn ei garu am ddyfeisio'r Java HotSpot Compiler ac am ei waith ar y generadur yn V8 (dehonglydd Javascript Google);
  • A thros 700 o gyfranwyr, gan gynnwys rhai o'n clytiau.

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Ewch: golwg gyntaf

Gwelwn fod yr iaith fwy neu lai yn syml ac yn ddealladwy. Mae gennym fathau amlwg: mewn rhai achosion mae angen eu datgan, mewn eraill nid ydynt yn angenrheidiol (mae hyn yn golygu bod y mathau yn cael eu casglu un ffordd neu'r llall).

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Gellir gweld ei fod yn ffasiynol i ddisgrifio strwythurau. Gellir gweld bod gennym y cysyniad o bwyntydd (lle mae'r seren). Gellir gweld bod cefnogaeth arbennig i ddatgan cychwyniad araeau ac araeau cysylltiadol.

Mae bron yn glir - gallwch chi fyw. Gadewch i ni geisio ysgrifennu Helo, fyd:

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Beth ydym ni'n ei weld? Mae hon yn gystrawen tebyg i C, mae'r hanner colon yn ddewisol. Gall fod yn wahanydd ar gyfer dwy linell, ond dim ond os yw'r rhain yn ddau gystrawen sydd ar yr un llinell.

Gwelwn fod cromfachau mewn strwythurau rheoli (yn y 14eg llinell) yn ddewisol, ond mae angen braces cyrliog bob amser. Gwelwn fod y teipio yn statig. Mae Tim yn cael ei dynnu allan y rhan fwyaf o'r amser. Mae'r enghraifft hon ychydig yn fwy cymhleth na'r arferol Helo, fyd - dim ond i ddangos bod yna lyfrgell.

Beth arall sy'n bwysig yn ein barn ni? Mae'r cod wedi'i drefnu'n becynnau. Ac er mwyn defnyddio pecyn yn eich cod eich hun, mae angen i chi ei fewnforio gan ddefnyddio'r gyfarwyddeb mewnforio - mae hyn hefyd yn bwysig. Rydyn ni'n ei lansio - mae'n gweithio. Gwych!

Gadewch i ni roi cynnig ar rywbeth mwy cymhleth nesaf: Helo, fyd, ond dim ond nawr mae'n weinydd http. Beth rydyn ni'n ei weld yn ddiddorol yma?

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Yn gyntaf, mae'r swyddogaeth yn gweithredu fel paramedr. Mae hyn yn golygu mai ein swyddogaeth yw “dinesydd o'r radd flaenaf” a gallwch chi wneud llawer o bethau diddorol ag ef mewn arddull swyddogaethol. Nesaf gwelwn rywbeth annisgwyl: mae'r gyfarwyddeb fewnforio yn cysylltu'n uniongyrchol â storfa GitHub. Mae hynny'n iawn, dyna fel y mae - ar ben hynny, dyna'r ffordd y dylid ei wneud.

Yn Go, dynodwr cyffredinol pecyn yw url ei gadwrfa. Mae yna gyfleustodau arbennig Goget a fydd yn nôl yr holl ddibyniaethau, eu lawrlwytho, eu gosod, eu llunio a'u paratoi i'w defnyddio os oes angen. Ar yr un pryd, mae Goget yn gwybod am html-meta. Yn unol â hynny, gallwch gadw cyfeiriadur http a fydd yn cynnwys dolenni i'ch ystorfa benodol (fel y gwnawn, er enghraifft).

Beth arall a welwn? Http a Json yn y llyfrgell safonol. Yn amlwg, mae yna fewnsylliad - adlewyrchiad, y dylid ei ddefnyddio wrth amgodio/json, oherwydd yn syml rydym yn rhoi rhyw wrthrych mympwyol yn ei le.

Rydyn ni'n ei redeg ac yn gweld bod gennym ni god defnyddiol mewn 20 llinell, sy'n llunio, yn rhedeg ac yn adrodd am lwyth cyfartalog presennol y peiriant (ar y peiriant y mae'n cael ei lansio arno).
Beth arall sy'n bwysig y gallwn ei weld ar unwaith yma? Fe'i crynhoir yn un deuaidd statig (buinary). Nid oes gan y deuaidd hwn unrhyw ddibyniaethau o gwbl, dim llyfrgelloedd! Gallwch ei gopïo i unrhyw system, ei redeg ar unwaith, a bydd yn gweithio.

Gadewch i ni symud ymlaen.

Ewch: Dulliau a Rhyngwynebau

Mae gan Go ddulliau. Gallwch ddatgan dull ar gyfer unrhyw fath arferiad. Ar ben hynny, nid yw hwn o reidrwydd yn strwythur, ond efallai alias o ryw fath. Gallwch ddatgan alias ar gyfer N32 ac ysgrifennu dulliau iddo wneud unrhyw beth defnyddiol.

A dyma ni'n syrthio i stupor am y tro cyntaf... Mae'n ymddangos nad oes gan Go ddosbarthiadau fel y cyfryw. Efallai y bydd y rhai sy'n adnabod Go yn dweud bod yna gynhwysiant teip, ond mae hynny'n rhywbeth arall yn gyfan gwbl. Gorau po gyntaf y bydd datblygwr yn rhoi'r gorau i feddwl amdano fel etifeddiaeth. Nid oes dosbarthiadau yn Go, ac nid oes etifeddiaeth ychwaith.

Cwestiwn! Beth mae’r cwmni o awduron wedi’i arwain gan Google wedi’i roi inni er mwyn adlewyrchu cymhlethdod y byd? Fe wnaethon nhw roi rhyngwynebau i ni!

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

Mae rhyngwyneb yn fath arbennig sy'n eich galluogi i ysgrifennu dulliau syml, llofnodion dull. Ymhellach, bydd unrhyw fath y mae'r dulliau hyn yn bodoli ar ei gyfer (yn cael eu gweithredu) yn cyfateb i'r rhyngwyneb hwn. Mae hyn yn golygu y gallwch chi ddisgrifio'n syml y swyddogaeth gyfatebol ar gyfer un math, ar gyfer un arall (sy'n cyfateb i'r math hwnnw o ryngwyneb). Nesaf, datganwch newidyn o'r math o ryngwyneb hwn a aseinio unrhyw un o'r gwrthrychau hyn iddo.

Ar gyfer cefnogwyr craidd caled, gallaf ddweud y bydd gan y newidyn hwn ddau awgrym mewn gwirionedd: un i'r data, a'r llall i dabl arbennig o ddisgrifwyr, sy'n nodweddiadol ar gyfer y math penodol hwn, ar gyfer rhyngwyneb y math hwn. Hynny yw, mae'r casglwr yn creu tablau disgrifydd o'r fath ar adeg cysylltu.

Ac yn Go, wrth gwrs, mae awgrymiadau i wagle. Mae'r gair rhyngwyneb {} (gyda dau braces cyrliog) yn newidyn sy'n eich galluogi i bwyntio at unrhyw wrthrych mewn egwyddor.
Hyd yn hyn mae popeth yn iawn, mae popeth yn gyfarwydd. Dim syndod.

Ewch: goroutines

Nawr rydyn ni'n dod at yr hyn sydd o ddiddordeb i ni: prosesau ysgafn - goroutines (goroutines) yn nherminoleg Go.

Alexey Naidenov. ITooLabs. Achos datblygu ar lwyfan ffôn Go (Golang). Rhan 1

  1. Yn gyntaf, maen nhw'n ysgafn iawn (llai na 2 KB).
  2. Yn ail, mae costau creu goroutine o'r fath yn ddibwys: gallwch chi greu mil ohonynt yr eiliad - ni fydd dim yn digwydd.
  3. Cânt eu gwasanaethu gan eu hamserlennydd eu hunain, sydd yn syml yn trosglwyddo rheolaeth o un goroutine i'r llall.
  4. Yn yr achos hwn, trosglwyddir rheolaeth yn yr achosion canlynol:
    • os deuir ar draws y mynegiant go (os yw'r goroutine yn dechrau'r goroutine nesaf);
    • os yw galwad Mewnbwn/Allan blocio wedi'i galluogi;
    • os dechreuir casglu sbwriel;
    • os caiff rhywfaint o weithrediad gyda sianeli ei lansio.

Hynny yw, pryd bynnag y bydd rhaglen Go yn rhedeg ar gyfrifiadur, mae'n pennu nifer y creiddiau yn y system, yn lansio cymaint o edafedd ag sydd angen (faint o greiddiau sydd yn y system neu faint y gwnaethoch chi ei ddweud). Yn unol â hynny, bydd yr amserlennydd yn rhedeg yr edafedd gweithredu ysgafn hyn ar yr holl edafedd system weithredu hyn ym mhob craidd.

Dylid nodi mai dyma'r ffordd fwyaf effeithiol o ddefnyddio haearn. Yn ogystal â'r hyn a ddangosir, rydym yn gwneud llawer mwy. Rydym yn gwneud, er enghraifft, systemau DPI sy'n caniatáu i un uned wasanaethu 40 gigabits (yn dibynnu ar yr hyn sy'n digwydd yn y llinellau hyn).

Yno, hyd yn oed cyn Go, fe wnaethom ddefnyddio'r un cynllun yn union am y rheswm hwn yn union: oherwydd ei fod yn caniatáu inni gadw lleoliad storfa'r prosesydd a lleihau'n sylweddol nifer y switshis cyd-destun OS (sydd hefyd yn cymryd llawer o amser). Dywedaf eto: dyma'r ffordd fwyaf effeithiol o ddefnyddio haearn.

Mae'r enghraifft 21 llinell syml hon yn enghraifft sy'n syml yn adleisio gweinydd. Sylwch fod y swyddogaeth weini yn hynod o syml, mae'n llinol. Nid oes unrhyw alwadau'n ôl, dim angen trafferthu a meddwl... Rydych chi'n darllen ac yn ysgrifennu!

Ar yr un pryd, os ydych chi'n darllen ac yn ysgrifennu, dylai rwystro mewn gwirionedd - mae'r gorooutine hwn yn cael ei roi mewn ciw a'i gymryd gan y trefnydd pan fydd yn bosibl ei gyflawni eto. Hynny yw, gall y cod syml hwn weithredu fel gweinydd adlais ar gyfer cymaint o gysylltiadau ag y mae'r OS ar y peiriant hwnnw'n ei ganiatáu.

I'w barhau yn fuan iawn...

Rhai hysbysebion 🙂

Diolch am aros gyda ni. Ydych chi'n hoffi ein herthyglau? Eisiau gweld cynnwys mwy diddorol? Cefnogwch ni trwy osod archeb neu argymell i ffrindiau, cwmwl VPS i ddatblygwyr o $4.99, analog unigryw o weinyddion lefel mynediad, a ddyfeisiwyd gennym ni ar eich cyfer chi: Y gwir i gyd am VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps o $ 19 neu sut i rannu gweinydd? (ar gael gyda RAID1 a RAID10, hyd at 24 craidd a hyd at 40GB DDR4).

Dell R730xd 2 gwaith yn rhatach yng nghanolfan ddata Equinix Haen IV yn Amsterdam? Dim ond yma 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV o $199 yn yr Iseldiroedd! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - o $99! Darllenwch am Sut i adeiladu seilwaith Corp. dosbarth gyda'r defnydd o weinyddion Dell R730xd E5-2650 v4 gwerth 9000 ewro am geiniog?

Ffynhonnell: hab.com

Ychwanegu sylw