Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Alexei Naidenov, CEO ITooLabs, membahas tentang pengembangan platform telekomunikasi untuk operator telekomunikasi dalam bahasa pemrograman Go (Golang). Alexei juga berbagi pengalamannya menerapkan dan mengoperasikan platform ini di salah satu operator telekomunikasi terbesar di Asia, yang menggunakan platform tersebut untuk menyediakan layanan pesan suara (VoiceMail) dan Virtual PBX (Cloud PBX).

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Alexei Naydenov (selanjutnya - AN): - Halo semua! Nama saya Alexei Naidenov. Saya adalah direktur ITooLabs. Pertama-tama, saya ingin menjawab apa yang saya lakukan di sini dan bagaimana saya bisa sampai di sini.

Jika melihat Marketplace Bitrix24 (bagian "Telephony"), maka 14 aplikasi dan 36 yang ada (40%) adalah kami:

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Lebih tepatnya, ini adalah operator mitra kami, tetapi di balik semua ini adalah platform kami (Platform as a Service) - apa yang kami jual kepada mereka dengan harga murah. Sebenarnya, saya ingin berbicara tentang perkembangan platform ini dan bagaimana kami sampai pada Go.

Nomor untuk platform kami sekarang adalah:

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

44 operator mitra, termasuk MegaFon. Secara umum, kami senang melakukan petualangan, dan kami sebenarnya memiliki akses ke 100 juta pelanggan dari 44 operator di Rusia. Oleh karena itu, jika seseorang mempunyai ide bisnis, kami selalu dengan senang hati mendengarkannya.

  • 5000 perusahaan pengguna.
  • Total 20 pelanggan. Semuanya b000b - kami hanya bekerja dengan perusahaan.
  • 300 panggilan per menit di siang hari.
  • 100 juta menit panggilan tahun lalu (kami merayakannya). Ini belum termasuk negosiasi internal yang ada di platform kami.

Bagaimana awalnya?

Bagaimana cara orang-orang yang tepat mulai membuat platform mereka sendiri? Kita juga harus memperhitungkan bahwa kita memiliki sejarah perkembangan "perusahaan keras", dan bahkan pada waktu yang paling akurat dalam setahun untuk sebuah perusahaan! Itu adalah saat yang membahagiakan ketika Anda mendatangi pelanggan dan berkata: "Kami membutuhkan beberapa server lagi." Dan pelanggan: β€œYa, tidak ada pertanyaan! Kami punya sepuluh di rak.

Jadi kami menggunakan Oracle, Java, WebSphere, Db2 dan sebagainya. Oleh karena itu, kami tentu saja mengambil solusi vendor terbaik, mengintegrasikannya dan mencoba untuk lepas landas. Mereka bermain sendiri. Ini akan menjadi startup internal.

Semuanya dimulai pada tahun 2009. Sejak tahun 2006, kami telah terlibat erat dalam pengambilan keputusan operator, dengan satu atau lain cara. Kami membuat beberapa PBX virtual khusus (seperti yang sekarang kami pesan): kami melihat, memutuskan bahwa itu bagus, dan memutuskan untuk memulai startup internal.

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Ambil VMWare. Karena kami berjalan sendiri, kami harus segera meninggalkan vendor Storage yang keren. Kami tahu segalanya tentang mereka: janji harus dibagi 3, dan biayanya harus dikalikan 10. Oleh karena itu, kami melakukan DirDB dan seterusnya.

Kemudian mulai tumbuh. Layanan penagihan ditambahkan ke dalamnya, karena platform tidak dapat lagi mengatasinya. Kemudian billing server dari MySQL dipindahkan ke Mongo. Hasilnya, kami mendapat solusi berfungsi yang memproses semua panggilan yang masuk ke sana:

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Namun di suatu tempat di dalam, produk vendor yang sama berputar - produk nuklir utama yang pernah kami ambil. Kira-kira pada akhir tahun 2011, kami menyadari sendiri bahwa hambatan utama bagi kami, tentu saja, adalah produk khusus ini - kami akan menemuinya. Kami melihat tembok di depan kami, tempat kami berlari dengan kecepatan penuh, saat pelanggan berjalan, ditambahkan.
Oleh karena itu, kami harus melakukan sesuatu. Tentu saja, kami melakukan cukup banyak riset terhadap berbagai produk - baik yang open source maupun vendor. Saya tidak akan memikirkan hal ini sekarang - bukan itu intinya. Langkah terakhir yang kami pikirkan adalah membuat platform kami sendiri.

