Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Mikhail Salosin (saterusna - MS): - Halo sadayana! Ngaran abdi Michael. Kuring gawe salaku pamekar backend di MC2 Software, sarta kuring bakal ngobrol ngeunaan ngagunakeun Go dina backend tina katingal + aplikasi mobile.

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Aya saha di dieu resep hoki?

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Teras aplikasi ieu kanggo anjeun. Éta kanggo Android sareng ios sareng dianggo pikeun nonton siaran rupa-rupa acara olahraga online sareng dirékam. Aplikasi ieu ogé ngandung rupa-rupa statistik, siaran téks, tabel pikeun konperénsi, turnamén sareng inpormasi anu sanés anu mangpaat pikeun peminat.

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Ogé dina aplikasi aya hal sapertos momen pidéo, nyaéta anjeun tiasa nonton momen anu paling penting dina pertandingan (gol, gelut, adu, jsb.). Upami anjeun henteu hoyong ningali sadaya siaran, anjeun ngan ukur tiasa nonton anu paling pikaresepeun.

Naon anu anjeun anggo dina pangwangunan?

Bagian utama ditulis dina Go. API anu komunikasi sareng klien mobile ditulis dina Go. Ladenan pikeun ngirim bewara push ka telepon sélulér ogé ditulis dina Go. Urang ogé kungsi nulis ORM sorangan, nu urang bisa ngobrol ngeunaan someday. Nya, sababaraha jasa leutik ditulis dina Go: ngarobah ukuran sareng ngamuat gambar pikeun éditor...

Kami nganggo PostgreSQL salaku pangkalan data. Antarbeungeut redaktur ditulis dina Ruby on Rails nganggo permata ActiveAdmin. Impor statistik ti panyadia statistik ogé ditulis dina Ruby.

Pikeun tés API sistem, kami nganggo unittest Python. Memcached dipaké pikeun throttle telepon pamayaran API, "Chef" dipaké pikeun ngadalikeun konfigurasi, Zabbix dipaké pikeun ngumpulkeun sarta ngawas statistik sistem internal. Graylog2 kanggo ngumpulkeun log, Slate mangrupikeun dokuméntasi API pikeun klien.

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Pilihan protokol

Masalah kahiji anu kami hadapi: urang kedah milih protokol pikeun interaksi antara backend sareng klien mobile, dumasar kana poin-poin di handap ieu ...

  • Sarat pangpentingna: data dina klien kudu diropéa sacara real waktu. Hartina, saha waé anu ayeuna ningali siaran éta kedah nampi apdet ampir langsung.
  • Pikeun nyederhanakeun hal, urang nganggap yén data anu disingkronkeun sareng klien henteu dihapus, tapi disumputkeun nganggo bandéra khusus.
  • Sagala jinis pamundut langka (sapertos statistik, komposisi tim, statistik tim) dicandak ku pamundut GET biasa.
  • Tambih Deui, sistem kedah gampang ngadukung 100 rébu pangguna dina waktos anu sami.

Dumasar ieu, urang ngagaduhan dua pilihan protokol:

  1. Websockets. Tapi kami henteu peryogi saluran tina klien ka server. Urang ngan diperlukeun pikeun ngirim apdet ti server ka klien nu, jadi websocket mangrupakeun pilihan kaleuleuwihan.
  2. Kajadian anu dikirimkeun ka server (SSE) leres pisan! Ieu cukup basajan tur dasarna satisfies sagalana urang peryogi.

Server-Kirim Kajadian

Sababaraha kecap ngeunaan kumaha hal ieu jalan...

Ieu dijalankeun dina luhureun hiji sambungan http. Klién ngirim pamenta, server ngabales nganggo Content-Type: text/event-stream sareng henteu nutup sambungan sareng klien, tapi terus nyerat data kana sambungan:

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Data tiasa dikirim dina format anu disatujuan sareng klien. Bisi kami, kami dikirim dina formulir ieu: nami struktur robah (jalma, pamuter) ieu dikirim ka widang acara, sarta JSON kalawan anyar, widang robah pikeun pamuter ieu dikirim ka widang data.

