Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Mikhail Salosin (apwe sa - MS): - Bonjou tout moun! Non mwen se Michael. Mwen travay kòm yon devlopè backend nan MC2 Software, epi mwen pral pale sou itilizasyon Go nan backend aplikasyon mobil Look+ la.

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Èske gen moun isit la renmen Hockey?

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Lè sa a, aplikasyon sa a se pou ou. Li se pou android ak iOS epi li itilize yo gade emisyon divès evènman espòtif sou entènèt ak anrejistre. Aplikasyon an gen ladan tou estatistik divès kalite, emisyon tèks, tab pou konferans, tounwa ak lòt enfòmasyon itil pou fanatik yo.

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Epitou nan aplikasyon an gen yon bagay tankou moman videyo, sa vle di ou ka gade moman ki pi enpòtan nan match (gòl, batay, fiziyad, elatriye). Si ou pa vle gade tout emisyon an, ou ka gade sèlman sa ki pi enteresan yo.

Ki sa ou te itilize nan devlopman?

Pati prensipal la te ekri nan Go. API ke kliyan mobil yo kominike avèk yo te ekri nan Go. Yon sèvis pou voye notifikasyon pouse nan telefòn mobil yo te ekri tou nan Go. Nou menm tou nou te oblije ekri pwòp ORM nou an, ke nou ta ka pale sou yon jou. Oke, kèk ti sèvis yo te ekri nan Go: redimansyonman ak chaje imaj pou editè yo...

Nou itilize PostgreSQL kòm baz done a. Koòdone editè a te ekri nan Ruby on Rails lè l sèvi avèk gem ActiveAdmin la. Enpòte estatistik ki soti nan yon founisè estatistik yo ekri tou nan Ruby.

Pou tès sistèm API, nou te itilize Python unittest. Memcached yo itilize pou kontwole apèl peman API, "Chef" yo itilize pou kontwole konfigirasyon, Zabbix yo itilize pou kolekte epi kontwole estatistik sistèm entèn yo. Graylog2 se pou kolekte mòso bwa, Slate se dokiman API pou kliyan yo.

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Seleksyon pwotokòl

Premye pwoblèm nou te rankontre: nou te bezwen chwazi yon pwotokòl pou entèraksyon ant backend ak kliyan mobil, ki baze sou pwen sa yo...

  • Kondisyon ki pi enpòtan an: done sou kliyan yo dwe mete ajou an tan reyèl. Sa vle di, tout moun ki ap gade emisyon an kounye a ta dwe resevwa mizajou prèske imedyatman.
  • Pou senplifye bagay sa yo, nou sipoze ke done ki senkronize ak kliyan yo pa efase, men yo kache lè l sèvi avèk drapo espesyal.
  • Tout kalite demann ki ra (tankou estatistik, konpozisyon ekip, estatistik ekip) yo jwenn pa demann GET òdinè.
  • Anplis de sa, sistèm lan te oblije fasilman sipòte 100 mil itilizatè an menm tan an.

Dapre sa a, nou te gen de opsyon pwotokòl:

  1. Websockets. Men, nou pa t 'bezwen chanèl soti nan kliyan an nan sèvè a. Nou sèlman bezwen voye mizajou soti nan sèvè a nan kliyan an, kidonk yon websocket se yon opsyon redondants.
  2. Sèvè-Sent Evènman (SSE) te vini jis dwa! Li se byen senp epi fondamantalman satisfè tout sa nou bezwen.

Sèvè-Voye Evènman

Kèk mo sou kijan bagay sa a fonksyone...

Li kouri sou tèt yon koneksyon http. Kliyan an voye yon demann, sèvè a reponn ak Content-Type: tèks/evènman-kouran epi li pa fèmen koneksyon an ak kliyan an, men li kontinye ekri done sou koneksyon an:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Done yo ka voye nan yon fòma dakò ak kliyan yo. Nan ka nou an, nou te voye li nan fòm sa a: non estrikti a chanje (moun, jwè) te voye nan jaden an evènman, ak JSON ak nouvo, chanje jaden pou jwè a te voye nan jaden an done.

