Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Mikhail Salosin (sateruse - MS): - Halo kabeh! Jenengku Michael. Aku kerja minangka pangembang backend ing MC2 Software, lan aku bakal pirembagan bab nggunakake Go ing backend saka Deleng + aplikasi seluler.

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Apa ana sing seneng hoki?

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Banjur aplikasi iki kanggo sampeyan. Iki kanggo Android lan iOS lan digunakake kanggo nonton siaran macem-macem acara olahraga online lan direkam. Aplikasi kasebut uga ngemot macem-macem statistik, siaran teks, tabel kanggo konferensi, turnamen lan informasi liyane sing migunani kanggo para penggemar.

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Uga ing aplikasi kasebut ana momen video, yaiku sampeyan bisa nonton momen pertandhingan sing paling penting (gol, gelut, adu tembak, lsp). Yen sampeyan ora pengin nonton kabeh siaran, sampeyan mung bisa nonton sing paling menarik.

Apa sing sampeyan gunakake ing pembangunan?

Bagian utama ditulis ing Go. API sing komunikasi karo klien seluler ditulis ing Go. Layanan kanggo ngirim kabar push menyang ponsel uga ditulis ing Go. Kita uga kudu nulis ORM dhewe, sing bisa diomongake ing sawijining dina. Ya, sawetara layanan cilik ditulis ing Go: ngowahi ukuran lan ngemot gambar kanggo editor ...

Kita nggunakake PostgreSQL minangka database. Antarmuka editor ditulis ing Ruby on Rails nggunakake permata ActiveAdmin. Ngimpor statistik saka panyedhiya statistik uga ditulis ing Ruby.

Kanggo tes API sistem, kita nggunakake unittest Python. Memcached digunakake kanggo nyepetake telpon pembayaran API, "Chef" digunakake kanggo ngontrol konfigurasi, Zabbix digunakake kanggo ngumpulake lan ngawasi statistik sistem internal. Graylog2 kanggo ngumpulake log, Slate minangka dokumentasi API kanggo klien.

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Pilihan protokol

Masalah pisanan sing ditemoni: kita kudu milih protokol kanggo interaksi antarane backend lan klien seluler, adhedhasar poin ing ngisor iki ...

  • Syarat paling penting: data ing klien kudu dianyari ing wektu nyata. Tegese, saben wong sing saiki nonton siaran kudu nampa nganyari meh langsung.
  • Kanggo nyederhanakake samubarang, kita nganggep yen data sing disinkronake karo klien ora dibusak, nanging didhelikake nggunakake panji khusus.
  • Kabeh jinis panjaluk langka (kayata statistik, komposisi tim, statistik tim) dipikolehi kanthi panjaluk GET biasa.
  • Kajaba iku, sistem kasebut kudu gampang ndhukung 100 ewu pangguna ing wektu sing padha.

Adhedhasar iki, kita duwe rong opsi protokol:

  1. Websockets. Nanging kita ora butuh saluran saka klien menyang server. Kita mung perlu ngirim nganyari saka server menyang klien, supaya websocket minangka pilihan sing berlebihan.
  2. Acara sing Dikirim Server (SSE) teka kanthi bener! Iku cukup prasaja lan Sejatine nglegakake kabeh kita perlu.

Acara sing Dikirim Server

Sawetara tembung babagan cara kerjane ...

Iku mlaku ing ndhuwur sambungan http. Klien ngirim panjalukan, server nanggapi karo Content-Type: text/event-stream lan ora nutup sambungan karo klien, nanging terus nulis data menyang sambungan:

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Data bisa dikirim ing format sing disepakati karo klien. Ing kasus kita, kita dikirim ing wangun iki: jeneng struktur diganti (wong, pamuter) dikirim menyang lapangan acara, lan JSON karo anyar, diganti kothak kanggo pemain dikirim menyang lapangan data.