Ayeuna hayu urang ngobrol ngeunaan kumaha interaksi sorangan jalan.

  • Hal kahiji anu dilakukeun ku klien nyaéta nangtukeun waktos terakhir sinkronisasi sareng jasa dilaksanakeun: éta ningali database lokalna sareng nangtukeun tanggal parobihan terakhir anu dirékam ku éta.
  • Ieu ngirimkeun pamundut kalawan tanggal ieu.
  • Salaku réspon, kami ngirim anjeunna sadaya pembaruan anu parantos kajantenan ti saprak éta.
  • Saatos éta, éta nyambungkeun kana saluran langsung sareng henteu nutup dugi ka peryogi apdet ieu:

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Kami ngirim anjeunna daptar parobihan: upami aya anu nyitak tujuan, urang ngarobih skor pertandingan, upami anjeunna luka, ieu ogé dikirim sacara real waktos. Ku kituna, klien langsung nampi data up-to-date dina feed acara pertandingan. Périodik, ambéh klien nu understands yén server teu maot, nu euweuh kajadian ka dinya, urang ngirim timestamp a unggal 15 detik - meh terang yen sagalana aya dina urutan na teu perlu sambungkeun deui.

Kumaha sambungan langsung dilayanan?

  • Anu mimiti, urang nyiptakeun saluran dimana apdet buffered bakal ditampi.
  • Sanggeus éta, urang ngalanggan channel ieu pikeun nampa apdet.
  • Kami nyetél lulugu anu leres supados klien terang yén sadayana henteu kunanaon.
  • Kirim ping munggaran. Urang ngan saukur ngarekam timestamp sambungan ayeuna.
  • Sanggeus éta, urang maca tina saluran dina loop nepi ka saluran update ditutup. Saluran périodik nampi stempel waktos ayeuna atanapi parobihan anu kami parantos nyerat pikeun muka sambungan.

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Masalah kahiji anu kami hadapi nyaéta kieu: pikeun tiap sambungan dibuka sareng klien, kami nyiptakeun timer anu dicentang sakali unggal 15 detik - tétéla yén upami kami ngagaduhan 6 rébu sambungan kabuka sareng hiji mesin (kalayan hiji server API), 6 sarébu timers dijieun. Ieu nyababkeun mesin henteu nahan beban anu diperyogikeun. Masalahna henteu écés pikeun kami, tapi kami ngagaduhan sakedik pitulung sareng ngalereskeunana.

Hasilna, ayeuna ping kami asalna tina saluran anu sami ti mana pembaruan asalna.

Sasuai, ngan aya hiji timer nu ticks sakali unggal 15 detik.

Aya sababaraha fungsi bantu di dieu - ngirim header, ping sareng strukturna sorangan. Nyaéta, nami méja (jalma, pertandingan, usum) sareng inpormasi ngeunaan éntri ieu dikirimkeun ka dieu:

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Mékanisme pikeun ngirim apdet

Ayeuna saeutik ngeunaan dimana parobahan asalna. Kami ngagaduhan sababaraha jalma, éditor, anu ningali siaran sacara real waktos. Aranjeunna nyiptakeun sadaya kajadian: aya anu diusir, aya anu luka, sababaraha jinis panggantian ...

Ngagunakeun CMS, data asup kana database. Saatos ieu, pangkalan data ngabéjaan server API ngeunaan ieu nganggo mékanisme Dengekeun / Bewara. Pangladén API parantos ngirim inpormasi ieu ka klien. Ku kituna, kami dasarna ngan ukur sababaraha server anu nyambung ka pangkalan data sareng teu aya beban khusus dina pangkalan data, sabab klien henteu berinteraksi langsung sareng pangkalan data dina cara naon waé:

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

PostgreSQL: Dengekeun / Bewara

Mékanisme Dengekeun / Bewara dina Postgres ngamungkinkeun anjeun ngabéjaan palanggan acara yén sababaraha acara parantos robih - sababaraha rékaman parantos didamel dina pangkalan data. Jang ngalampahkeun ieu, urang nulis pemicu basajan tur fungsi:

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Nalika nyelapkeun atanapi ngarobih rékaman, kami nyauran fungsi béwara dina saluran data_updates, ngalangkungan nami méja sareng identifier rékaman anu dirobih atanapi diselapkeun.

Pikeun sakabéh tabel nu kudu nyingkronkeun jeung klien, urang nangtukeun pemicu nu, sanggeus ngarobah / ngamutahirkeun rékaman, nelepon fungsi dituduhkeun dina slide di handap.
Kumaha carana API ngalanggan parobahan ieu?

