Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Alexey Naidenov, CEO ITooLabs, ngomong babagan pangembangan platform telekomunikasi kanggo operator telekomunikasi ing basa pamrograman Go (Golang). Alexey uga nuduhake pengalaman nyebarake lan ngoperasikake platform kasebut ing salah sawijining operator telekomunikasi paling gedhe ing Asia, sing nggunakake platform kasebut kanggo nyedhiyakake layanan surat swara (VoiceMail) lan Virtual PBX (Cloud PBX).

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Alexey Naydenov (sabanjuré - AN): - Halo kabeh! Jenengku Alexey Naidenov. Aku direktur ITooLabs. Kaping pisanan, aku pengin mangsuli apa sing daklakoni ing kene lan kepiye kedadeyane ing kene.

Yen sampeyan ndeleng Pasar Bitrix24 (bagean "Telepon"), mula 14 aplikasi lan 36 sing ana (40%) yaiku:

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Luwih tepate, iki minangka operator mitra, nanging ing mburi kabeh iki ana platform (Platform minangka Layanan) - apa sing didol karo dhuwit cilik. Bener, aku pengin ngomong babagan pangembangan platform iki lan kepiye kita teka ing Go.

Nomer kanggo platform kita saiki yaiku:

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

44 operator partner, kalebu MegaFon. Umumé, kita seneng ngulandara, lan kita duwe akses menyang 100 yuta pelanggan saka 44 operator ing Rusia. Mula, yen ana wong sing duwe ide bisnis, kita mesthi seneng ngrungokake.

  • 5000 perusahaan pangguna.
  • 20 pelanggan total. Iku kabeh b000b - kita mung bisa karo perusahaan.
  • 300 telpon saben menit sak dina.
  • 100 yuta menit telpon taun kepungkur (kita ngrayakake). Iki tanpa nganggep negosiasi internal sing ana ing platform kita.

Kepriye wiwitane?

Kepiye carane wong lanang sing bener miwiti nggawe platform dhewe? Sampeyan uga kudu dianggep manawa kita duwe sejarah pangembangan "perusahaan tegar", lan malah ing wektu sing paling akurat ing taun kanggo perusahaan! Iku wektu seneng nalika sampeyan teka menyang customer lan ngandika: "We need sawetara server liyane." Lan pelanggan: "Ya, ora ana pitakonan! Kita duwe sepuluh ing rak.

Dadi, kita nindakake Oracle, Java, WebSphere, Db2 lan liya-liyane. Mulane, kita njupuk, mesthi, solusi vendor paling apik, Integrasi lan nyoba kanggo njupuk mati karo. Dheweke main dhewe. Iku bakal dadi wiwitan internal.

Iku kabeh diwiwiti ing 2009. Wiwit 2006, kita wis melu rapet ing pancasan operator, siji cara utawa liyane. We digawe sawetara PBXs virtual adat (kaya apa kita saiki ing urutan): kita katon, mutusaké sing apik, lan mutusaké kanggo nglakoake wiwitan internal.

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Njupuk VMWare. Awit kita mlaku dhewe, kita kudu langsung nilar Storage vendor kelangan. Kita ngerti kabeh babagan: janji kasebut kudu dibagi 3, lan biaya kudu dikali 10. Mulane, kita nindakake DirDB lan liya-liyane.

Banjur wiwit tuwuh. Layanan tagihan ditambahake, amarga platform kasebut ora bisa ngatasi maneh. Banjur server tagihan saka MySQL dipindhah menyang Mongo. Akibaté, kita entuk solusi sing bisa ngolah kabeh telpon sing ana ing kana:

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Nanging ing endi wae, ing njero, produk vendor sing padha muter - sing utama, nuklir, sing nate dijupuk. Kira-kira ing pungkasan taun 2011, kita nyadari yen kemacetan utama kanggo kita, mesthi, bakal dadi produk tartamtu - kita bakal nemoni. Kita weruh tembok ing ngarep kita, menyang kang kita mlayu ing gallop lengkap, minangka pelanggan mlaku, ditambahake.
Patut, kita kudu nindakake soko. Mesthi wae, kita nindakake riset akeh babagan macem-macem produk - sumber terbuka lan vendor. Aku ora bakal mikir babagan iki saiki - dudu titik kasebut. Kemunduran pungkasan sing kita pikirake yaiku nggawe platform kita dhewe.