Saiki ayo ngomong babagan cara interaksi kasebut dhewe.

  • Bab pisanan sing ditindakake klien yaiku nemtokake wektu pungkasan sinkronisasi karo layanan kasebut ditindakake: katon ing basis data lokal lan nemtokake tanggal pangowahan pungkasan sing direkam.
  • Iku ngirim panjalukan karo tanggal iki.
  • Kanggo nanggepi, kita ngirim kabeh nganyari sing wis kedadeyan wiwit tanggal kasebut.
  • Sawise iku, nggawe sambungan menyang saluran langsung lan ora ditutup nganti mbutuhake nganyari iki:

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Kita ngirim dhaptar owah-owahan: yen ana wong sing ngetung gol, kita ngganti skor pertandhingan, yen dheweke cilaka, iki uga dikirim kanthi wektu nyata. Mangkono, klien langsung nampa data sing paling anyar ing feed acara pertandhingan. Secara periodik, supaya klien ngerti yen server durung mati, ora ana sing kedadeyan, kita ngirim stempel wektu saben 15 detik - supaya ngerti yen kabeh wis ana lan ora perlu nyambungake maneh.

Kepiye cara sambungan langsung dilayani?

  • Kaping pisanan, kita nggawe saluran menyang nganyari buffered bakal ditampa.
  • Sawise iku, kita langganan saluran iki kanggo nampa nganyari.
  • Kita nyetel header sing bener supaya klien ngerti yen kabeh iku ok.
  • Kirim ping pisanan. Kita mung ngrekam stempel wektu sambungan saiki.
  • Sawisé iku, kita maca saka saluran ing daur ulang nganti saluran nganyari ditutup. Saluran kasebut kanthi periodik nampa cap wektu saiki utawa owah-owahan sing wis ditulis kanggo mbukak sambungan.

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Masalah pisanan sing ditemoni yaiku ing ngisor iki: kanggo saben sambungan sing dibukak karo klien, kita nggawe timer sing dicenthang saben 15 detik - ternyata yen kita duwe 6 ewu sambungan mbukak karo siji mesin (karo siji server API), 6 ewu timer digawe. Iki nyebabake mesin ora nahan beban sing dibutuhake. Masalahe ora pati jelas kanggo kita, nanging entuk bantuan sethithik lan ndandani.

Akibaté, saiki ping kita teka saka saluran sing padha saka nganyari.

Dadi, mung ana siji timer sing obah saben 15 detik.

Ana sawetara fungsi tambahan ing kene - ngirim header, ping lan struktur kasebut dhewe. Yaiku, jeneng meja (wong, pertandhingan, musim) lan informasi babagan entri iki dikirim ing kene:

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Mekanisme kanggo ngirim nganyari

Saiki sethithik babagan saka ngendi owah-owahan kasebut. Kita duwe sawetara wong, editor, sing nonton siaran ing wektu nyata. Dheweke nggawe kabeh acara: ana sing diusir, ana sing tatu, sawetara jinis panggantos ...

Nggunakake CMS, data mlebu ing basis data. Sawise iki, database menehi kabar marang server API babagan iki nggunakake mekanisme Listen / Notify. Server API wis ngirim informasi iki menyang klien. Dadi, kita mung duwe sawetara server sing disambungake menyang database lan ora ana beban khusus ing database, amarga klien ora sesambungan langsung karo database kanthi cara apa wae:

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

PostgreSQL: Rungokake / Notifikasi

Mekanisme Listen / Notify ing Postgres ngidini sampeyan menehi kabar marang pelanggan acara yen sawetara acara wis diganti - sawetara rekaman wis digawe ing database. Kanggo nindakake iki, kita nulis pemicu lan fungsi sing prasaja:

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Nalika nglebokake utawa ngganti rekaman, kita nelpon fungsi notifikasi ing saluran data_updates, ngliwati ana jeneng tabel lan pengenal rekaman sing diganti utawa dipasang.

Kanggo kabeh tabel sing kudu disinkronake karo klien, kita nemtokake pemicu, sing, sawise ngganti / nganyari rekaman, nelpon fungsi sing dituduhake ing slide ing ngisor iki.
Kepiye carane API langganan owah-owahan kasebut?