Pada akhirnya, kami sampai pada pilihan ini. Mengapa? Karena semua produk vendor dan open source dibuat untuk memecahkan masalah 10 tahun yang lalu. Nah, jika berusia 10 tahun, dan masih banyak lagi! Pilihannya menjadi jelas bagi kami: apakah kami mengucapkan selamat tinggal pada ide hebat kami tentang layanan yang ideal (untuk mitra, operator, dan diri kami sendiri), atau kami melakukan sesuatu sendiri.

Kami memutuskan untuk melakukan sesuatu yang berbeda!

Persyaratan Platform

Jika Anda melakukan sesuatu dalam waktu yang lama (Anda mengeksploitasi produk orang lain), maka perlahan-lahan muncul pemikiran di kepala Anda: bagaimana saya akan melakukannya sendiri? Karena kami semua adalah pemrogram di perusahaan (kecuali penjual, tidak ada non-pemrogram), persyaratan kami telah dibentuk sejak lama, dan jelas:

  1. Kecepatan pengembangan yang tinggi. Produk vendor yang menyiksa kami pada awalnya tidak cocok untuk kami karena semuanya berjalan lama dan lambat. Kami ingin cepat – kami punya banyak ide! Kami masih punya banyak ide, tapi daftar idenya sedemikian rupa sehingga terasa seperti sepuluh tahun ke depan. Sekarang hanya untuk satu tahun.
  2. Pemanfaatan besi multi-inti secara maksimal. Ini juga penting bagi kami, karena kami melihat bahwa inti akan semakin banyak.
  3. Keandalan tinggi. Yang kami tangisi juga.
  4. Toleransi kesalahan yang tinggi.
  5. Kami ingin menyelesaikan proses rilis harian. Untuk melakukan ini, kami memerlukan pilihan bahasa.

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Oleh karena itu, dari persyaratan produk yang kami hadirkan sendiri, persyaratan bahasa tumbuh dengan cara yang jelas logis.

  1. Jika kita menginginkan dukungan untuk sistem multi-core, maka kita memerlukan dukungan untuk eksekusi paralel.
  2. Jika kita membutuhkan kecepatan pengembangan, kita memerlukan bahasa yang mendukung pengembangan kompetitif, pemrograman kompetitif. Jika ada yang belum menemukan perbedaannya, caranya sangat sederhana:
    • pemrograman paralel adalah tentang bagaimana dua thread berbeda berjalan pada inti yang berbeda;
    • eksekusi bersamaan, lebih khusus lagi dukungan konkurensi, adalah tentang bagaimana bahasa (atau runtime, apa pun) membantu menyembunyikan semua kompleksitas yang berasal dari eksekusi paralel.
  3. Stabilitas tinggi. Tentu saja, kami membutuhkan sebuah cluster, dan itu lebih baik daripada yang kami miliki pada produk vendor.

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Kami tidak punya banyak pilihan, jika Anda ingat. Pertama, Erlang - kami menyukainya dan mengetahuinya, itu adalah favorit pribadi saya. Kedua, Java bukanlah Java, melainkan Scala secara khusus. Ketiga, bahasa yang saat itu belum kita ketahui sama sekali adalah Go. Baru muncul saat itu, lebih tepatnya sudah ada sekitar dua tahun, namun belum dirilis.

Mengalahkan Pergi!

Sejarah Pergi

Kami membuat platform di atasnya. Saya akan mencoba menjelaskan alasannya.

Sejarah Singkat Go. Dimulai pada tahun 2007, dibuka pada tahun 2009, versi pertama dirilis pada tahun 2012 (yaitu, kami mulai bekerja bahkan sebelum rilis pertama). Penggagasnya adalah Google, yang ingin menggantikan, seperti yang saya duga, Java.

Penulisnya sangat terkenal:

  • Ken Thomson, yang berada di belakang Unix, menemukan UTF-8, mengerjakan sistem Plan 9;
  • Rob Pike, yang mendesain UTF-8 bersama Ken, juga mengerjakan Plan 9, Inferno, Limbo di Bell Labs;
  • Robert Gizmer, yang kami kenal dan cintai karena menciptakan Java HotSpot Compiler dan mengerjakan generator di V8 (penerjemah Javascript Google);
  • Dan lebih dari 700 kontributor, termasuk beberapa patch kami.

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Sekilas