Wekasane, kita teka ing pilihan iki. Kenging punapa? Amarga kabeh vendor lan produk open source digawe kanggo ngatasi masalah 10 taun kepungkur. Inggih, yen 10 taun, lan sawetara liyane! Pilihan wis jelas kanggo kita: kita ngucapake pamit kanggo ide apik babagan layanan sing cocog (kanggo mitra, operator lan awake dhewe), utawa kita nindakake apa-apa saka awake dhewe.

Kita mutusake kanggo nindakake sing beda!

Syarat Platform

Yen sampeyan nindakake apa-apa kanggo wektu sing suwe (sampeyan ngeksploitasi produk wong liya), banjur pikirane alon-alon muncul ing sirahmu: kepiye carane aku nindakake dhewe? Amarga kita kabeh programer ing perusahaan (kajaba adol, ora ana sing ora programer), syarat kita wis suwe dibentuk, lan padha jelas:

  1. Kacepetan pangembangan dhuwur. Produk vendor, sing nyiksa kita, mula ora cocog karo kita amarga kabeh wis suwe lan alon-alon. We wanted cepet - kita wis akèh gagasan! Kita isih duwe akeh gagasan, nanging banjur dhaptar gagasan kaya sing katon kaya sepuluh taun ngarep. Saiki mung setaun.
  2. Panggunaan maksimal wesi multi-inti. Iki uga penting kanggo kita, amarga kita weruh sing mung bakal ana liyane lan liyane intine.
  3. linuwih dhuwur. Sing kita nangis uga.
  4. Toleransi kesalahan dhuwur.
  5. We wanted kanggo mungkasi munggah karo proses release saben dina. Kanggo nindakake iki, kita butuh pilihan basa.

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Mula saka syarat-syarat produk sing wis disedhiyakake kanggo awake dhewe, syarat kanggo basa kasebut tuwuh kanthi logis kanthi jelas.

  1. Yen kita pengin dhukungan kanggo sistem multi-inti, mula kita butuh dhukungan kanggo eksekusi paralel.
  2. Yen kita butuh kacepetan pangembangan, kita butuh basa sing ndhukung pangembangan kompetitif, pemrograman kompetitif. Yen ana sing durung nemoni bedane, mula gampang banget:
    • pemrograman paralel babagan carane rong utas beda mbukak ing inti sing beda;
    • eksekusi bebarengan, luwih khusus support concurrency, bab carane basa (utawa runtime, apa wae) mbantu ndhelikake kabeh kerumitan sing teka saka eksekusi paralel.
  3. stabilitas dhuwur. Temenan, kita butuh kluster, lan luwih apik tinimbang sing ana ing produk vendor.

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Kita ora duwe akeh pilihan, yen sampeyan ngelingi. Kaping pisanan, Erlang - kita seneng lan ngerti, iki minangka favorit pribadiku. Kapindho, Jawa iku dudu Jawa, nanging khususe Scala. Katelu, basa sing nalika iku kita ora ngerti babar pisan - Go. Mung banjur katon, luwih tepate, wis ana watara rong taun, nanging durung dirilis.

Ngalahake Go!

Riwayat Go

Kita nggawe platform ing. Aku bakal nyoba kanggo nerangake apa.

Sejarah Singkat Go. Diwiwiti ing 2007, dibukak ing 2009, versi pisanan dirilis ing 2012 (yaiku, kita wiwit makarya malah sadurunge release pisanan). Inisiator yaiku Google, sing pengin ngganti, kaya aku curiga, Jawa.

Penulis banget misuwur:

  • Ken Thomson, sing konco Unix, nemokke UTF-8, makarya ing Plan 9 sistem;
  • Rob Pike, sing dirancang UTF-8 karo Ken, uga makarya ing Plan 9, Inferno, Limbo ing Bell Labs;
  • Robert Gizmer, sing kita kenal lan tresna kanggo nyiptakake Java HotSpot Compiler lan nggarap generator ing V8 (Javascript interpreter Google);
  • Lan luwih saka 700 kontributor, kalebu sawetara patch kita.

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Go ing Mirit