Mékanisme Fanout didamel - ngirim pesen ka klien. Éta ngumpulkeun sadaya saluran palanggan sareng ngirim apdet anu ditampi ngalangkungan saluran ieu:

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Di dieu perpustakaan pq baku, nu nyambung ka database jeung nyebutkeun yen eta hayang ngadangukeun saluran (data_updates), pariksa yen sambungan kabuka sarta sagalana geus rupa. Kuring omitting kasalahan mariksa pikeun ngahemat spasi (teu mariksa bahaya).

Salajengna, urang asynchronously nyetél Ticker, anu bakal ngirim ping unggal 15 detik, tur mimitian ngadangukeun saluran nu urang ngalanggan. Upami kami nampi ping, kami nyebarkeun ping ieu. Upami kami nampi sababaraha jinis éntri, maka kami nyebarkeun éntri ieu ka sadaya palanggan Fanout ieu.

Kumaha Fan-out dianggo?

Dina basa Rusia ieu ditarjamahkeun salaku "splitter". Kami ngagaduhan hiji obyék anu ngadaptarkeun palanggan anu hoyong nampi sababaraha apdet. Sareng pas pembaruan dugi ka obyék ieu, éta nyebarkeun pembaruan ieu ka sadaya palangganna. Cukup basajan:

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Kumaha éta dilaksanakeun dina Go:

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Aya struktur, éta disingkronkeun nganggo Mutexes. Mibanda widang nu ngaheéat kaayaan sambungan Fanout kana databés, i.e. ayeuna dengekeun sarta bakal nampa apdet, kitu ogé daptar sadaya saluran sadia - peta, konci nu saluran jeung struct dina bentuk nilai (dasarna henteu dianggo dina cara naon waé).

Dua metodeu - Sambungkeun sareng Pegatkeun - ngamungkinkeun urang nyarios Fanout yén urang gaduh sambungan kana dasarna, éta parantos muncul sareng sambungan kana dasarna rusak. Dina kasus anu kadua, anjeun kedah pegatkeun sambungan sadaya klien sareng nyarioskeun aranjeunna yén aranjeunna henteu tiasa deui ngadangukeun naon waé sareng yén aranjeunna sambungkeun deui kusabab sambungan ka aranjeunna parantos ditutup.

Aya ogé metode Langganan anu nambihan saluran kana "pendengar":

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Aya metodeu Unsubscribe, anu ngaleungitkeun saluran tina pamirsa upami klien dipegatkeun, ogé metode Publikasikeun, anu ngamungkinkeun anjeun ngirim pesen ka sadaya palanggan.

Patarosan: – Naon anu dikirimkeun ngaliwatan saluran ieu?

IBU: – Modél nu geus robah atawa ping dikirimkeun (dasarna ngan hiji angka, integer).

IBU: - Anjeun tiasa ngirim naon waé, ngirim struktur naon waé, nyebarkeun éta - éta ngan ukur janten JSON sareng éta.

IBU: - Kami nampi béwara ti Postgres - éta ngandung nami méja sareng idéntifikasi. Dumasar nami tabel sarta identifier, urang meunang catetan urang butuh, lajeng urang ngirim struktur ieu publikasi.

infrastruktur

Kumaha ieu katingali tina sudut pandang infrastruktur? Urang boga 7 server hardware: salah sahijina sagemblengna dedicated ka database, genep séjén ngajalankeun mesin virtual. Aya 6 salinan API: unggal mesin virtual kalawan API dijalankeun dina server hardware misah - ieu pikeun reliabilitas.

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Simkuring gaduh dua frontends kalawan Keepalived dipasang pikeun ngaronjatkeun diakses, ku kituna lamun hal kajadian, hiji frontend bisa ngaganti séjén. Ogé - dua salinan CMS.

Aya ogé importir statistik. Aya Budak DB ti mana cadanganna dilakukeun sacara périodik. Aya Pigeon Pusher, aplikasi anu ngirimkeun bewara push ka klien, kitu ogé hal infrastruktur: Zabbix, Graylog2 sareng Chef.

Kanyataanna, infrastruktur ieu kaleuleuwihan, sabab 100 sarébu bisa dilayanan kalayan pangsaeutikna server. Tapi aya beusi - kami nganggo éta (kami ngawartoskeun yén éta mungkin - naha henteu).