Mekanisme Fanout digawe - ngirim pesen menyang klien. Nglumpukake kabeh saluran pelanggan lan ngirim nganyari sing ditampa liwat saluran kasebut:

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Kene perpustakaan pq standar, kang nyambung menyang database lan ngandika sing arep ngrungokake saluran (data_updates), mriksa sing sambungan mbukak lan kabeh iku nggoleki. Aku ngilangi kesalahan mriksa kanggo ngirit papan (ora mriksa mbebayani).

Sabanjure, kita nyetel Ticker kanthi asynchronously, sing bakal ngirim ping saben 15 detik, lan miwiti ngrungokake saluran sing langganan. Yen kita nampa ping, kita nerbitake ping iki. Yen kita nampa sawetara jinis entri, banjur kita nerbitaké entri iki kanggo kabeh pelanggan Fanout iki.

Kepiye cara kerja Fan-out?

Ing basa Rusia iki nerjemahake minangka "splitter". Kita duwe siji obyek sing ndhaptar pelanggan sing pengin nampa sawetara nganyari. Lan sanalika nganyari teka kanggo obyek iki, iku distributes nganyari iki kanggo kabeh pelanggan sawijining. Cukup prasaja:

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Cara dileksanakake ing Go:

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Ana struktur, disinkronake nggunakake Mutexes. Wis lapangan sing nyimpen negara sambungan Fanout kanggo database, i.e. lagi ngrungokake lan bakal nampa nganyari, uga dhaptar kabeh saluran kasedhiya - peta, tombol kang saluran lan struct ing wangun nilai (utamane ora digunakake kanthi cara apa wae).

Rong cara - Disambungake lan Pedhot - ngidini kita marang Fanout yen kita duwe sambungan menyang basa, wis katon lan sambungan kanggo basa wis rusak. Ing kasus kapindho, sampeyan kudu medhot kabeh klien lan ngandhani yen dheweke ora bisa ngrungokake apa-apa maneh lan nyambung maneh amarga sambungane wis ditutup.

Ana uga cara Langganan sing nambah saluran menyang "pendengar":

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Ana cara Unsubscribe, sing mbusak saluran saka pamireng yen klien medhot sambungan, uga cara Nerbitake, sing ngidini sampeyan ngirim pesen menyang kabeh pelanggan.

Pitakonan: – Apa sing dikirim liwat saluran iki?

MS: – Model sing wis diganti utawa ping ditularaké (utamané mung nomer, integer).

MS: - Sampeyan bisa ngirim apa wae, ngirim struktur apa wae, nerbitake - mung dadi JSON lan mung.

MS: - Kita nampa kabar saka Postgres - ngemot jeneng tabel lan pengenal. Adhedhasar jeneng tabel lan pengenal, kita entuk rekaman sing dibutuhake, banjur kita ngirim struktur iki kanggo publikasi.

Infrastruktur

Apa iki katon saka perspektif infrastruktur? We kudu 7 server hardware: siji saka wong-wong mau wis rampung darmabakti kanggo database, enem mesin virtual mbukak liyane. Ana 6 salinan API: saben mesin virtual karo API mlaku ing server hardware kapisah - iki kanggo linuwih.

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

Kita duwe loro frontends karo Keepalived diinstal kanggo nambah aksesibilitas, supaya yen ana soko, siji frontend bisa ngganti liyane. Uga - rong salinan CMS.

Ana uga importir statistik. Ana Budak DB saka sing nggawe serep kanthi periodik. Ana Pigeon Pusher, aplikasi sing ngirim kabar push kanggo klien, uga bab infrastruktur: Zabbix, Graylog2 lan Chef.

Nyatane, infrastruktur iki keluwih, amarga 100 ewu bisa dilayani kanthi server sing luwih sithik. Nanging ana wesi - kita digunakake (kita marang sing bisa - kok ora).

Pros saka Go