Kita weruh yen basa kasebut luwih utawa kurang prasaja lan bisa dingerteni. Kita duwe jinis sing jelas: ing sawetara kasus kudu diumumake, ing liyane ora (tegese jinis kasebut disimpulake).

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Bisa dideleng manawa modis kanggo nggambarake struktur. Bisa dideleng yen kita duwe konsep pointer (endi tanda bintang). Bisa dideleng manawa ana dhukungan khusus kanggo ngumumake initialization array lan array asosiatif.

Kira-kira bisa dingerteni - sampeyan bisa urip. Nyoba nulis Hello, world:

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Apa sing kita deleng? Iki minangka sintaks kaya C, titik koma iku opsional. Bisa dadi separator kanggo rong baris, nanging mung yen iki rong konstruksi sing persis ing baris sing padha.

Kita weruh yen kurung ing struktur kontrol (ing baris 14) opsional, nanging kriting tansah dibutuhake. Kita weruh manawa ngetik kasebut statis. Tim ing paling kasus ditampilake. Conto iki rada luwih rumit tinimbang Hello biasa, donya - mung kanggo nuduhake yen ana perpustakaan.

Apa liyane sing kita deleng penting? Kode kasebut diatur dadi paket. Lan supaya bisa nggunakake paket kasebut ing kode sampeyan dhewe, sampeyan kudu ngimpor kanthi nggunakake arahan impor - iki uga penting. Kita miwiti - kerjane. apik tenan!

Ayo nyoba sing luwih rumit: Halo, donya, nanging saiki dadi server http. Apa sing katon menarik ing kene?

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Kaping pisanan, fungsi kasebut minangka parameter. Iki tegese fungsi sing kita duwe minangka "warga kelas kapisan" lan sampeyan bisa nindakake akeh perkara sing menarik kanthi gaya fungsional. Kita ndeleng sing ora dikarepke sabanjure: arahan impor nuduhake langsung menyang repositori GitHub. Bener, kaya ngono - apa maneh sing kudu ditindakake.

Ing Go, pengenal universal paket yaiku url saka repositori. Ana utilitas Goget khusus sing digunakake kanggo kabeh dependensi, ngundhuh, nginstal, nyusun, lan nyiapake yen perlu. Ing wektu sing padha, Goget ngerti babagan html-meta. Mulane, sampeyan bisa nyimpen direktori http, sing bakal ngemot pranala menyang repositori tartamtu (kaya kita, contone,).

Apa maneh sing kita deleng? Http lan Json ing perpustakaan biasa. Ana, temenan, introspeksi - refleksi, sing kudu digunakake ing enkoding / json, amarga kita mung ngganti sawetara obyek sing sewenang-wenang.

We mbukak lan ndeleng sing kita duwe 20 baris kode migunani sing compiles, mlaku lan menehi beban rata-rata saiki saka mesin (ing mesin kang lagi mlaku).
Apa maneh sing penting saka apa sing bisa langsung kita deleng ing kene? Iku compiles dadi siji statis binar (buinary). Binar iki ora duwe dependensi, ora ana perpustakaan! Bisa disalin menyang sistem apa wae, langsung mbukak, lan bakal bisa digunakake.

We nerusake.

Go: cara lan antarmuka

Go duwe metode. Sampeyan bisa ngumumake cara kanggo jinis khusus apa wae. Menapa malih, iki ora kudu struktur, nanging bisa uga minangka alias saka sawetara jinis. Sampeyan bisa wara-wara alias kanggo N32 lan nulis cara kanggo nindakake soko migunani.

Lan iki ngendi kita tiba menyang stupor kanggo pisanan ... Pranyata metu sing Go ora duwe kelas kaya kuwi. Sing ngerti Go bisa uga ujar manawa ana jinis inklusi, nanging iki beda banget. Sing luwih cepet pangembang mandheg mikirake minangka warisan, luwih apik. Ora ana kelas ing Go, lan uga ora ana warisan.