Kami melihat bahwa bahasanya kurang lebih sederhana dan mudah dimengerti. Kami memiliki tipe yang jelas: dalam beberapa kasus, tipe tersebut perlu dideklarasikan, dalam kasus lain tidak (artinya tipe tersebut tetap disimpulkan).

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Dapat dilihat bahwa mendeskripsikan struktur merupakan hal yang modis. Terlihat kita mempunyai konsep pointer (dimana tanda bintangnya). Terlihat adanya dukungan khusus untuk mendeklarasikan inisialisasi array dan array asosiatif.

Dapat dimengerti secara kasar - Anda bisa hidup. Mencoba menulis Halo, dunia:

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Apa yang kita lihat? Ini adalah sintaks mirip C, titik koma adalah opsional. Ini bisa menjadi pemisah untuk dua garis, tetapi hanya jika ini adalah dua konstruksi yang berada tepat pada garis yang sama.

Kita melihat bahwa tanda kurung pada struktur kontrol (pada baris ke-14) bersifat opsional, tetapi tanda kurung kurawal selalu diperlukan. Kami melihat bahwa pengetikannya statis. Tim dalam banyak kasus ditampilkan. Contoh ini sedikit lebih rumit daripada Hello, world biasanya - hanya untuk menunjukkan bahwa ada perpustakaan.

Apa lagi yang kita anggap penting? Kode ini disusun menjadi paket-paket. Dan untuk menggunakan paket dalam kode Anda sendiri, Anda perlu mengimpornya menggunakan arahan import - ini juga penting. Kami mulai - itu berhasil. Besar!

Mari kita coba sesuatu yang lebih rumit: Halo, dunia, tapi sekarang server http. Apa yang menurut kami menarik di sini?

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Pertama, fungsi bertindak sebagai parameter. Artinya, fungsi yang kami miliki adalah β€œwarga negara kelas satu” dan Anda dapat melakukan banyak hal menarik dengannya dengan gaya fungsional. Kita melihat hal yang tidak terduga berikutnya: perintah import merujuk langsung ke repositori GitHub. Benar, begitulah adanya - apalagi, begitulah seharusnya dilakukan.

Di Go, pengenal universal suatu paket adalah url repositorinya. Ada utilitas Goget khusus yang berlaku untuk semua dependensi, mengunduhnya, menginstalnya, mengompilasinya, dan menyiapkannya untuk digunakan jika diperlukan. Pada saat yang sama, Goget mengetahui tentang html-meta. Oleh karena itu, Anda dapat menyimpan direktori http, yang akan berisi tautan ke repositori spesifik Anda (seperti yang kami lakukan, misalnya).

Apa lagi yang kita lihat? Http dan Json di perpustakaan biasa. Jelas ada introspeksi - refleksi, yang harus digunakan dalam pengkodean / json, karena kita hanya menggantinya dengan objek arbitrer.

Kami menjalankannya dan melihat bahwa kami memiliki 20 baris kode berguna yang mengkompilasi, menjalankan, dan memberikan beban rata-rata mesin saat ini (pada mesin yang menjalankannya).
Apa lagi yang penting dari apa yang bisa langsung kita lihat di sini? Ini dikompilasi menjadi satu biner statis (buinary). Biner ini tidak memiliki ketergantungan sama sekali, tidak ada perpustakaan! Itu dapat disalin ke sistem apa pun, segera dijalankan, dan itu akan berhasil.

Kami melanjutkan.

Go: metode dan antarmuka

Go punya metode. Anda dapat mendeklarasikan metode untuk tipe kustom apa pun. Selain itu, ini belum tentu merupakan sebuah struktur, tetapi mungkin berupa alias dari beberapa jenis. Anda dapat mendeklarasikan alias untuk N32 dan menulis metode agar dapat melakukan sesuatu yang berguna.

Dan disinilah kita pertama kali jatuh pingsan... Ternyata Go tidak memiliki kelas seperti itu. Mereka yang mengetahui Go mungkin mengatakan bahwa ada penyertaan tipe, tetapi ini benar-benar berbeda. Semakin cepat pengembang berhenti menganggapnya sebagai warisan, semakin baik. Tidak ada kelas di Go, dan tidak ada warisan juga.

Pertanyaan! Apa yang diberikan oleh perusahaan penulis yang dipimpin oleh Google untuk menampilkan kompleksitas dunia? Kami telah diberikan antarmuka!

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

Antarmuka adalah tipe khusus yang memungkinkan Anda menulis metode sederhana, tanda tangan metode. Selanjutnya, jenis apa pun yang metodenya ada (dieksekusi) akan sesuai dengan antarmuka ini. Ini berarti Anda cukup menulis fungsi terkait untuk satu tipe, untuk tipe lainnya (yang sesuai dengan tipe antarmuka tersebut). Selanjutnya, deklarasikan variabel tipe antarmuka ini dan tetapkan salah satu objek berikut ke dalamnya.

