Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Alexey Naidenov, Ketua Pegawai Eksekutif ITooLabs, bercakap tentang pembangunan platform telekomunikasi untuk pengendali telekomunikasi dalam bahasa pengaturcaraan Go (Golang). Alexey juga berkongsi pengalamannya menggunakan dan mengendalikan platform di salah satu pengendali telekom Asia terbesar, yang menggunakan platform itu untuk menyediakan perkhidmatan mel suara (VoiceMail) dan PBX Maya (Cloud PBX).

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Alexey Naydenov (selepas ini - AN): - Hai semua! Nama saya Alexey Naidenov. Saya pengarah ITooLabs. Pertama sekali, saya ingin menjawab apa yang saya lakukan di sini dan bagaimana saya berakhir di sini.

Jika anda melihat pada Pasaran Bitrix24 (bahagian "Telefoni"), maka 14 aplikasi dan 36 yang ada (40%) ialah kami:

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Lebih tepat lagi, ini adalah pengendali rakan kongsi kami, tetapi di sebalik semua ini adalah platform kami (Platform sebagai Perkhidmatan) - apa yang kami jual kepada mereka untuk sesen kecil. Sebenarnya, saya ingin bercakap tentang pembangunan platform ini dan bagaimana kami datang ke Go.

Nombor untuk platform kami sekarang ialah:

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

44 operator rakan kongsi, termasuk MegaFon. Secara umumnya, kami suka melakukan pengembaraan, dan kami sebenarnya mempunyai akses kepada 100 juta pelanggan daripada 44 pengendali di Rusia. Oleh itu, jika seseorang mempunyai beberapa idea perniagaan, kami sentiasa gembira untuk mendengarnya.

  • 5000 syarikat pengguna.
  • 20 pelanggan keseluruhannya. Ini semua b000b - kami hanya bekerja dengan syarikat.
  • 300 panggilan seminit pada siang hari.
  • 100 juta minit panggilan tahun lepas (kami raikan). Ini tanpa mengambil kira rundingan dalaman yang ada di platform kami.

Bagaimana ia bermula?

Bagaimanakah lelaki yang betul mula membuat platform mereka sendiri? Kita juga mesti mengambil kira bahawa kita mempunyai sejarah pembangunan "perusahaan tegar", malah pada masa yang paling tepat dalam setahun untuk sesebuah perusahaan! Ia adalah masa yang menggembirakan apabila anda datang kepada pelanggan dan berkata: "Kami memerlukan beberapa pelayan lagi." Dan pelanggan: "Ya, tidak ada soalan! Kami mempunyai sepuluh dalam rak.

Jadi kami melakukan Oracle, Java, WebSphere, Db2 dan semua itu. Oleh itu, kami telah mengambil, sudah tentu, penyelesaian vendor terbaik, menyepadukannya dan cuba menggunakannya. Mereka bermain sendiri. Ia akan menjadi permulaan dalaman.

Semuanya bermula pada tahun 2009. Sejak 2006, kami telah terlibat rapat dalam keputusan pengendali, satu cara atau yang lain. Kami membuat beberapa PBX maya tersuai (seperti yang kami sediakan sekarang): kami melihat, memutuskan bahawa ia bagus, dan memutuskan untuk mencetuskan permulaan dalaman.

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Ambil VMWare. Memandangkan kami berjalan sendiri, kami terpaksa segera meninggalkan Storan vendor yang hebat. Kami tahu semua tentang mereka: bahawa janji harus dibahagikan dengan 3, dan kos harus didarabkan dengan 10. Oleh itu, kami melakukan DirDB dan seterusnya.

Kemudian ia mula berkembang. Perkhidmatan pengebilan telah ditambahkan pada ini, kerana platform tidak lagi dapat mengatasinya. Kemudian pelayan pengebilan dari MySQL berpindah ke Mongo. Akibatnya, kami mendapat penyelesaian yang berfungsi yang memproses semua panggilan yang pergi ke sana:

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Tetapi di suatu tempat di sana, di dalam, produk vendor yang sama berputar - produk nuklear utama, yang pernah kami ambil. Kira-kira pada penghujung tahun 2011, kami menyedari sendiri bahawa halangan utama bagi kami, sudah tentu, adalah produk khusus ini - kami akan menghadapinya. Kami melihat dinding di hadapan kami, di mana kami berlari dengan pantas, semasa pelanggan berjalan, ditambah.
Sehubungan itu, kami terpaksa melakukan sesuatu. Sudah tentu, kami melakukan banyak penyelidikan tentang pelbagai produk - sumber terbuka dan vendor. Saya tidak akan membincangkan perkara ini sekarang - bukan itu maksudnya. Langkah terakhir yang kami fikirkan ialah membuat platform kami sendiri.