Koulye a, kite a pale sou ki jan entèraksyon an tèt li travay.

  • Premye bagay kliyan an fè se detèmine dènye fwa senkronizasyon ak sèvis la te fèt: li gade baz done lokal li a epi detèmine dat dènye chanjman li anrejistre.
  • Li voye yon demann ak dat sa a.
  • Kòm repons, nou voye l tout mizajou ki te fèt depi dat sa a.
  • Apre sa, li fè yon koneksyon ak chanèl ap viv la epi li pa fèmen jiskaske li bezwen mizajou sa yo:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Nou voye yon lis chanjman l ': si yon moun make yon gòl, nou chanje nòt nan match la, si li vin blese, sa a se voye tou an tan reyèl. Kidonk, kliyan imedyatman resevwa done ajou nan manje evènman match la. Tanzantan, pou kliyan an konprann ke sèvè a pa te mouri, ke pa gen anyen ki rive li, nou voye yon timestamp chak 15 segonn - pou li konnen ke tout bagay an lòd epi pa gen okenn bezwen rekonekte.

Ki jan yo fè sèvis koneksyon an ap viv la?

  • Premye a tout, nou kreye yon chanèl kote yo pral resevwa mizajou tanpon.
  • Apre sa, nou abònman ak chanèl sa a pou resevwa dènye nouvèl yo.
  • Nou mete tèt ki kòrèk la pou kliyan an konnen ke tout bagay se ok.
  • Voye premye ping la. Nou senpleman anrejistre timestamp koneksyon aktyèl la.
  • Apre sa, nou li nan kanal la nan yon bouk jiskaske kanal la aktyalizasyon fèmen. Chanèl la resevwa detanzantan swa timestamp aktyèl la oswa chanjman ke nou deja ekri pou louvri koneksyon.

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Premye pwoblèm nou te rankontre se sa ki annapre a: pou chak koneksyon ouvè ak kliyan an, nou te kreye yon revèy ki make yon fwa chak 15 segonn - li sanble ke si nou te gen 6 mil koneksyon louvri ak yon sèl machin (avèk yon sèvè API), 6 mil timers te kreye. Sa a te mennen nan machin nan pa kenbe chay ki nesesè yo. Pwoblèm lan pa t evidan pou nou, men nou te jwenn yon ti èd epi nou te ranje li.

Kòm yon rezilta, kounye a ping nou an soti nan menm chanèl ki soti nan aktyalizasyon soti.

An konsekans, gen yon sèl revèy ki tik yon fwa chak 15 segonn.

Gen plizyè fonksyon oksilyè isit la - voye header a, ping ak estrikti nan tèt li. Sa vle di, non tab la (moun, match, sezon) ak enfòmasyon sou antre sa a yo transmèt isit la:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Mekanis pou voye mizajou

Koulye a, yon ti kras sou ki kote chanjman yo soti. Nou gen plizyè moun, editè, ki gade emisyon an an tan reyèl. Yo kreye tout evènman yo: yo te voye yon moun, yo te blese yon moun, kèk kalite ranplasman...

Sèvi ak yon CMS, done antre nan baz done a. Apre sa, baz done a notifye sèvè API yo sou sa a lè l sèvi avèk mekanis Koute/Avèti. Sèvè API deja voye enfòmasyon sa yo bay kliyan yo. Kidonk, nou esansyèlman gen sèlman kèk serveurs ki konekte nan baz done a epi pa gen okenn chaj espesyal sou baz done a, paske kliyan an pa kominike dirèkteman ak baz done a nan okenn fason:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

PostgreSQL: Koute / Notifye

Mekanis Koute/Avèti nan Postgres pèmèt ou notifye abonnés evènman yo ke kèk evènman te chanje - gen kèk dosye yo te kreye nan baz done a. Pou fè sa, nou te ekri yon deklanche senp ak fonksyon:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Lè n ap mete oswa chanje yon dosye, nou rele fonksyon notify sou chanèl data_updates la, n ap pase la non tab la ak idantifyan dosye a ki te chanje oswa mete.

Pou tout tab ki dwe senkronize ak kliyan an, nou defini yon deklanche, ki, apre chanje / mete ajou yon dosye, rele fonksyon ki endike sou glisad ki anba a.
Ki jan API a abònman ak chanjman sa yo?