Keunggulan Go

Saatos urang ngerjakeun aplikasi ieu, kaunggulan atra sapertos Go muncul.

  • Perpustakaan http tiis. Kalawan eta anjeun bisa nyieun cukup loba out of the box.
  • Tambih Deui, saluran anu ngamungkinkeun urang gampang pisan nerapkeun mékanisme pikeun ngirim bewara ka klien.
  • Hal éndah detektor Balap ngamungkinkeun urang ngaleungitkeun sababaraha bug kritis (infrastruktur pementasan). Sadayana anu dianggo dina pementasan diluncurkeun, disusun sareng konci Balapan; sarta kami, sasuai, bisa ningali dina infrastruktur pementasan pikeun ningali naon masalah poténsi urang boga.
  • Minimalisme sareng kesederhanaan basa.

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

Kami milarian pamekar! Bilih aya nu kersa, mangga.

patarosan

Patarosan ti panongton (hereinafter - B): - Sigana mah nu lasut hiji titik penting ngeunaan Fan-kaluar. Naha kuring leres ngartos yén nalika anjeun ngirim réspon ka klien, anjeun meungpeuk upami klien henteu hoyong maca?

IBU: - Henteu, kami henteu ngahalangan. Anu mimiti, urang gaduh sadayana ieu di tukangeun nginx, nyaéta, teu aya masalah sareng klien anu laun. Bréh, klien nu boga saluran kalawan panyangga a - kanyataanna, urang tiasa nempatkeun nepi ka saratus apdet aya ... Lamun urang teu bisa nulis ka saluran, lajeng ngahapus eta. Upami urang ningali yén saluran diblokir, maka urang ngan saukur nutup saluran, sareng éta - klien bakal nyambung deui upami aya masalah. Ku alatan éta, prinsipna mah teu aya blocking di dieu.

Dina: - Naha teu tiasa langsung ngirim rékaman ka Dengekeun / Bewara, sareng sanés méja idéntifikasi?

IBU: - Dengekeun / Bewara gaduh wates 8 rébu bait dina preload anu dikirimkeun. Sacara prinsip, éta bakal mungkin pikeun ngirim lamun urang keur kaayaan jumlah leutik data, tapi sigana kuring nu cara ieu [cara urang ngalakukeun eta] saukur leuwih dipercaya. Watesan aya dina Postgres sorangan.

Dina: - Naha konsumén nampi apdet ngeunaan patandingan anu aranjeunna henteu resep?

IBU: - Sacara umum, enya. Sakumaha aturan, aya 2-3 patandingan lumangsung dina paralel, komo lajeng rada jarang. Upami klien ningali hiji hal, maka biasana anjeunna ningali pertandingan anu lumangsung. Lajeng, klien nu boga database lokal kana nu sagala apdet ieu ditambahkeun up, komo tanpa sambungan Internet, klien nu bisa nempo sagala patandingan kaliwat nu manehna boga apdet. Intina, urang nyinkronkeun database urang dina server sareng database lokal klien supados anjeunna tiasa dianggo offline.

Dina: – Naha anjeun nyieun ORM sorangan?

Alexey (salah sahiji pamekar Look+): - Dina waktos éta (éta sataun katukang) aya kirang ORMs ti ayeuna, nalika aya rada loba. Hal favorit kuring ngeunaan paling ORMs kaluar aya nu kalobaannana ngajalankeun on interfaces kosong. Nyaéta, metodeu dina ORM ieu siap nyandak naon waé: struktur, penunjuk struktur, nomer, hal anu henteu relevan ...

ORM kami ngahasilkeun struktur dumasar kana modél data. Kuring sorangan. Sarta ku kituna sagala métode anu beton, teu make cerminan, jsb Aranjeunna nampa struktur jeung nyangka ngagunakeun eta struktur nu datang.

Dina: – Sabaraha jalma milu?

IBU: – Dina tahap awal, dua urang milu. Urang dimimitian wae dina Juni, sarta dina bulan Agustus bagian utama geus siap (versi munggaran). Aya release dina bulan Séptember.

Dina: – Dimana anjeun ngajelaskeun SSE, anjeun teu make timeout. Kunaon éta?