Akhirnya, kami sampai kepada pilihan ini. kenapa? Kerana semua vendor dan produk sumber terbuka dibuat untuk menyelesaikan masalah 10 tahun lalu. Nah, jika kanak-kanak berumur 10 tahun, dan beberapa lagi! Pilihan telah menjadi jelas bagi kami: sama ada kami mengucapkan selamat tinggal kepada idea hebat kami tentang perkhidmatan yang ideal (untuk rakan kongsi, pengendali dan diri kami sendiri), atau kami melakukan sesuatu sendiri.

Kami memutuskan untuk melakukan sesuatu yang berbeza!

Keperluan Platform

Jika anda melakukan sesuatu untuk masa yang lama (anda mengeksploitasi produk orang lain), maka pemikiran perlahan-lahan terbentuk di kepala anda: bagaimana saya akan melakukannya sendiri? Memandangkan kami semua pengaturcara dalam syarikat (kecuali penjual, tiada bukan pengaturcara), keperluan kami telah dibentuk untuk masa yang lama, dan ia jelas:

  1. Kelajuan pembangunan tinggi. Produk vendor, yang menyiksa kami, tidak sesuai dengan kami pada mulanya kerana semuanya berjalan lama dan perlahan. Kami mahu cepat - kami mempunyai banyak idea! Kami masih mempunyai banyak idea, tetapi senarai idea itu kelihatan seperti sepuluh tahun ke hadapan. Sekarang hanya untuk setahun.
  2. Penggunaan maksimum besi berbilang teras. Ini juga penting bagi kami, kerana kami melihat bahawa hanya akan ada lebih banyak teras.
  3. Kebolehpercayaan yang tinggi. Yang kami menangis juga.
  4. Toleransi kesalahan yang tinggi.
  5. Kami mahu menamatkan proses keluaran harian. Untuk melakukan ini, kami memerlukan pilihan bahasa.

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Sehubungan itu, daripada keperluan untuk produk yang telah kami persembahkan untuk diri kami sendiri, keperluan untuk bahasa itu berkembang dengan cara yang jelas logik.

  1. Jika kita mahukan sokongan untuk sistem berbilang teras, maka kita memerlukan sokongan untuk pelaksanaan selari.
  2. Jika kita memerlukan kelajuan pembangunan, kita memerlukan bahasa yang menyokong pembangunan kompetitif, pengaturcaraan kompetitif. Jika sesiapa tidak menemui perbezaannya, maka ia sangat mudah:
    • pengaturcaraan selari adalah tentang bagaimana dua benang berbeza berjalan pada teras yang berbeza;
    • pelaksanaan serentak, lebih khusus sokongan serentak, adalah tentang cara bahasa (atau masa jalan, apa sahaja) membantu menyembunyikan semua kerumitan yang datang daripada pelaksanaan selari.
  3. Kestabilan yang tinggi. Jelas sekali, kami memerlukan kluster, dan ia lebih baik daripada yang kami ada pada produk vendor.

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Kami tidak mempunyai banyak pilihan, jika anda masih ingat. Pertama, Erlang - kami menyukainya dan mengetahuinya, ia adalah kegemaran peribadi saya. Kedua, Java bukanlah Java, tetapi khususnya Scala. Ketiga, bahasa yang pada masa itu kita tidak tahu langsung - Pergi. Ia baru sahaja muncul ketika itu, lebih tepat lagi, ia telah wujud selama kira-kira dua tahun, tetapi masih belum dikeluarkan.

Tewas Go!

Sejarah Go

Kami membuat platform di atasnya. Saya akan cuba menerangkan sebabnya.

Sejarah Ringkas Go. Bermula pada tahun 2007, dibuka pada tahun 2009, versi pertama dikeluarkan pada tahun 2012 (iaitu, kami mula bekerja walaupun sebelum keluaran pertama). Pemula ialah Google, yang ingin menggantikan, seperti yang saya syak, Java.

Pengarangnya sangat terkenal:

  • Ken Thomson, yang berada di belakang Unix, mencipta UTF-8, bekerja pada sistem Plan 9;
  • Rob Pike, yang mereka bentuk UTF-8 dengan Ken, juga bekerja pada Plan 9, Inferno, Limbo di Bell Labs;
  • Robert Gizmer, yang kami kenali dan sukai kerana mencipta Java HotSpot Compiler dan bekerja pada penjana dalam V8 (jurubahasa Javascript Google);
  • Dan lebih 700 penyumbang, termasuk beberapa tampalan kami.

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Pergi sepintas lalu

