Mihails Salosins (turpmÄk ā MS): - Sveiki visiem! Mani sauc Maikls. Es strÄdÄju par aizmugursistÄmas izstrÄdÄtÄju uzÅÄmumÄ MC2 Software, un es runÄÅ”u par Go izmantoÅ”anu mobilÄs lietojumprogrammas Look+ aizmugursistÄmÄ.
Vai te kÄdam patÄ«k hokejs?
Tad Ŕī lietojumprogramma ir paredzÄta jums. Tas ir paredzÄts operÄtÄjsistÄmai Android un iOS, un to izmanto, lai skatÄ«tos dažÄdu sporta notikumu pÄrraides tieÅ”saistÄ un ierakstÄ«tas. AplikÄcijÄ atrodama arÄ« dažÄda statistika, teksta pÄrraides, konferenÄu, turnÄ«ru tabulas un cita lÄ«dzjutÄjiem noderÄ«ga informÄcija.
ArÄ« aplikÄcijÄ ir tÄda lieta kÄ video momenti, t.i., var noskatÄ«ties maÄu svarÄ«gÄkos momentus (vÄrti, cÄ«Åas, sitieni utt.). Ja nevÄlaties skatÄ«ties visu pÄrraidi, varat skatÄ«ties tikai interesantÄkos.
Ko izmantojÄt attÄ«stÄ«bÄ?
GalvenÄ daļa tika uzrakstÄ«ta Go. API, ar kuru sazinÄjÄs mobilie klienti, tika rakstÄ«ta programmÄ Go. Go tika rakstÄ«ts arÄ« pakalpojums push paziÅojumu nosÅ«tÄ«Å”anai uz mobilajiem tÄlruÅiem. Mums bija arÄ« jÄuzraksta savs ORM, par kuru mÄs kÄdreiz varÄtu runÄt. Nu kaut kÄdi nelieli servisi tika ierakstÄ«ti Go: izmÄru maiÅa un attÄlu ielÄde redaktoriem...
MÄs izmantojÄm PostgreSQL kÄ datu bÄzi. Redaktora saskarne tika uzrakstÄ«ta Ruby on Rails, izmantojot ActiveAdmin dÄrgakmeni. ArÄ« statistikas importÄÅ”ana no statistikas nodroÅ”inÄtÄja ir rakstÄ«ta rubÄ«nÄ.
SistÄmas API testiem mÄs izmantojÄm Python unittest. Memcached tiek izmantots, lai ierobežotu API maksÄjumu zvanus, "Chef" tiek izmantots konfigurÄcijas kontrolei, Zabbix tiek izmantots, lai vÄktu un uzraudzÄ«tu iekÅ”Äjo sistÄmu statistiku. Graylog2 ir paredzÄts žurnÄlu apkopoÅ”anai, Slate ir API dokumentÄcija klientiem.
Protokola izvÄle
PirmÄ problÄma, ar kuru mÄs saskÄrÄmies: mums bija jÄizvÄlas protokols mijiedarbÄ«bai starp aizmugursistÄmu un mobilajiem klientiem, pamatojoties uz Å”Ädiem punktiem...
- BÅ«tiskÄkÄ prasÄ«ba: dati par klientiem ir jÄatjauno reÄllaikÄ. Tas nozÄ«mÄ, ka visiem, kas paÅ”laik skatÄs pÄrraidi, atjauninÄjumi jÄsaÅem gandrÄ«z uzreiz.
- Lai vienkÄrÅ”otu lietas, mÄs pieÅÄmÄm, ka dati, kas tiek sinhronizÄti ar klientiem, netiek dzÄsti, bet tiek paslÄpti, izmantojot Ä«paÅ”us karogus.
- Visu veidu retie pieprasÄ«jumi (piemÄram, statistika, komandu sastÄvi, komandu statistika) tiek iegÅ«ti ar parastajiem GET pieprasÄ«jumiem.
- TurklÄt sistÄmai vienlaikus bija viegli jÄatbalsta 100 tÅ«kstoÅ”i lietotÄju.
Pamatojoties uz to, mums bija divas protokola iespÄjas:
- TÄ«mekļa kontaktligzdas. Bet mums nebija vajadzÄ«gi kanÄli no klienta uz serveri. Mums vajadzÄja tikai nosÅ«tÄ«t atjauninÄjumus no servera klientam, tÄpÄc tÄ«mekļa ligzda ir lieka iespÄja.
- Servera nosÅ«tÄ«tie notikumi (SSE) parÄdÄ«jÄs tieÅ”i tÄ! Tas ir diezgan vienkÄrÅ”i un bÅ«tÄ«bÄ apmierina visu, kas mums nepiecieÅ”ams.
Servera sūtītie notikumi
Daži vÄrdi par to, kÄ Å”Ä« lieta darbojas...
Tas darbojas, izmantojot http savienojumu. Klients nosÅ«ta pieprasÄ«jumu, serveris atbild ar Content-Type: text/event-stream un nepÄrtrauc savienojumu ar klientu, bet turpina rakstÄ«t datus savienojumam:
Datus var nosÅ«tÄ«t formÄtÄ, kas saskaÅots ar klientiem. MÅ«su gadÄ«jumÄ mÄs to nosÅ«tÄ«jÄm Å”ÄdÄ formÄ: notikuma laukÄ tika nosÅ«tÄ«ts mainÄ«tÄs struktÅ«ras nosaukums (persona, spÄlÄtÄjs), bet datu laukÄ tika nosÅ«tÄ«ts JSON ar jauniem, mainÄ«tiem laukiem spÄlÄtÄjam.
Tagad parunÄsim par to, kÄ darbojas pati mijiedarbÄ«ba.
- Vispirms klients nosaka pÄdÄjo reizi, kad tika veikta sinhronizÄcija ar pakalpojumu: tas apskata savu lokÄlo datu bÄzi un nosaka pÄdÄjo reÄ£istrÄto izmaiÅu datumu.
- TÄ nosÅ«ta pieprasÄ«jumu ar Å”o datumu.
- Atbildot uz to, mÄs viÅam nosÅ«tÄm visus atjauninÄjumus, kas notikuÅ”i kopÅ” Ŕī datuma.
- PÄc tam tas izveido savienojumu ar tieÅ”raides kanÄlu un neaizveras, kamÄr tam nav nepiecieÅ”ami Å”ie atjauninÄjumi:
MÄs viÅam nosÅ«tÄm izmaiÅu sarakstu: ja kÄds gÅ«st vÄrtus, mÄs mainÄm maÄa rezultÄtu, ja viÅÅ” gÅ«st traumu, tas tiek nosÅ«tÄ«ts arÄ« reÄllaikÄ. TÄdÄjÄdi klienti spÄles notikumu plÅ«smÄ uzreiz saÅem jaunÄkos datus. Periodiski, lai klients saprastu, ka serveris nav nomiris, nekas nav noticis, ik pÄc 15 sekundÄm nosÅ«tÄm laika zÄ«mogu - lai tas zina, ka viss ir kÄrtÄ«bÄ un nav jÄpievienojas.
KÄ tiek apkalpots tieÅ”raides savienojums?
- PirmkÄrt, mÄs izveidojam kanÄlu, kurÄ tiks saÅemti buferizÄtie atjauninÄjumi.
- PÄc tam mÄs abonÄjam Å”o kanÄlu, lai saÅemtu jaunumus.
- MÄs uzstÄdÄm pareizo galveni, lai klients zinÄtu, ka viss ir kÄrtÄ«bÄ.
- NosÅ«tiet pirmo ping. MÄs vienkÄrÅ”i ierakstÄm paÅ”reizÄjo savienojuma laikspiedolu.
- PÄc tam mÄs lasÄm no kanÄla cilpÄ, lÄ«dz atjauninÄÅ”anas kanÄls tiek aizvÄrts. KanÄls periodiski saÅem vai nu paÅ”reizÄjo laikspiedolu, vai izmaiÅas, kuras mÄs jau rakstÄm, lai atvÄrtu savienojumus.
PirmÄ problÄma, ar kuru saskÄrÄmies, bija Å”Äda: katram savienojumam, kas tika atvÄrts ar klientu, mÄs izveidojÄm taimeri, kas atzÄ«mÄjÄs reizi 15 sekundÄs - izrÄdÄs, ja mums bÅ«tu atvÄrti 6 tÅ«kstoÅ”i savienojumu ar vienu maŔīnu (ar vienu API serveri), 6 tika izveidoti tÅ«kstoÅ”i taimeru. Tas noveda pie tÄ, ka iekÄrta neturÄja nepiecieÅ”amo slodzi. ProblÄma mums nebija tik acÄ«mredzama, taÄu mÄs saÅÄmÄm nelielu palÄ«dzÄ«bu un to novÄrsÄm.
TÄ rezultÄtÄ tagad mÅ«su ping nÄk no tÄ paÅ”a kanÄla, no kura nÄk atjauninÄjums.
AttiecÄ«gi ir tikai viens taimeris, kas atzÄ«mÄ reizi 15 sekundÄs.
Å eit ir vairÄkas palÄ«gfunkcijas - galvenes nosÅ«tÄ«Å”ana, ping un pati struktÅ«ra. Tas ir, tabulas nosaukums (persona, spÄle, sezona) un informÄcija par Å”o ierakstu tiek pÄrsÅ«tÄ«ta Å”eit:
AtjauninÄjumu nosÅ«tÄ«Å”anas mehÄnisms
Tagad nedaudz par to, no kurienes nÄk izmaiÅas. Mums ir vairÄki cilvÄki, redaktori, kuri skatÄs pÄrraidi reÄllaikÄ. ViÅi rada visus notikumus: kÄds tika izraidÄ«ts, kÄds tika ievainots, kaut kÄds aizvietotÄjs...
Izmantojot CMS, dati tiek ievadÄ«ti datu bÄzÄ. PÄc tam datu bÄze par to informÄ API serverus, izmantojot Listen/Notify mehÄnismu. API serveri jau nosÅ«ta Å”o informÄciju klientiem. TÄdÄjÄdi mums bÅ«tÄ«bÄ ir tikai daži serveri, kas ir pieslÄgti datu bÄzei, un datu bÄzei nav Ä«paÅ”as slodzes, jo klients nekÄdÄ veidÄ tieÅ”i mijiedarbojas ar datu bÄzi:
PostgreSQL: klausieties/paziÅojiet
MehÄnisms Listen/Notify programmÄ Postgres ļauj paziÅot notikumu abonentiem, ka kÄds notikums ir mainÄ«jies ā kÄds ieraksts ir izveidots datu bÄzÄ. Lai to izdarÄ«tu, mÄs uzrakstÄ«jÄm vienkÄrÅ”u trigeri un funkciju:
Ievietojot vai mainot ierakstu, kanÄlÄ data_updates izsaucam funkciju notify, nododot tur tabulas nosaukumu un mainÄ«tÄ vai ievietotÄ ieraksta identifikatoru.
VisÄm tabulÄm, kas jÄsinhronizÄ ar klientu, mÄs definÄjam trigeri, kas pÄc ieraksta maiÅas/atjauninÄÅ”anas izsauc zemÄk esoÅ”ajÄ slaidÄ norÄdÄ«to funkciju.
KÄ API parakstÄs uz Ŕīm izmaiÅÄm?
Tiek izveidots Fanout mehÄnisms - tas sÅ«ta ziÅojumus klientam. Tas apkopo visus klientu kanÄlus un nosÅ«ta atjauninÄjumus, kas saÅemti, izmantojot Å”os kanÄlus:
Å eit standarta pq bibliotÄka, kas pieslÄdzas datu bÄzei un saka, ka vÄlas klausÄ«ties kanÄlu (data_updates), pÄrbauda, āāvai savienojums ir atvÄrts un viss ir kÄrtÄ«bÄ. Es izlaižu kļūdu pÄrbaudi, lai ietaupÄ«tu vietu (nepÄrbaudÄ«t ir bÄ«stami).
TÄlÄk mÄs asinhroni iestatÄm Ticker, kas ik pÄc 15 sekundÄm nosÅ«tÄ«s ping un sÄksim klausÄ«ties kanÄlu, kuru abonÄjÄm. Ja saÅemam ping, mÄs to publicÄjam. Ja mÄs saÅemam kÄdu ierakstu, mÄs publicÄjam Å”o ierakstu visiem Ŕī Fanout abonentiem.
KÄ darbojas Fan-out?
Krievu valodÄ tas tiek tulkots kÄ "sadalÄ«tÄjs". Mums ir viens objekts, kas reÄ£istrÄ abonentus, kuri vÄlas saÅemt kÄdus atjauninÄjumus. Un, tiklÄ«dz Å”im objektam pienÄk atjauninÄjums, tas izplata Å”o atjauninÄjumu visiem saviem abonentiem. Pietiekami vienkÄrÅ”i:
KÄ tas tiek ieviests pakalpojumÄ Go:
Ir struktÅ«ra, tÄ tiek sinhronizÄta, izmantojot Mutexes. Tam ir lauks, kas saglabÄ Fanout savienojuma stÄvokli ar datu bÄzi, t.i., paÅ”laik klausÄs un saÅems atjauninÄjumus, kÄ arÄ« visu pieejamo kanÄlu sarakstu - karte, kuras atslÄga ir kanÄls un struktÅ«ra vÄrtÄ«bas (bÅ«tÄ«bÄ tas nekÄdÄ veidÄ netiek izmantots).
Divas metodes - savienots un atvienots - ļauj mums pateikt Fanout, ka mums ir savienojums ar bÄzi, tas ir parÄdÄ«jies un savienojums ar bÄzi ir pÄrtraukts. OtrajÄ gadÄ«jumÄ jums ir jÄatvieno visi klienti un jÄpasaka, ka viÅi vairs nevar neko klausÄ«ties un ka viÅi atkal izveido savienojumu, jo savienojums ar viÅiem ir beidzies.
Ir arÄ« abonÄÅ”anas metode, kas pievieno kanÄlu āklausÄ«tÄjiemā:
Ir Unsubscribe metode, kas noÅem kanÄlu no klausÄ«tÄjiem, ja klients atvienojas, kÄ arÄ« Publish metode, kas ļauj nosÅ«tÄ«t ziÅojumu visiem abonentiem.
JautÄjums: ā Kas tiek pÄrraidÄ«ts pa Å”o kanÄlu?
JAUNKUNDZE: ā Tiek pÄrsÅ«tÄ«ts mainÄ«tais modelis vai ping (bÅ«tÄ«bÄ tikai skaitlis, vesels skaitlis).
JAUNKUNDZE: - JÅ«s varat nosÅ«tÄ«t jebko, nosÅ«tÄ«t jebkuru struktÅ«ru, publicÄt to - tas vienkÄrÅ”i pÄrvÄrÅ”as par JSON un viss.
JAUNKUNDZE: ā MÄs saÅemam paziÅojumu no Postgres ā tajÄ ir tabulas nosaukums un identifikators. Pamatojoties uz tabulas nosaukumu un identifikatoru, mÄs iegÅ«stam vajadzÄ«go ierakstu un pÄc tam nosÅ«tÄm Å”o struktÅ«ru publicÄÅ”anai.
Infrastruktūra
KÄ tas izskatÄs no infrastruktÅ«ras viedokļa? Mums ir 7 aparatÅ«ras serveri: viens no tiem ir pilnÄ«bÄ veltÄ«ts datu bÄzei, pÄrÄjie seÅ”i darbina virtuÄlÄs maŔīnas. Ir 6 API kopijas: katra virtuÄlÄ maŔīna ar API darbojas atseviÅ”Ä·Ä aparatÅ«ras serverÄ« ā tas ir paredzÄts uzticamÄ«bas labad.
Mums ir divas priekÅ”gals ar Keepalived, kas ir instalÄtas, lai uzlabotu pieejamÄ«bu, lai, ja kaut kas notiek, viens priekÅ”gals varÄtu aizstÄt otru. TÄpat ā divi CMS eksemplÄri.
Ir arÄ« statistikas importÄtÄjs. Ir DB Slave, no kura periodiski tiek veidotas dublÄjumkopijas. Ir Pigeon Pusher, aplikÄcija, kas sÅ«ta push paziÅojumus klientiem, kÄ arÄ« infrastruktÅ«ras lietas: Zabbix, Graylog2 un Chef.
Faktiski Ŕī infrastruktÅ«ra ir lieka, jo 100 tÅ«kstoÅ”us var apkalpot ar mazÄku serveru skaitu. Bet bija dzelzs ā izmantojÄm (mums teica, ka var ā kÄpÄc gan ne).
Go plusi
PÄc tam, kad mÄs strÄdÄjÄm pie Ŕīs lietojumprogrammas, parÄdÄ«jÄs tÄdas acÄ«mredzamas Go priekÅ”rocÄ«bas.
- ForÅ”a http bibliotÄka. Ar to jÅ«s varat izveidot diezgan daudz no kastes.
- TurklÄt kanÄli, kas ļÄva mums ļoti vienkÄrÅ”i ieviest mehÄnismu paziÅojumu nosÅ«tÄ«Å”anai klientiem.
- BrÄ«niŔķīgÄ lieta, sacÄ«kÅ”u detektors, ļÄva mums novÄrst vairÄkas kritiskas kļūdas (inscenÄÅ”anas infrastruktÅ«ra). Viss, kas darbojas iestudÄjumÄ, tiek palaists, apkopots ar Race taustiÅu; un mÄs attiecÄ«gi varam aplÅ«kot inscenÄÅ”anas infrastruktÅ«ru, lai redzÄtu, kÄdas mums ir iespÄjamÄs problÄmas.
- MinimÄlisms un valodas vienkÄrŔība.
MeklÄjam izstrÄdÄtÄjus! Ja kÄds vÄlas, lÅ«dzu.
jautÄjumi
KlausÄ«tÄju jautÄjums (turpmÄk ā B): ā Man Ŕķiet, ka jÅ«s palaidÄt garÄm vienu svarÄ«gu punktu saistÄ«bÄ ar Fan-out. Vai es pareizi saprotu, ka, nosÅ«tot atbildi klientam, jÅ«s bloÄ·Äjat, ja klients nevÄlas lasÄ«t?
JAUNKUNDZE: ā NÄ, mÄs nebloÄ·Äjam. PirmkÄrt, mums tas viss ir aiz nginx, tas ir, ar lÄniem klientiem nav problÄmu. OtrkÄrt, klientam ir kanÄls ar buferi - patiesÄ«bÄ tur varam ielikt lÄ«dz simts atjauninÄjumiem... Ja nevaram uzrakstÄ«t kanÄlam, tad tas to izdzÄÅ”. Ja mÄs redzÄsim, ka kanÄls ir bloÄ·Äts, mÄs vienkÄrÅ”i aizvÄrsim kanÄlu, un tas arÄ« viss - klients atjaunos savienojumu, ja radÄ«sies kÄda problÄma. TÄpÄc principÄ Å”eit nav bloÄ·ÄÅ”anas.
In: ā Vai nevarÄtu uzreiz nosÅ«tÄ«t ierakstu uz Listen/Notify, nevis identifikatoru tabulu?
JAUNKUNDZE: - KlausÄ«ties/paziÅot ir 8 tÅ«kstoÅ”u baitu ierobežojums nosÅ«tÄmajÄ priekÅ”ielÄdÄ. PrincipÄ bÅ«tu iespÄjams nosÅ«tÄ«t, ja bÅ«tu darÄ«Å”ana ar nelielu datu apjomu, bet man Ŕķiet, ka Å”Ädi [tÄ, kÄ mÄs to darÄm], ir vienkÄrÅ”i ticamÄk. Ierobežojumi ir paÅ”Ä PostgresÄ.
In: ā Vai klienti saÅem jaunumus par spÄlÄm, kas viÅus neinteresÄ?
JAUNKUNDZE: ā VispÄr jÄ. ParalÄli notiek 2-3 maÄi, un arÄ« tad diezgan reti. Ja klients kaut ko skatÄs, tad parasti viÅÅ” skatÄs maÄu, kas notiek. PÄc tam klientam ir lokÄlÄ datu bÄze, kurÄ tiek summÄti visi Å”ie atjauninÄjumi, un pat bez interneta savienojuma klients var skatÄ«t visas iepriekÅ”ÄjÄs atbilstÄ«bas, kurÄm viÅam ir atjauninÄjumi. BÅ«tÄ«bÄ mÄs sinhronizÄjam savu datu bÄzi serverÄ« ar klienta lokÄlo datu bÄzi, lai viÅÅ” varÄtu strÄdÄt bezsaistÄ.
In: ā KÄpÄc jÅ«s izveidojÄt savu ORM?
Aleksejs (viens no Look+ izstrÄdÄtÄjiem): ā Toreiz (tas bija pirms gada) ORM bija mazÄk nekÄ tagad, kad to ir diezgan daudz. Mana mīļÄkÄ lieta par lielÄko daļu ORM ir tÄ, ka lielÄkÄ daļa no tiem darbojas tukÅ”Äs saskarnÄs. Tas ir, metodes Å”ajos ORM ir gatavas uzÅemties jebko: struktÅ«ru, struktÅ«ras rÄdÄ«tÄju, numuru, kaut ko pilnÄ«gi neatbilstoÅ”u...
MÅ«su ORM Ä£enerÄ struktÅ«ras, pamatojoties uz datu modeli. Es pats. Un tÄpÄc visas metodes ir konkrÄtas, neizmanto refleksiju utt. ViÅi pieÅem struktÅ«ras un sagaida, ka izmantos tÄs struktÅ«ras, kas nÄk.
In: ā Cik cilvÄku piedalÄ«jÄs?
JAUNKUNDZE: ā SÄkotnÄjÄ posmÄ piedalÄ«jÄs divi cilvÄki. SÄkÄm kaut kur jÅ«nijÄ, un augustÄ bija gatava galvenÄ daļa (pirmÄ versija). SeptembrÄ« bija izlaidums.
In: ā Ja jÅ«s aprakstÄt SSE, jÅ«s neizmantojat taimautu. KÄpÄc ir tÄ, ka?
JAUNKUNDZE: ā GodÄ«gi sakot, SSE joprojÄm ir html5 protokols: SSE standarts ir paredzÄts saziÅai ar pÄrlÅ«kprogrammÄm, cik es saprotu. Tam ir papildu funkcijas, lai pÄrlÅ«kprogrammas varÄtu atkÄrtoti izveidot savienojumu (un tÄ tÄlÄk), bet mums tÄs nav vajadzÄ«gas, jo mums bija klienti, kas varÄja ieviest jebkÄdu savienojuma un informÄcijas saÅemÅ”anas loÄ£iku. MÄs netaisÄ«jÄm SSE, bet gan kaut ko lÄ«dzÄ«gu SSE. Tas nav pats protokols.
Nebija vajadzÄ«bas. Cik saprotu, klienti savienojuma mehÄnismu ieviesa gandrÄ«z no nulles. ViÅiem bija vienalga.
In: ā KÄdus papildu pakalpojumus izmantojÄt?
JAUNKUNDZE: ā Stila vienotÄ«bai visaktÄ«vÄk izmantojÄm govet un golint, kÄ arÄ« gofmt. Nekas cits netika izmantots.
In: ā Ko jÅ«s izmantojÄt atkļūdoÅ”anai?
JAUNKUNDZE: ā AtkļūdoÅ”ana lielÄkoties tika veikta, izmantojot testus. MÄs neizmantojÄm atkļūdotÄju vai GOP.
In: ā Vai varat atgriezt slaidu, kurÄ ir ieviesta funkcija PublicÄt? Vai viena burta mainÄ«go nosaukumi jÅ«s mulsina?
JAUNKUNDZE: - NÄ. ViÅiem ir diezgan āÅ”auraā redzamÄ«bas joma. Tie netiek izmantoti nekur citur, izÅemot Å”eit (izÅemot Ŕīs klases iekÅ”Äjos elementus), un tas ir ļoti kompakts - tas aizÅem tikai 7 rindas.
In: ā Kaut kÄ tas joprojÄm nav intuitÄ«vi...
JAUNKUNDZE: - NÄ, nÄ, tas ir Ä«sts kods! Tas nav par stilu. TÄ ir tik utilitÄra, ļoti maza klase - tikai 3 lauki klasÄ...
JAUNKUNDZE: ā KopumÄ visi dati, kas tiek sinhronizÄti ar klientiem (sezonas spÄles, spÄlÄtÄji), nemainÄs. Aptuveni runÄjot, ja mÄs veidosim citu sporta veidu, kurÄ mums ir jÄmaina maÄs, mÄs vienkÄrÅ”i Åemsim visu vÄrÄ klienta jaunajÄ versijÄ, un vecÄs klienta versijas tiks aizliegtas.
In: ā Vai ir kÄdas treÅ”Äs puses atkarÄ«bas pÄrvaldÄ«bas pakotnes?
JAUNKUNDZE: ā MÄs izmantojÄm go dep.
In: ā ZiÅojuma tÄmÄ bija kaut kas par video, bet ziÅojumÄ par video nebija nekÄ.
JAUNKUNDZE: ā NÄ, man nav nekÄ tÄmÄ par videoklipu. To sauc par āLook+ā ā tas ir lietojumprogrammas nosaukums.
In: ā JÅ«s teicÄt, ka tas tiek straumÄts klientiem?
JAUNKUNDZE: ā MÄs nebijÄm iesaistÄ«ti video straumÄÅ”anÄ. To pilnÄ«bÄ veica Megafon. JÄ, es neteicu, ka lietojumprogramma ir MegaFon.
JAUNKUNDZE: ā Go ā visu datu nosÅ«tÄ«Å”anai ā par rezultÄtu, spÄļu notikumiem, statistiku... Go ir visa lietojumprogrammas aizmugursistÄma. Klientam no kaut kurienes ir jÄzina, kuru saiti spÄlÄtÄjam izmantot, lai lietotÄjs varÄtu skatÄ«ties spÄli. Mums ir saites uz sagatavotajiem videoklipiem un straumÄm.
Dažas reklÄmas š
Paldies, ka palikÄt kopÄ ar mums. Vai jums patÄ«k mÅ«su raksti? Vai vÄlaties redzÄt interesantÄku saturu? Atbalsti mÅ«s, pasÅ«tot vai iesakot draugiem,
Dell R730xd 2x lÄtÄk Equinix Tier IV datu centrÄ AmsterdamÄ? Tikai Å”eit
Avots: www.habr.com