Yo kreye yon mekanis Fanout - li voye mesaj bay kliyan an. Li kolekte tout chanèl kliyan yo epi voye mizajou li te resevwa atravè chanèl sa yo:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Isit la estanda pq bibliyotèk la, ki konekte ak baz done a epi li di ke li vle koute kanal la (data_updates), tcheke ke koneksyon an louvri ak tout bagay anfòm. Mwen omisyon tcheke erè pou ekonomize espas (pa tcheke se danjere).

Apre sa, nou mete asynchrone Ticker, ki pral voye yon ping chak 15 segonn, epi kòmanse koute chanèl nou te abònman an. Si nou resevwa yon ping, nou pibliye ping sa a. Si nou resevwa yon kalite antre, lè sa a nou pibliye antre sa a pou tout abonnés Fanout sa a.

Ki jan Fan-out travay?

Nan Ris sa a tradui kòm "splitter". Nou gen yon sèl objè ki anrejistre abonnés ki vle resevwa kèk mizajou. Epi le pli vit ke yon aktyalizasyon rive nan objè sa a, li distribye aktyalizasyon sa a bay tout abonnés li yo. Senp ase:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Ki jan li aplike nan Go:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Gen yon estrikti, li se senkronize lè l sèvi avèk Mutexes. Li gen yon jaden ki sove eta a nan koneksyon Fanout a nan baz done a, sa vle di li kounye a ap koute epi li pral resevwa mizajou, osi byen ke yon lis tout chanèl ki disponib - kat jeyografik, kle a nan ki se kanal la ak struct nan fòm lan. valè (esansyèlman li pa itilize nan okenn fason).

De metòd - Konekte ak Dekonekte - pèmèt nou di Fanout ke nou gen yon koneksyon ak baz la, li te parèt ak ke koneksyon an nan baz la te kase. Nan dezyèm ka a, ou bezwen dekonekte tout kliyan epi di yo ke yo pa ka koute anyen ankò e ke yo rekonekte paske koneksyon an fèmen.

Genyen tou yon metòd Subscribe ki ajoute kanal la nan "koute" yo:

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Gen yon metòd Unsubscribe, ki retire kanal la nan men moun k ap koute si kliyan an dekonekte, ak yon metòd Publish, ki pèmèt ou voye yon mesaj bay tout abonnés.

Kesyon: – Kisa ki transmèt nan kanal sa a?

MS: – Modèl la ki te chanje oswa ping transmèt (esansyèlman jis yon nimewo, nonb antye relatif).

MS: - Ou ka voye nenpòt bagay, voye nenpòt estrikti, pibliye li - li jis vire nan JSON ak sa a li.

MS: – Nou resevwa yon notifikasyon nan men Postgres – li genyen non tab la ak idantifyan. Dapre non tab la ak idantifyan, nou jwenn dosye nou bezwen an, epi answit nou voye estrikti sa a pou piblikasyon.

Enfrastrikti

Ki sa sa sanble nan yon pèspektiv enfrastrikti? Nou gen 7 sèvè pyès ki nan konpitè: youn nan yo konplètman dedye a baz done a, lòt sis yo kouri machin vityèl. Gen 6 kopi API a: chak machin vityèl ak API a kouri sou yon sèvè pyès ki nan konpitè separe - sa a se pou fyab.

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Nou gen de entèfas ak Keepalived enstale pou amelyore aksè, pou si yon bagay rive, yon entèfas ka ranplase lòt la. Epitou - de kopi CMS la.

Genyen tou yon importateur statistik. Gen yon esklav DB ki soti nan ki sovgad yo fè detanzantan. Gen Pigeon Pusher, yon aplikasyon ki voye notifikasyon pouse bay kliyan, osi byen ke bagay enfrastrikti: Zabbix, Graylog2 ak Chef.

An reyalite, enfrastrikti sa a se redondants, paske 100 mil ka sèvi ak mwens serveurs. Men, te gen fè - nou te itilize li (nou te di ke li te posib - poukisa pa).

Avantaj nan Go