Pitakonan! Apa perusahaan penulis sing dipimpin Google menehi kita supaya bisa nampilake kerumitan donya? Kita wis diwenehi antarmuka!

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

Antarmuka minangka jinis khusus sing ngidini sampeyan nulis cara sing gampang, tanda tangan metode. Salajengipun, jinis apa wae sing ana metode kasebut (dieksekusi) bakal cocog karo antarmuka iki. Iki tegese sampeyan mung bisa nulis fungsi sing cocog kanggo siji jinis, kanggo liyane (sing cocog karo jinis antarmuka kasebut). Sabanjure, wara-wara variabel saka jinis antarmuka iki lan nemtokake samubarang obyek kasebut.

Kanggo penggemar hardcore, aku bisa ngomong sing variabel iki bener bakal ngemot loro penunjuk: siji kanggo data, liyane kanggo tabel deskriptor khusus sing khusus kanggo jinis tartamtu iki, kanggo antarmuka saka jinis iki. Tegese, kompiler nggawe tabel deskriptor kasebut nalika ngubungake.

Lan mesthi ana pitunjuk kanggo roso sepi ing Go. Antarmuka tembung {} (karo rong kurung kriting) minangka variabel sing ngidini sampeyan ngarahake obyek apa wae ing prinsip.
Nganti saiki, kabeh wis rapi, kabeh wis akrab. Ora ana sing nggumunake.

Go: goroutine

Saiki kita tekan apa sing dikarepake: proses entheng - goroutine (goroutine) ing terminologi Go.

Alexey Naidenov. ITooLabs. Kasus pangembangan ing platform telpon Go (Golang). Bagean 1

  1. Kaping pisanan, bobote pancen entheng (kurang saka 2 Kb).
  2. Kapindho, biaya nggawe goroutine kuwi bisa diabaikan: sampeyan bisa nggawe sewu saben detik - ora ana sing bakal kelakon.
  3. Padha dilayani dening panjadwal dhewe, sing mung nransfer kontrol saka siji goroutine menyang liyane.
  4. Ing kasus iki, kontrol ditransfer ing kasus ing ngisor iki:
    • yen pratelan go ditemoni (yen goroutine miwiti goroutine sabanjure);
    • yen telpon Input/Out pamblokiran diaktifake;
    • yen pengumpulan sampah dipicu;
    • yen sawetara operasi karo saluran diwiwiti.

Sing, saben program Go mbukak ing komputer, ndeteksi nomer intine ing sistem, miwiti minangka akeh Utas minangka needed (pinten intine ing sistem, utawa carane akeh sampeyan marang kanggo). Dadi, panjadwal bakal mbukak utas eksekusi sing entheng iki ing kabeh utas sistem operasi kasebut ing saben inti.

Perlu dicathet yen iki minangka cara sing paling efisien kanggo nggunakake wesi. Saliyane apa sing wis ditampilake, kita nindakake luwih akeh. Kita nggawe, contone, sistem DPI sing ngidini porsi 40 gigabit ing siji unit (gumantung saka apa sing kedadeyan ing garis kasebut).

Ing kana, sanajan sadurunge Go, kita nggunakake skema sing padha kanggo alasan iki: amarga ngidini sampeyan nyimpen lokalitas cache prosesor, kanthi signifikan nyuda jumlah switch konteks OS (sing uga butuh wektu sing suwe). Aku mbaleni: iki cara sing paling efektif kanggo nggunakake wesi.

Conto 21-baris prasaja iki minangka conto sing mung nindakake echo-server. Ing wektu sing padha, elinga yen fungsi ngawula iku arang banget prasaja, iku linear. Ora ana callback, ora perlu repot lan mikir ... Sampeyan mung maca lan nulis!

Ing wektu sing padha, yen sampeyan maca lan nulis, mesthine mblokir - goroutine iki mung antri lan dijupuk dening panjadwal nalika eksekusi bisa maneh. Sing, kode prasaja iki bisa tumindak minangka server kumandhang kanggo akeh sambungan minangka OS ing mesin iki bakal ngidini.

Diterusake kanthi cepet ...

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