Halo semuanya! Sudah pada 28 Mei, kami meluncurkan grup pertama di kursus
Pengembang Golang . Dan hari ini kami berbagi dengan Anda publikasi pertama yang didedikasikan untuk peluncuran kursus ini. Ayo pergi.
Kutipan utama- The Economist membutuhkan lebih banyak fleksibilitas untuk mendistribusikan konten ke saluran digital yang semakin beragam. Untuk mencapai tujuan ini dan mempertahankan tingkat kinerja dan keandalan yang tinggi, platform telah berpindah dari arsitektur monolitik ke arsitektur layanan mikro.
- Alat-alat yang ditulis dalam Go adalah komponen kunci dari sistem baru, yang memungkinkan The Economist untuk menyediakan layanan yang terukur dan berkinerja tinggi dan dengan cepat menciptakan produk baru.
- Go, dengan tujuan konkurensi dan dukungan API, bersama dengan konstruksi bahasa kompilasi statis, memfasilitasi pengembangan sistem pemrosesan acara terdistribusi yang dapat ditingkatkan. Dukungan pengujian juga merupakan nilai tambah.
- Secara umum, pengalaman tim The Economist dengan Go adalah positif, dan ini adalah salah satu faktor penentu yang membantu skala Platform Konten.
- Go tidak akan selalu menjadi alat yang cocok, dan ini normal. The Economist memiliki platform polyglot dan menggunakan berbagai bahasa yang masuk akal.
Saya bergabung dengan tim pengembangan
The Economist sebagai pengembang Drupal. Namun, tugas saya yang sebenarnya adalah untuk berpartisipasi dalam proyek yang secara fundamental akan mengubah teknologi pengiriman konten ekonom. Beberapa bulan pertama saya habiskan untuk belajar Go, beberapa bulan bekerja dengan konsultan eksternal untuk membuat MVP (produk minimum yang layak), dan kemudian bergabung dengan tim lagi untuk mengawasi pencelupan mereka di Go.
Pergeseran teknologi ini dipicu oleh misi The Economist untuk memperluas pemirsa digitalnya, karena konsumsi berita beralih dari media cetak. The Economist membutuhkan lebih banyak fleksibilitas untuk mengirimkan konten ke saluran digital yang semakin beragam. Untuk mencapai tujuan ini dan mempertahankan tingkat kinerja dan keandalan yang tinggi, platform telah berpindah dari arsitektur monolitik ke arsitektur layanan mikro. Alat-alat yang ditulis dalam Go adalah komponen kunci dari sistem baru, yang memungkinkan The Economist untuk menyediakan layanan yang terukur dan berkinerja tinggi dan dengan cepat menciptakan produk-produk baru.
Implementing Go in The Economist:
- Insinyur yang diizinkan untuk dengan cepat mengembangkan dan mengimplementasikan fungsionalitas baru.
- Praktik terbaik yang disetujui untuk layanan gagal cepat dengan penanganan kesalahan cerdas.
- Memberikan dukungan yang andal untuk operasi konkurensi dan jaringan dalam sistem terdistribusi.
- Itu menunjukkan kurangnya kedewasaan dan dukungan di beberapa area yang dibutuhkan untuk konten dan media.
- Memfasilitasi platform yang dapat meningkatkan skala untuk penerbitan digital.
Mengapa The Economist memilih Go?Untuk menjawab pertanyaan ini, akan bermanfaat untuk menyoroti keseluruhan arsitektur platform baru. Platform, yang disebut Platform Konten, adalah sistem penanganan acara. Ini menanggapi peristiwa dari platform pembuat konten yang berbeda dan meluncurkan aliran proses yang dijalankan dalam layanan microser yang bekerja secara terpisah. Layanan ini melakukan fungsi seperti menstandarkan data, menganalisis tag semantik, mengindeks dalam ElasticSearch, dan mengirim konten ke platform eksternal seperti Apple News atau Facebook. Platform ini juga memiliki RESTful API, yang dikombinasikan dengan GraphQL adalah titik masuk utama untuk klien dan produk front-end.
Dalam mengembangkan arsitektur umum, tim menyelidiki bahasa mana yang sesuai dengan kebutuhan platform. Go telah dibandingkan dengan Python, Ruby, Node, PHP, dan Java. Sementara setiap bahasa memiliki kekuatannya sendiri, Go paling cocok untuk arsitektur platform. Go, dengan tujuan konkurensi dan dukungan API, bersama dengan konstruksi bahasa kompilasi statis, memfasilitasi pengembangan sistem pemrosesan acara terdistribusi yang dapat ditingkatkan. Selain itu, sintaksis Go yang relatif sederhana membuatnya mudah untuk terlibat dalam pengembangan dan mulai menulis kode kerja, yang menjanjikan manfaat langsung bagi tim yang sedang menjalani transisi teknologi besar. Secara umum, ditentukan bahwa Go adalah bahasa yang paling cocok untuk kegunaan dan efisiensi dalam sistem cloud terdistribusi.
Tiga tahun kemudian: apakah Go cocok dengan tujuan ambisius ini?Beberapa elemen desain platform disejajarkan dengan baik dengan bahasa Go. Gagal Cepat adalah bagian penting dari sistem karena terdiri dari layanan independen yang didistribusikan. Sesuai dengan prinsip Aplikasi Dua Belas-Faktor ("aplikasi 12 faktor"), aplikasi harus berjalan dengan cepat dan cepat gagal (gagal cepat). Desain Go sebagai bahasa yang dikompilasi statis menyediakan waktu startup yang cepat, dan kinerja kompiler terus membaik dan tidak pernah menjadi masalah untuk desain atau penyebaran. Selain itu, desain penanganan kesalahan Go memungkinkan aplikasi gagal tidak hanya lebih cepat, tetapi juga lebih pintar.
Menangani kesalahanFitur yang insinyur cepat perhatikan di Go adalah bahwa itu adalah tipe Kesalahan daripada sistem pengecualian. Di Go, semua kesalahan adalah nilai. Jenis Kesalahan sudah ditentukan sebelumnya dan merupakan antarmuka. Antarmuka di Go pada dasarnya adalah kumpulan metode yang bernama, dan semua tipe pengguna lain dapat memenuhi antarmuka jika memiliki metode yang sama. Tipe Kesalahan adalah antarmuka yang dapat menggambarkan dirinya sebagai string.
type error interface { Error() string }
Ini memberi insinyur lebih banyak kontrol dan fungsionalitas dalam penanganan kesalahan. Dengan menambahkan metode Kesalahan yang mengembalikan string dalam modul pengguna apa pun, Anda dapat membuat kesalahan Anda sendiri dan membuatnya, misalnya, menggunakan fungsi Baru di bawah ini, yang berasal dari paket Kesalahan.
type errorString struct { s string } func (e *errorString) Error() string { return es }
Apa artinya ini dalam praktik? Di Go, fungsi memungkinkan beberapa nilai balik, jadi jika fungsi Anda mungkin tidak berfungsi, kemungkinan besar akan mengembalikan nilai kesalahan. Bahasa ini mendorong Anda untuk secara eksplisit memeriksa kesalahan di mana mereka terjadi (sebagai lawan melempar dan menangkap pengecualian), sehingga kode Anda biasanya harus menyertakan tanda centang “if err! = Nihil. " Pada awalnya, penanganan kesalahan yang sering ini mungkin tampak monoton. Namun, kesalahan sebagai nilai memungkinkan Anda menggunakan Kesalahan untuk menyederhanakan penanganan kesalahan. Misalnya, dalam sistem terdistribusi, Anda dapat dengan mudah menerapkan upaya untuk mencoba lagi kueri dengan membungkus kesalahan.
Masalah jaringan akan selalu terjadi dalam sistem, apakah itu mengirim data ke layanan internal lain atau mentransfernya ke alat pihak ketiga. Contoh paket Net ini menunjukkan bagaimana Anda dapat menggunakan kesalahan sebagai tipe untuk membedakan kesalahan jaringan sementara dari kesalahan permanen. Tim Economist menggunakan pembungkus kesalahan yang sama untuk membuat percobaan ulang tambahan saat mengirim konten ke API eksternal.
package net type Error interface { error Timeout() bool
Go penulis percaya bahwa tidak semua pengecualian luar biasa. Insinyur lebih mungkin untuk pulih secara cerdas dari kesalahan daripada merusak aplikasi. Selain itu, penanganan kesalahan Go memungkinkan Anda untuk mengontrol kesalahan dengan lebih baik, yang dapat meningkatkan aspek seperti debugging atau kegunaan kesalahan. Di dalam Platform Konten, fitur desain Go ini memungkinkan pengembang untuk membuat keputusan berdasarkan informasi tentang kesalahan, yang menyebabkan peningkatan keandalan sistem secara keseluruhan.
Konsistensi dataKonsistensi data merupakan faktor penting dalam Platform Konten. Di The Economist, konten adalah fondasi bisnis, dan tujuan Platform Konten adalah untuk memastikan bahwa konten dapat dipublikasikan satu kali dan tersedia di mana-mana. Karenanya, penting bahwa setiap produk dan konsumen memiliki konsistensi data dengan API Platform Konten. Produk utamanya menggunakan GraphQL untuk permintaan API, yang membutuhkan skema statis, yang berfungsi sebagai semacam kontrak antara konsumen dan platform. Konten yang diproses oleh Platform harus konsisten dengan skema ini. Bahasa statis membantu untuk mengimplementasikan ini dan membuatnya mudah untuk mencapai konsistensi data.
Menguji dengan GoFitur lain yang mempromosikan konsistensi adalah Go test suite. Waktu kompilasi yang cepat dari Go, dikombinasikan dengan pengujian kelas satu sebagai fitur bahasa, memungkinkan tim untuk menggabungkan metode pengujian yang efektif ke dalam alur kerja desain dan kegagalan yang cepat dalam jalur pipa perakitan. Alat uji Go membuatnya mudah diatur dan dijalankan. Menjalankan "uji coba" akan menjalankan semua tes di direktori saat ini, dan perintah uji memiliki beberapa flag yang berguna. Bendera sampul memberikan laporan cakupan kode terperinci. Tes bench menjalankan tes benchmark, yang ditunjukkan dengan menjalankan nama fungsi tes dengan kata "Bench" daripada "Test". Fungsi TestMain menyediakan metode untuk pengaturan tes tambahan, seperti server otentikasi dummy.
Selain itu, Go memiliki kemampuan untuk membuat tes tabular dengan struktur anonim dan bertopik dengan antarmuka, meningkatkan cakupan tes. Meskipun pengujian bukanlah hal baru dalam hal fitur bahasa, Go membuatnya mudah untuk membuat pengujian yang kuat dan dengan mudah mengintegrasikannya ke dalam alur kerja. Sejak awal, para insinyur The Economist dapat menjalankan tes sebagai bagian dari pipa rakitan tanpa konfigurasi khusus, dan bahkan menambahkan Git Hooks untuk menjalankan tes sebelum memasukkan kode ke Github.
Namun, proyek ini bukannya tanpa upaya dalam mencapai konsistensi data. Masalah utama pertama untuk platform ini adalah mengelola konten dinamis dari backend yang tidak dapat diprediksi. Platform mengkonsumsi konten dari sistem CMS asli terutama melalui titik akhir JSON, di mana struktur dan tipe data tidak dijamin. Ini berarti bahwa platform tidak dapat menggunakan paket Go standar untuk menafsirkan json, yang mendukung deserialisasi JSON ke dalam struktur, tetapi itu membunyikan alarm jika jenis struct dan input data bidang tidak cocok.
Untuk mengatasi masalah ini, diperlukan metode khusus untuk memetakan bagian server ke format standar. Setelah beberapa kali pengulangan dari pendekatan yang dipilih, tim memperkenalkan proses deserialisasi sendiri. Meskipun pendekatan ini sedikit mirip dengan pengerjaan ulang paket perpustakaan standar, itu memberi insinyur kontrol penuh atas pemrosesan data sumber.
Dukungan jaringanSkalabilitas berada di garis depan platform baru, dan ini disediakan oleh perpustakaan Go standar untuk jaringan dan API. Di Go, Anda dapat dengan cepat mengimplementasikan titik akhir HTTP yang dapat diskalakan tanpa membutuhkan kerangka kerja. Dalam contoh di bawah ini, paket pustaka standar net / http digunakan untuk mengonfigurasi penangan yang menerima permintaan dan respons penulis. Saat API Platform Konten pertama kali diterapkan, ia menggunakan kerangka API. Itu akhirnya digantikan oleh perpustakaan standar, karena tim mengakui bahwa itu memenuhi semua kebutuhan jaringan mereka tanpa kompromi tambahan yang tidak perlu. Skala penangan HTTP Golang karena setiap permintaan ke penangan dijalankan secara paralel di Goroutine, utas yang ringan tanpa perlu penyesuaian.
package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World!") } func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":8080", nil)) }
Model konkurensiModel konkurensi Go telah memberikan banyak manfaat dalam meningkatkan kinerja di seluruh platform. Bekerja dengan data terdistribusi melibatkan rewel dengan jaminan yang dijanjikan kepada konsumen. Menurut teorema CAP, tidak mungkin untuk memberikan lebih dari dua dari tiga jaminan berikut secara bersamaan: Konsistensi data. Ketersediaan Tahan terhadap pemisahan. Dalam platform Economist, konsistensi pada akhirnya diadopsi, yang berarti bahwa membaca dari sumber data pada akhirnya akan konsisten, dan penundaan moderat dalam semua sumber data mencapai keadaan yang konsisten dapat diterima. Salah satu cara untuk meminimalkan kesenjangan ini adalah dengan menggunakan Goroutine.
Goroutine adalah utas ringan yang dikelola oleh Go runtime untuk mencegahnya kehabisan utas. Goroutine diizinkan untuk mengoptimalkan tugas asinkron di platform. Sebagai contoh, salah satu repositori data Platform adalah Elasticsearch. Ketika konten diperbarui pada sistem, konten yang mereferensikan item ini di Elasticsearch diperbarui dan diindeks ulang. Berkat implementasi Goroutine, waktu pemrosesan berkurang, yang memastikan konsistensi elemen yang cepat. Contoh ini menunjukkan bagaimana item yang cocok untuk diproses ulang diproses ulang di Goroutine.
func reprocess(searchResult *http.Response) (int, error) { responses := make([]response, len(searchResult.Hits)) var wg sync.WaitGroup wg.Add(len(responses)) for i, hit := range searchResult.Hits { wg.Add(1) go func(i int, item elastic.SearchHit) { defer wg.Done() code, err := reprocessItem(item) responses[i].code = code responses[i].err = err }(i, *hit) } wg.Wait return http.StatusOK, nil }
Merancang sistem lebih dari sekadar pemrograman. Insinyur perlu memahami alat mana dan di mana saat yang tepat. Sementara Go adalah alat yang ampuh untuk sebagian besar kebutuhan Platform Konten The Economist, beberapa keterbatasan memerlukan solusi lain.
Manajemen ketergantunganKetika Go baru saja dirilis, itu tidak memiliki sistem manajemen ketergantungan. Di dalam komunitas, beberapa alat telah dikembangkan untuk memenuhi kebutuhan ini. The Economist menggunakan submission Git, yang masuk akal pada saat komunitas secara aktif mempromosikan alat manajemen ketergantungan standar. Saat ini, meskipun masyarakat sudah jauh lebih dekat dengan pendekatan yang koheren untuk pengelolaan ketergantungan, itu tidak ada di sana. Pendekatan The Economist menggunakan submodules tidak menimbulkan masalah serius, tetapi sulit bagi pengembang Go lainnya, dan ini harus diperhitungkan ketika beralih ke Go.
Ada juga persyaratan platform yang fitur atau desain Go bukan solusi terbaik. Karena platform menambahkan dukungan untuk pemrosesan audio, alat Go untuk mengekstraksi metadata terbatas pada saat itu, sehingga tim memilih Exiftool Python sebagai gantinya. Layanan platform bekerja dalam wadah buruh pelabuhan, yang memungkinkan menginstal Exiftool dan meluncurkannya dari aplikasi Go.
func runExif(args []string) ([]byte, error) { cmdOut, err := exec.Command("exiftool", args...).Output() if err != nil { return nil, err } return cmdOut, nil }
Skenario umum lainnya untuk platform adalah penerimaan kode HTML yang tidak berfungsi dari sistem CMS sumber, analisis kode HTML untuk kebenaran dan sanitasi kode HTML. Awalnya, Go digunakan untuk proses ini, tetapi karena pustaka HTML standar Go membutuhkan HTML yang benar, Go memerlukan sejumlah besar kode khusus untuk mem-parsing HTML sebelum memproses. Kode ini dengan cepat menjadi rapuh dan melewatkan kasus batas, sehingga solusi baru diimplementasikan dalam Javascript. Javascript telah memberikan fleksibilitas dan kemampuan beradaptasi yang besar untuk mengontrol proses pemeriksaan dan sanitasi HTML.
Javascript juga telah menjadi pilihan umum untuk memfilter dan mengarahkan acara di Platform. Acara disaring menggunakan AWS Lambdas, yang merupakan fungsi ringan yang hanya berjalan saat dipanggil. Satu kasus penggunaan adalah memfilter peristiwa pada pita yang berbeda, seperti cepat dan lambat. Pemfilteran ini didasarkan pada bidang metadata tunggal di objek JSON shell penangan kejadian. Implementasi penyaringan menggunakan paket pointer Javascript JSON untuk menangkap elemen dalam objek JSON. Pendekatan ini jauh lebih efisien dibandingkan dengan benar-benar membongkar JSON yang dibutuhkan Go. Sementara fungsionalitas jenis ini dapat dicapai dengan Go, menggunakan Javascript lebih mudah bagi para insinyur dan memberikan lambda yang lebih sederhana.
Go RetrospektifSetelah menerapkan Platform Kontak dan mendukungnya dalam produksi, jika saya akan melakukan retrospeksi Go dan Platform Konten, umpan balik saya adalah sebagai berikut:
Apa yang sudah bagus?
- Elemen desain bahasa utama untuk sistem terdistribusi.
- Model konkurensi yang relatif mudah diterapkan.
- Pengkodean yang bagus dan komunitas yang menyenangkan.
Apa yang bisa diperbaiki?
- Kemajuan lebih lanjut dalam standar kontrol versi dan penjual.
- Kedewasaan tidak cukup di beberapa area.
- Detail untuk kasus pengguna tertentu.
Secara umum, itu adalah pengalaman positif, dan Go adalah salah satu elemen paling penting yang memungkinkan untuk menskala Platform Konten. Go tidak akan selalu menjadi alat yang cocok, dan ini normal. The Economist memiliki platform polyglot dan menggunakan berbagai bahasa yang masuk akal. Go mungkin tidak akan pernah menjadi pilihan terbaik ketika Anda perlu mengacaukan objek teks dan konten dinamis, jadi Javascript masih ada di kotak alat. Namun, kekuatan Go adalah fondasi yang memungkinkan sistem untuk tumbuh dan berkembang.
Saat mempertimbangkan apakah Go tepat untuk Anda, pertimbangkan masalah utama desain sistem:
- Apa tugas sistem Anda?
- Apa jaminan yang Anda berikan kepada konsumen Anda?
- Arsitektur dan pola apa yang sesuai untuk sistem Anda?
- Bagaimana seharusnya skala sistem Anda?
Jika Anda mengembangkan sistem yang mengatasi tantangan data terdistribusi, alur kerja asinkron, dan kinerja tinggi dan skalabilitas, saya sarankan Anda mempertimbangkan Go dan kemampuannya untuk mempercepat tujuan sistem Anda.
Teman-teman, kami menunggu komentar Anda dan mengundang semua orang ke
webinar terbuka , yang akan diadakan pada tanggal 16 oleh pengembang senior di Yandex dan, secara kombinasi, guru kami adalah
Dmitry Smal .