Sawise kita nggarap aplikasi iki, kaluwihan sing jelas saka Go muncul.

  • Perpustakaan http keren. Kanthi sampeyan bisa nggawe cukup akeh metu saka kothak.
  • Kajaba iku, saluran sing ngidini kita gampang banget ngetrapake mekanisme kanggo ngirim kabar menyang klien.
  • Detektor balapan sing apik banget ngidini kita ngilangi sawetara bug kritis (infrastruktur pementasan). Kabeh sing dianggo ing pementasan dibukak, nyawiji karo tombol Race; lan kita, patut, bisa katon ing infrastruktur pementasan kanggo ndeleng apa masalah potensial kita duwe.
  • Minimalisme lan gamblang basa.

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

We are looking for pangembang! Yen ana sing kepengin, mangga.

Pitakonan

Pitakonan saka pirsawan (sabanjuré - B): - Iku misale jek kula sing ora kejawab siji titik penting babagan Fan-metu. Apa aku bener ngerti yen sampeyan ngirim respon menyang klien, sampeyan mblokir yen klien ora pengin maca?

MS: - Ora, kita ora ngalangi. Kaping pisanan, kita duwe kabeh iki ing mburi nginx, yaiku, ora ana masalah karo klien sing alon. Kapindho, klien duwe saluran kanthi buffer - nyatane, kita bisa nyetel nganti satus nganyari ing kana ... Yen kita ora bisa nulis menyang saluran kasebut, banjur mbusak. Yen kita ndeleng manawa saluran kasebut diblokir, mula kita bakal nutup saluran kasebut, lan mung - klien bakal nyambung maneh yen ana masalah. Mulane, ing prinsip, ora ana pamblokiran ing kene.

IN: - Apa ora bisa langsung ngirim rekaman menyang Rungokake / Notifikasi, lan dudu tabel pengenal?

MS: - Rungokake / Notifikasi duwe watesan 8 ewu bita ing preload sing dikirim. Ing asas, iku bakal bisa kanggo ngirim yen kita dealing with jumlah cilik saka data, nanging misale jek kula sing cara iki [cara kita nindakaken] mung luwih dipercaya. Watesan ana ing Postgres dhewe.

IN: – Apa pelanggan nampa nganyari babagan pertandhingan sing ora disenengi?

MS: - Umumé, ya. Minangka aturan, ana 2-3 pertandhingan ing podo karo, lan malah arang banget. Yen klien nonton apa wae, biasane dheweke nonton pertandingan sing lagi ditindakake. Banjur, klien duwe database lokal sing kabeh nganyari iki ditambahake, lan sanajan tanpa sambungan Internet, klien bisa ndeleng kabeh pertandhingan kepungkur sing wis nganyari. Ateges, kita nyinkronake database kita ing server karo database lokal klien supaya bisa offline.

IN: – Kenapa sampeyan nggawe ORM dhewe?

Alexey (salah sawijining pangembang Look+): – Ing wektu iku (iku taun kepungkur) ana kurang ORMs saka saiki, nalika ana cukup akeh. Bab sing paling disenengi babagan ORM sing paling akeh yaiku umume nganggo antarmuka kosong. Yaiku, metode ing ORM iki siyap kanggo nindakake apa wae: struktur, penunjuk struktur, nomer, soko sing ora ana gandhengane ...

ORM kita ngasilake struktur adhedhasar model data. Aku dhewe. Lan mulane kabeh cara sing konkrit, ora nggunakake bayangan, etc. Padha nampa struktur lan ngarep-arep nggunakake struktur sing teka.

IN: – Carane akeh wong melu?

MS: – Ing tataran wiwitan, wong loro melu. Kita miwiti nang endi wae ing wulan Juni, lan ing Agustus bagean utama wis siap (versi pisanan). Ana release ing September.

IN: – Ngendi sampeyan njlèntrèhaké SSE, sampeyan ora nggunakake wektu entek. Kok ngono?