Kami melihat bahawa bahasa itu lebih kurang mudah dan difahami. Kami mempunyai jenis yang jelas: dalam sesetengah kes mereka perlu diisytiharkan, dalam kes lain mereka tidak (bermakna jenis itu disimpulkan juga).

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Ia boleh dilihat bahawa ia adalah bergaya untuk menggambarkan struktur. Ia boleh dilihat bahawa kita mempunyai konsep penunjuk (di mana asterisk berada). Ia boleh dilihat bahawa terdapat sokongan khas untuk mengisytiharkan permulaan tatasusunan dan tatasusunan bersekutu.

Secara kasar boleh difahami - anda boleh hidup. Cuba menulis Hello, world:

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Apa yang kita nampak? Ini adalah sintaks seperti C, koma bertitik adalah pilihan. Ia boleh menjadi pemisah untuk dua baris, tetapi hanya jika ini adalah dua binaan yang betul-betul berada pada baris yang sama.

Kami melihat bahawa kurungan dalam struktur kawalan (pada baris ke-14) adalah pilihan, tetapi yang kerinting sentiasa diperlukan. Kami melihat bahawa penaipan adalah statik. Tim dalam kebanyakan kes dipaparkan. Contoh ini lebih rumit sedikit daripada Hello, dunia biasa - hanya untuk menunjukkan bahawa terdapat perpustakaan.

Apa lagi yang kita nampak penting? Kod itu disusun ke dalam pakej. Dan untuk menggunakan pakej dalam kod anda sendiri, anda perlu mengimportnya menggunakan arahan import - ini juga penting. Kami mula - ia berfungsi. Hebat!

Mari cuba sesuatu yang lebih rumit: Hello, dunia, tetapi kini ia adalah pelayan http. Apa yang kita nampak menarik di sini?

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Pertama, fungsi bertindak sebagai parameter. Ini bermakna fungsi yang kami ada ialah "warganegara kelas pertama" dan anda boleh melakukan banyak perkara menarik dengannya dalam gaya berfungsi. Kami melihat perkara yang tidak dijangka seterusnya: arahan import merujuk terus kepada repositori GitHub. Betul, begitulah keadaannya - lebih-lebih lagi, itulah yang sepatutnya dilakukan.

Dalam Go, pengecam universal pakej ialah url repositorinya. Terdapat utiliti Goget khas yang digunakan untuk semua kebergantungan, memuat turunnya, memasangnya, menyusunnya dan menyediakannya untuk digunakan jika perlu. Pada masa yang sama, Goget tahu tentang html-meta. Sehubungan itu, anda boleh menyimpan direktori http, yang akan mengandungi pautan ke repositori khusus anda (seperti yang kami, sebagai contoh, lakukan).

Apa lagi yang kita nampak? Http dan Json dalam perpustakaan biasa. Terdapat, jelas, introspeksi - refleksi, yang harus digunakan dalam pengekodan / json, kerana kita hanya menggantikan beberapa objek sewenang-wenangnya untuknya.

Kami menjalankannya dan melihat bahawa kami mempunyai 20 baris kod berguna yang menyusun, menjalankan dan memberikan beban purata semasa mesin (pada mesin di mana ia berjalan).
Apa lagi yang penting daripada apa yang dapat kita lihat dengan segera di sini? Ia menyusun menjadi satu binari statik (buinary). Binari ini tidak mempunyai kebergantungan sama sekali, tiada perpustakaan! Ia boleh disalin ke mana-mana sistem, jalankan serta-merta, dan ia akan berfungsi.

Bergerak.

Pergi: kaedah dan antara muka

Pergi mempunyai kaedah. Anda boleh mengisytiharkan kaedah untuk sebarang jenis tersuai. Selain itu, ini tidak semestinya struktur, tetapi mungkin alias untuk beberapa jenis. Anda boleh mengisytiharkan alias untuk N32 dan menulis kaedah untuknya melakukan sesuatu yang berguna.

Dan di sinilah kita jatuh terpinga-pinga buat kali pertama ... Ternyata Go tidak mempunyai kelas seperti itu. Mereka yang mengenali Go mungkin mengatakan bahawa terdapat kemasukan jenis, tetapi ini berbeza sama sekali. Lebih cepat pembangun berhenti menganggapnya sebagai warisan, lebih baik. Tiada kelas dalam Go, dan tiada warisan juga.

Soalan! Apakah yang diberikan oleh syarikat pengarang yang diketuai oleh Google kepada kami untuk memaparkan kerumitan dunia? Kami telah diberi antara muka!

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

Antara muka ialah jenis khas yang membolehkan anda menulis kaedah mudah, tandatangan kaedah. Selanjutnya, apa-apa jenis yang kaedah ini wujud (dilaksanakan) akan sepadan dengan antara muka ini. Ini bermakna anda hanya boleh menulis fungsi yang sepadan untuk satu jenis, untuk yang lain (yang sepadan dengan jenis antara muka itu). Seterusnya, isytiharkan pembolehubah jenis antara muka ini dan tetapkan mana-mana objek ini kepadanya.