IBU: - Jujur, SSE masih protokol html5: standar SSE dirancang pikeun komunikasi sareng panyungsi, sajauh kuring ngartos. Éta ngagaduhan fitur tambahan supados panyungsi tiasa nyambung deui (sareng saterasna), tapi kami henteu peryogi aranjeunna, sabab kami ngagaduhan klien anu tiasa nerapkeun logika naon waé pikeun nyambungkeun sareng nampi inpormasi. Urang teu nyieun SSE, tapi rada hal sarupa SSE. Ieu sanés protokol sorangan.
Henteu aya kabutuhan. Sajauh kuring ngartos, klien ngalaksanakeun mékanisme sambungan ampir ti mimiti. Aranjeunna teu paduli.

Dina: – Utiliti tambahan naon anu anjeun anggo?

IBU: - Urang paling aktip ngagunakeun govet na golint sangkan gaya ngahiji, kitu ogé gofmt. Henteu aya anu sanés dianggo.

Dina: – Naon nu Anjeun pake pikeun debug?

IBU: - Debugging umumna dilaksanakeun nganggo tés. Kami henteu nganggo debugger atanapi GOP.

Dina: - Dupi anjeun balik slide dimana fungsi Nyebarkeun dilaksanakeun? Naha nami variabel hurup tunggal ngabingungkeun anjeun?

IBU: - Henteu. Aranjeunna gaduh wengkuan pisibilitas anu cukup "sempit". Aranjeunna teu dipaké mana sejenna iwal dieu (iwal internals kelas ieu), sarta eta pisan ci - ngan butuh 7 garis.

Dina: - Kumaha bae éta masih teu intuitif ...

IBU: - Henteu, henteu, ieu kode nyata! Ieu sanés ngeunaan gaya. Ieu ngan utilitarian, kelas leutik pisan - ngan 3 widang di jero kelas ...

Mikhail Salosin. Golang Meetup. Nganggo Go di tukangeun aplikasi Look+

IBU: - Sacara umum, sadaya data anu disingkronkeun sareng klien (pertandingan usum, pamaén) henteu robih. kasarna diomongkeun, lamun urang nyieun sejen olahraga nu urang kudu ngarobah patandingan, urang saukur bakal nyandak sagalana kana akun dina versi anyar tina klien nu, jeung versi heubeul tina klien bakal ngalarang.

Dina: - Naha aya bungkusan manajemén kagumantungan pihak katilu?

IBU: – Urang dipaké go dep.

Dina: - Aya hal ngeunaan video dina topik laporan, tapi aya nanaon dina laporan ngeunaan video.

IBU: - Henteu, kuring henteu ngagaduhan naon waé dina topik ngeunaan pidéo. Disebutna "Tingali +" - éta nami aplikasi.

Dina: - Anjeun nyarios yén éta dialirkeun ka klien?..

IBU: – Urang teu aub dina streaming video. Ieu sagemblengna dilakukeun ku Megafon. Leres, kuring henteu nyarios yén aplikasi éta MegaFon.

IBU: - Go - pikeun ngirim sadaya data - dina skor, dina acara pertandingan, statistik ... Go téh sakabéh backend pikeun aplikasi. Klién kedah terang ti mana waé link anu dianggo pikeun pamaén supados pangguna tiasa ningali pertandingan. Kami gaduh tautan kana pidéo sareng aliran anu parantos disiapkeun.

Sababaraha iklan 🙂

Hatur nuhun pikeun tetep sareng kami. Naha anjeun resep artikel kami? Hoyong ningali eusi anu langkung narik? Dukung kami ku cara nempatkeun pesenan atanapi nyarankeun ka babaturan, cloud VPS pikeun pamekar ti $4.99, analog unik tina server tingkat éntri, anu diciptakeun ku kami pikeun anjeun: Sakabeh bebeneran ngeunaan VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps ti $ 19 atanapi kumaha babagi server a? (sadia kalawan RAID1 na RAID10, nepi ka 24 cores sarta nepi ka 40GB DDR4).

Dell R730xd 2 kali langkung mirah dina puseur data Equinix nagara golongan IV di Amsterdam? Ngan di dieu 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV ti $199 di Walanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - ti $99! Baca ngeunaan Kumaha ngawangun Infrastruktur Corp. kelas kalawan pamakéan Dell R730xd E5-2650 v4 server patut 9000 euro pikeun Penny a?

sumber: www.habr.com

Tambahkeun komentar