Apre nou te travay sou aplikasyon sa a, avantaj evidan Go te parèt.

  • Cool http bibliyotèk. Avèk li ou ka kreye anpil soti nan bwat la.
  • Anplis de sa, chanèl ki pèmèt nou trè fasil aplike yon mekanis pou voye notifikasyon bay kliyan yo.
  • Bèl bagay detektè ras te pèmèt nou elimine plizyè ensèk kritik (enfrastrikti sèn). Tout sa ki travay sou sèn te lanse, konpile ak kle Ras la; epi nou, kòmsadwa, ka gade nan enfrastrikti nan staging pou wè ki pwoblèm potansyèl nou genyen.
  • Minimalis ak senplisite langaj.

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

Nou ap chèche pou devlopè! Si yon moun vle, tanpri.

Kesyon ou yo

Kesyon ki soti nan odyans lan (apwe sa – B): – Mwen sanble ke ou rate yon pwen enpòtan konsènan Fan-out. Èske mwen kòrèk nan konprann ke lè ou voye yon repons bay yon kliyan, ou bloke si kliyan an pa vle li?

MS: - Non, nou pa bloke. Premyèman, nou gen tout bagay sa yo dèyè nginx, se sa ki, pa gen okenn pwoblèm ak kliyan dousman. Dezyèmman, kliyan an gen yon chanèl ak yon tanpon - an reyalite, nou ka mete jiska yon santèn mizajou la ... Si nou pa ka ekri nan kanal la, Lè sa a, li efase li. Si nou wè ke kanal la bloke, Lè sa a, nou pral tou senpleman fèmen kanal la, e se li - kliyan an pral rekonekte si nenpòt pwoblèm rive. Se poutèt sa, nan prensip, pa gen okenn bloke isit la.

NAN: – Èske li pa t 'kapab imedyatman voye yon dosye nan Koute / Notifye, epi yo pa yon tablo idantifyan?

MS: – Koute/Notize gen yon limit 8 mil byte sou prechaj li voye a. Nan prensip, li ta posib voye si nou te fè fas ak yon ti kantite done, men li sanble ke fason sa a [fason nou fè li] se tou senpleman plis serye. Limit yo se nan Postgres li menm.

NAN: – Èske kliyan resevwa mizajou sou alimèt ke yo pa enterese nan?

MS: - An jeneral, wi. Kòm yon règ, gen 2-3 alimèt k ap pase nan paralèl, e menm lè sa a byen raman. Si yon kliyan ap gade yon bagay, Lè sa a, anjeneral li ap gade match la k ap pase. Lè sa a, kliyan an gen yon baz done lokal kote yo ajoute tout mizajou sa yo, e menm san yon koneksyon Entènèt, kliyan an ka wè tout alimèt sot pase yo pou li gen mizajou. Esansyèlman, nou senkronize baz done nou an sou sèvè a ak baz done lokal kliyan an pou li ka travay offline.

NAN: – Poukisa ou te fè pwòp ORM ou a?

Alexey (youn nan devlopè yo nan Look+): – Nan tan sa a (se te yon ane de sa) te gen mwens ORM pase kounye a, lè gen anpil nan yo. Bagay mwen pi renmen sou pifò ORM yo deyò se ke pi fò nan yo kouri sou interfaces vid. Sa vle di, metòd yo nan ORM sa yo pare yo pran sou nenpòt bagay: yon estrikti, yon konsèy estrikti, yon nimewo, yon bagay konplètman petinan ...

ORM nou an jenere estrikti ki baze sou modèl done yo. Mwen menm. Se poutèt sa tout metòd yo se konkrè, pa sèvi ak refleksyon, elatriye Yo aksepte estrikti ak espere sèvi ak estrikti sa yo ki vini.

NAN: – Konbyen moun ki te patisipe?

MS: – Nan premye etap la, de moun te patisipe. Nou te kòmanse yon kote nan mwa jen, ak nan mwa Out pati prensipal la te pare (premye vèsyon an). Te gen yon lage nan mwa septanm nan.

NAN: – Kote ou dekri SSE, ou pa sèvi ak timeout. Poukisa se sa?