Untuk peminat tegar, saya boleh katakan bahawa pembolehubah ini sebenarnya akan mengandungi dua petunjuk: satu kepada data, satu lagi kepada jadual deskriptor khas yang khusus untuk jenis tertentu ini, kepada antara muka jenis ini. Iaitu, pengkompil membuat jadual deskriptor sedemikian pada masa memaut.

Dan sudah tentu, terdapat petunjuk untuk batal dalam Go. Antara muka perkataan {} (dengan dua pendakap kerinting) ialah pembolehubah yang membolehkan anda menunjuk ke mana-mana objek sama sekali pada dasarnya.
Setakat ini, semuanya teratur, semuanya biasa. Tiada apa yang mengejutkan.

Pergi: goroutines

Sekarang kita sampai kepada perkara yang kita minati: proses ringan - gorouti (gorouti) dalam terminologi Go.

Alexey Naidenov. ITooLabs. Kes pembangunan pada platform telefon Go (Golang). Bahagian 1

  1. Pertama, ia benar-benar ringan (kurang daripada 2 Kb).
  2. Kedua, kos untuk mencipta goroutine sedemikian boleh diabaikan: anda boleh mencipta seribu daripadanya sesaat - tiada apa yang akan berlaku.
  3. Mereka dilayan oleh penjadual mereka sendiri, yang hanya memindahkan kawalan dari satu goroutine ke yang lain.
  4. Dalam kes ini, kawalan dipindahkan dalam kes berikut:
    • jika kenyataan go ditemui (jika goroutine memulakan goroutine seterusnya);
    • jika panggilan Input/Keluar yang menyekat didayakan;
    • jika kutipan sampah dicetuskan;
    • jika beberapa operasi dengan saluran dimulakan.

Iaitu, apabila program Go dijalankan pada komputer, ia mengesan bilangan teras dalam sistem, memulakan seberapa banyak utas yang diperlukan (berapa banyak teras yang ada pada sistem atau berapa banyak yang anda suruh). Sehubungan itu, penjadual akan menjalankan urutan pelaksanaan yang ringan ini pada semua rangkaian sistem pengendalian ini dalam setiap teras.

Perlu diingatkan bahawa ini adalah cara yang paling berkesan untuk menggunakan besi. Sebagai tambahan kepada apa yang telah kami tunjukkan, kami melakukan lebih banyak lagi. Kami membuat, sebagai contoh, sistem DPI yang membenarkan penyajian 40 gigabit dalam satu unit (bergantung pada apa yang berlaku dalam talian ini).

Di sana, walaupun sebelum Go, kami menggunakan skema yang sama untuk sebab ini: kerana ia membolehkan anda menyimpan lokaliti cache pemproses, dengan ketara mengurangkan bilangan suis konteks OS (yang juga mengambil masa yang sangat lama). Saya ulangi: ini adalah cara yang paling berkesan untuk menggunakan besi.

Contoh 21 baris mudah ini ialah contoh yang hanya melakukan echo-server. Pada masa yang sama, ambil perhatian bahawa fungsi servis adalah sangat mudah, ia adalah linear. Tiada panggilan balik, tidak perlu bersusah payah dan berfikir... Anda hanya membaca dan menulis!

Pada masa yang sama, jika anda membaca dan menulis, ia sepatutnya menyekat - goroutine ini hanya beratur dan diambil oleh penjadual apabila pelaksanaan menjadi mungkin semula. Iaitu, kod mudah ini boleh bertindak sebagai pelayan gema untuk seberapa banyak sambungan yang dibenarkan oleh OS pada mesin ini.

Akan diteruskan tidak lama lagi...

Beberapa iklan πŸ™‚

Terima kasih kerana tinggal bersama kami. Adakah anda suka artikel kami? Ingin melihat kandungan yang lebih menarik? Sokong kami dengan membuat pesanan atau mengesyorkan kepada rakan, cloud VPS untuk pembangun dari $4.99, analog unik pelayan peringkat permulaan, yang kami cipta untuk anda: Keseluruhan kebenaran tentang VPS (KVM) E5-2697 v3 (6 Teras) 10GB DDR4 480GB SSD 1Gbps daripada $19 atau bagaimana untuk berkongsi pelayan? (tersedia dengan RAID1 dan RAID10, sehingga 24 teras dan sehingga 40GB DDR4).

Dell R730xd 2 kali lebih murah di pusat data Equinix Tier IV di Amsterdam? Hanya disini 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV daripada $199 di Belanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - daripada $99! Baca tentang Bagaimana untuk membina infrastruktur corp. kelas dengan penggunaan pelayan Dell R730xd E5-2650 v4 bernilai 9000 euro untuk satu sen?

Sumber: www.habr.com

Tambah komen