MS: - Kanggo jujur, SSE isih protokol html5: standar SSE dirancang kanggo komunikasi karo browser, sawayah-wayah aku ngerti. Nduwe fitur tambahan supaya browser bisa nyambung maneh (lan liya-liyane), nanging kita ora butuh, amarga kita duwe klien sing bisa ngetrapake logika apa wae kanggo nyambungake lan nampa informasi. Kita ora nggawe SSE, nanging kaya SSE. Iki dudu protokol dhewe.
Ora perlu. Sa adoh aku ngerti, klien dipun ginakaken mekanisme sambungan meh saka ngeruk. Dheweke ora peduli.

IN: – Apa utilitas tambahan sing sampeyan gunakake?

MS: - Kita paling aktif nggunakake govet lan golint kanggo nggawe gaya manunggal, uga gofmt. Ora ana liyane sing digunakake.

IN: – Apa sing digunakake kanggo debug?

MS: - Debugging umume ditindakake nggunakake tes. Kita ora nggunakake debugger utawa GOP.

IN: – Sampeyan bisa bali geser ing ngendi fungsi Publikasi dileksanakake? Apa jeneng variabel siji-huruf mbingungake sampeyan?

MS: - Ora. Dheweke duwe ruang lingkup visibilitas sing cukup "sempit". Padha ora digunakake ing ngendi wae liya kajaba kene (kajaba internals saka kelas iki), lan iku banget kompak - iku mung njupuk 7 garis.

IN: - Piye wae isih ora intuisi ...

MS: - Ora, ora, iki kode nyata! Iku ora babagan gaya. Iku mung utilitarian, kelas cilik banget - mung 3 lapangan ing njero kelas ...

Mikhail Salosin. Golang Meetup. Nggunakake Go ing mburi aplikasi Look+

MS: - Umume, kabeh data sing disinkronake karo klien (pertandhingan musim, pemain) ora owah. Kira-kira ngandika, yen kita nggawe liyane olahraga kang kita kudu ngganti match, kita mung bakal njupuk kabeh menyang akun ing versi anyar saka klien, lan versi lawas saka klien bakal begalan.

IN: – Apa ana paket manajemen dependensi pihak katelu?

MS: – We digunakake go dep.

IN: – Topik laporan ngandika bab video, nanging laporan ora ngandika bab video.

MS: - Ora, aku ora duwe apa-apa ing topik babagan video. Iki diarani "Deleng +" - iku jeneng aplikasi.

IN: - Sampeyan ujar manawa dikirim menyang klien?..

MS: – Kita padha ora melu streaming video. Iki rampung dening Megafon. Ya, aku ora ujar manawa aplikasi kasebut MegaFon.

MS: – Go – kanggo ngirim kabeh data – ing skor, ing acara pertandhingan, statistik... Go minangka backend kabeh kanggo aplikasi. Klien kudu ngerti saka ngendi wae link sing digunakake kanggo pamuter supaya pangguna bisa nonton pertandhingan kasebut. Kita duwe pranala menyang video lan stream sing wis disiapake.

Sawetara iklan 🙂

Matur nuwun kanggo tetep karo kita. Apa sampeyan seneng karo artikel kita? Pengin ndeleng konten sing luwih menarik? Ndhukung kita kanthi nggawe pesenan utawa menehi rekomendasi menyang kanca, cloud VPS kanggo pangembang saka $4.99, analog unik saka server level entri, sing diciptakake kanggo sampeyan: Bebener kabeh babagan VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps saka $ 19 utawa carane nuduhake server? (kasedhiya karo RAID1 lan RAID10, munggah 24 intine lan nganti 40GB DDR4).

Dell R730xd 2 kaping luwih murah ing pusat data Equinix Tier IV ing Amsterdam? Mung kene 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV saka $199 ing Walanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - saka $99! Maca babagan Carane mbangun infrastruktur corp. kelas karo nggunakake Dell R730xd E5-2650 v4 server worth 9000 euro kanggo Penny?

Source: www.habr.com

Add a comment