MS: – Pou w onèt, SSE se toujou yon pwotokòl html5: estanda SSE a fèt pou kominike ak navigatè, jan mwen konprann. Li gen karakteristik adisyonèl pou navigatè yo ka rekonekte (ak sou sa), men nou pa bezwen yo, paske nou te gen kliyan ki te kapab aplike nenpòt lojik pou konekte ak resevwa enfòmasyon. Nou pa fè SSE, men pito yon bagay ki sanble ak SSE. Sa a se pa pwotokòl la li menm.
Pa te gen okenn nesesite. Osi lwen ke mwen konprann, kliyan aplike mekanis nan koneksyon prèske soti nan grafouyen. Yo pa t vrèman pran swen.

NAN: – Ki lòt sèvis piblik ou te itilize?

MS: – Nou pi aktivman itilize govet ak golint pou fè style la inifye, osi byen ke gofmt. Pa gen anyen lòt te itilize.

NAN: – Ki sa ou te itilize pou debogaj?

MS: – Debogaj te lajman fèt lè l sèvi avèk tès yo. Nou pa t sèvi ak okenn debugger oswa GOP.

NAN: – Èske ou ka retounen glise kote fonksyon Pibliye a aplike? Èske non varyab yon sèl lèt konfonn ou?

MS: - Non. Yo gen yon jistis "etwat" dimansyon nan vizibilite. Yo pa itilize nenpòt lòt kote eksepte isit la (eksepte pou entèn yo nan klas sa a), epi li trè kontra enfòmèl ant - li sèlman pran 7 liy.

NAN: - Yon jan kanmenm li toujou pa entwisyon ...

MS: - Non, non, sa a se yon kòd reyèl! Li pa sou style. Se jis yon klas itilistè, piti anpil - sèlman 3 jaden andedan klas la...

Mikhail Salosin. Golang reyinyon. Sèvi ak Go nan backend aplikasyon Look+ la

MS: – An jeneral, tout done ki senkronize ak kliyan (match sezon, jwè) pa chanje. Apeprè pale, si nou fè yon lòt espò nan ki nou bezwen chanje match la, nou pral tou senpleman pran tout bagay an kont nan nouvo vèsyon an nan kliyan an, ak vèsyon yo ansyen nan kliyan an pral entèdi.

NAN: – Èske gen nenpòt pakè jesyon depandans twazyèm pati?

MS: – Nou te konn go dep.

NAN: – Te gen yon bagay sou videyo nan sijè a nan rapò a, men pa te gen anyen nan rapò a sou videyo.

MS: - Non, mwen pa gen anyen nan sijè a sou videyo a. Li rele "Gade +" - sa a non aplikasyon an.

NAN: – Ou te di ke li se kouran bay kliyan?...

MS: – Nou pa t patisipe nan difizyon videyo. Sa a te antyèman fè pa Megafon. Wi, mwen pa t 'di ke aplikasyon an te MegaFon.

MS: – Ale – pou voye tout done – sou nòt la, sou evènman match, estatistik... Go se tout backend pou aplikasyon an. Kliyan an dwe konnen soti nan yon kote ki lyen yo itilize pou jwè a pou itilizatè a ka gade match la. Nou gen lyen ki mennen nan videyo ak kouran ki te prepare.

Kèk piblisite 🙂

Mèsi paske w rete avèk nou. Ou renmen atik nou yo? Vle wè plis kontni enteresan? Sipòte nou pa mete yon lòd oswa rekòmande pou zanmi, nwaj VPS pou devlopè soti nan $ 4.99, yon analogue inik nan sèvè nivo antre, ki te envante pa nou pou ou: Tout verite sou VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps soti nan $ 19 oswa ki jan yo pataje yon sèvè? (disponib ak RAID1 ak RAID10, jiska 24 nwayo ak jiska 40GB DDR4).

Dell R730xd 2 fwa pi bon mache nan sant done Equinix Tier IV nan Amstèdam? Sèlman isit la 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV soti nan $199 nan Netherlands! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - soti nan $ 99! Li sou Ki jan yo bati enfrastrikti corp. klas ak itilizasyon Dell R730xd E5-2650 v4 serveurs ki vo 9000 ero pou yon jounen travay?

Sous: www.habr.com

Add nouvo kòmantè