Untuk penggemar berat, saya dapat mengatakan bahwa variabel ini sebenarnya berisi dua petunjuk: satu ke data, yang lain ke tabel deskriptor khusus yang khusus untuk tipe khusus ini, ke antarmuka tipe ini. Artinya, kompiler membuat tabel deskriptor seperti itu pada saat penautan.

Dan tentu saja ada petunjuk untuk membatalkan di Go. Kata antarmuka {} (dengan dua kurung kurawal) adalah variabel yang pada prinsipnya memungkinkan Anda menunjuk ke objek apa pun.
Sejauh ini semuanya beres, semuanya familier. Tidak ada yang mengejutkan.

Buka: goroutine

Sekarang kita sampai pada hal yang menarik bagi kita: proses ringan - goroutine (goroutine) dalam terminologi Go.

Alexei Naidenov. ITooLabs. Kasus pengembangan pada platform telepon Go (Golang). Bagian 1

  1. Pertama, ukurannya sangat ringan (kurang dari 2 Kb).
  2. Kedua, biaya pembuatan goroutine semacam itu dapat diabaikan: Anda dapat membuat ribuan goroutine per detik - tidak akan terjadi apa-apa.
  3. Mereka dilayani oleh penjadwalnya sendiri, yang hanya mentransfer kendali dari satu goroutine ke goroutine lainnya.
  4. Dalam hal ini, kendali dialihkan dalam kasus berikut:
    • jika pernyataan go ditemukan (jika goroutine memulai goroutine berikutnya);
    • jika pemblokiran panggilan Input/Out diaktifkan;
    • jika pengumpulan sampah dipicu;
    • jika beberapa operasi dengan saluran dimulai.

Artinya, setiap kali program Go dijalankan di komputer, ia mendeteksi jumlah core dalam sistem, memulai thread sebanyak yang diperlukan (berapa banyak core dalam sistem, atau berapa banyak yang Anda suruh). Oleh karena itu, penjadwal akan menjalankan thread eksekusi ringan ini pada semua thread sistem operasi di setiap inti.

Perlu dicatat bahwa ini adalah cara paling efisien untuk memanfaatkan zat besi. Selain apa yang telah kami tunjukkan, kami melakukan lebih banyak lagi. Kami membuat, misalnya, sistem DPI yang memungkinkan penyajian 40 gigabit dalam satu unit (tergantung pada apa yang terjadi di jalur ini).

Di sana, bahkan sebelum Go, kami menggunakan skema yang persis sama karena alasan ini: karena skema ini memungkinkan Anda untuk menyimpan lokalitas cache prosesor, secara signifikan mengurangi jumlah sakelar konteks OS (yang juga membutuhkan waktu yang sangat lama). Saya ulangi: ini adalah cara paling efektif untuk memanfaatkan zat besi.

Contoh 21 baris sederhana ini adalah contoh yang hanya melakukan server gema. Pada saat yang sama, perhatikan bahwa fungsi servis sangat sederhana, yaitu linier. Tidak ada callback, tidak perlu repot dan berpikir... Anda cukup membaca dan menulis!

Pada saat yang sama, jika Anda membaca dan menulis, goroutine ini seharusnya diblokir - goroutine ini hanya dimasukkan ke dalam antrian dan diambil oleh penjadwal ketika eksekusi dapat dilakukan kembali. Artinya, kode sederhana ini dapat bertindak sebagai server gema untuk koneksi sebanyak yang diizinkan oleh OS pada mesin ini.

Akan segera dilanjutkan...

Beberapa iklan πŸ™‚

Terima kasih untuk tetap bersama kami. Apakah Anda menyukai artikel kami? Ingin melihat konten yang lebih menarik? Dukung kami dengan melakukan pemesanan atau merekomendasikan kepada teman, cloud VPS untuk pengembang mulai $4.99, analog unik dari server level awal, yang kami temukan untuk Anda: Seluruh kebenaran tentang VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps dari $19 atau bagaimana cara berbagi server? (tersedia dengan RAID1 dan RAID10, hingga 24 core dan hingga 40GB DDR4).

Dell R730xd 2x 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 dari $199 di Belanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - mulai $99! Membaca tentang Bagaimana membangun infrastruktur corp. kelas dengan penggunaan server Dell R730xd E5-2650 v4 senilai 9000 euro untuk satu sen?

Sumber: www.habr.com

Tambah komentar