Hai, Habr. Dalam posting ini kami ingin berbicara tentang bagaimana dan mengapa kami menggunakan bahasa pemrograman dengan nama Lua yang indah di IPONWEB.
Lua adalah bahasa pemrograman tertanam berbasis naskah dengan juru bahasa gratis dan sumber terbuka di C. Bahasa ini dikembangkan pada tahun 1993 di Brasil, di divisi Tecgraf di Universitas Katolik Rio de Janeiro, dan nenek moyangnya adalah DEL (Data-Entry Language) dan SOL (Bahasa Obyek Sederhana) dikembangkan sebelumnya. Salah satu leluhur, bahasa SOL, secara tidak langsung berpartisipasi dalam "baptisan" bayi yang baru lahir - "Sol" diterjemahkan dari bahasa Portugis sebagai "matahari", dan bahasa baru itu dinamai "Lua", "bulan".
Kemudahan menanamkan Lua dalam mesin yang ditulis dalam bahasa "sistem" telah membuatnya menjadi bahasa scripting populer untuk video game. Misalnya, skrip ditulis dalam Lua di Grim Fandango dan Gerbang Baldur. Mereka yang bermain World of Warcraft juga mungkin pernah mendengar tentang Lua lebih dari sekali atau dua kali - di sanalah pengaya untuk game ditulis yang membuat hidup lebih mudah bagi pemain hardcore, penggemar kasual, penggemar untuk mengukur efektivitas mereka dan penduduk lain di dunia game. Di luar gamedev, Lua digunakan sebagai bahasa scripting sistem tertanam (televisi, printer, panel mobil), serta aplikasi, misalnya, VLC Media Player. Lua menggunakan alat seperti Tarantool, Redis, dan OpenResty sebagai bahasa yang disematkan. Lua juga digunakan sebagai bahasa ekstensi untuk kode komputasi Fortran yang mensimulasikan perilaku termomekanis bahan bakar nuklir.
Kenapa Lua?
IPONWEB adalah pengembang platform yang sangat dimuat untuk perusahaan yang bekerja di bidang periklanan online: DSP, SSP, biro iklan dan pengiklan. Kami berbicara
secara rinci tentang pekerjaan kami
di artikel ini . Pada awalnya, kami mengembangkan logika bisnis platform kami di C ++, tetapi dengan cepat menyadari bahwa ini bukan pilihan terbaik. Untuk meminimalkan biaya, kinerja platform adalah penting, serta kecepatan pengembangan, dan pengembangan C ++ ternyata terlalu lambat bagi kami, dan kompleksitas penambahan fungsi juga terpengaruh. Kami memutuskan untuk mengisolasi interpretasi logika bisnis dari kode server tingkat rendah, mulai mencari bahasa yang cocok untuk ini, dan memutuskan untuk menggunakan Lua. Itu pada tahun 2008, implementasi JavaScript yang cocok untuk kami belum ada, Perl, Python, dan Ruby terlalu lambat dan tidak mudah untuk diintegrasikan. Dan ada bahasa Lua, tidak terlalu terkenal, tetapi populer di game dev, dan apa yang kami inginkan mirip dengan kebutuhan pengembang game - kami membutuhkan mesin cepat untuk operasi tingkat rendah dan bahasa cepat yang mudah dibangun untuk logika bisnis.
Lua benar-benar bahasa yang sangat cepat. Peningkatan kecepatan tambahan dapat
dicapai dengan menggunakan
LuaJIT , lingkungan runtime untuk Lua 5.1, yang mencakup kompiler JIT tracing (kami menggunakan garpu kami sendiri, yang sudah kami
tulis sebelumnya ). Karena kami menulis logika bisnis untuk sistem
RTB , kecepatan sangat penting bagi kami: dalam RTB, rata-rata, ada 120 milidetik untuk memproses setiap permintaan yang masuk. Pada saat yang sama, hanya 10-15 milidetik yang dialokasikan untuk eksekusi kode, dan sisanya menunggu tanggapan dari layanan lain. Jika, misalnya, pengguna bahkan tidak melihat penundaan setengah detik saat memuat situs di jaringan, maka untuk RTB 500 milidetik ini adalah periode waktu yang sangat lama. Jawaban atas pertanyaan seberapa cepat bahasa Lua adalah: cukup cepat sehingga kita dapat menulis logika bisnis di atasnya selama bertahun-tahun dan tetap berada dalam bisnis RTB. Jika bahasa yang kami pilih tidak cukup cepat, kami tidak akan memiliki siapa pun untuk menulis platform. Apakah ini berarti bahwa RTB tidak dapat ditulis dalam bahasa lain? Bukan berarti. Tetapi kami menulis RTB di Lua dan berhasil mengatasi tugas bisnis kami dan klien. Contoh yang baik dari kecepatan Lua di server adalah
tolok ukur OpenResty ini.
Lua sebagai bahasa yang disematkan memiliki banyak keunggulan: bahasa ini minimalis, kompak, dengan perpustakaan standar yang sangat kecil. Fungsinya sepenuhnya digandakan dalam C, yang menyediakan interaksi yang mudah dan "mulus" antara Lua dan C. Lua memiliki ambang masuk yang agak rendah dibandingkan dengan banyak bahasa lain: sebagian besar programmer yang datang untuk bekerja di IPONWEB belum pernah menulis ke Lua sebelumnya, tetapi mereka memiliki cukup beberapa hari untuk sepenuhnya terlibat dalam pekerjaan.
Berikut adalah contoh sederhana penargetan pemirsa iklan.
Dan ini adalah bagaimana penangan sederhana (event handler) terlihat seperti.
local adm_cache = require 'modules.adm_cache'
Kesederhanaan Lua tidak hanya memberikan perkembangan yang cepat, tetapi juga memungkinkan Anda melakukan banyak pekerjaan dengan sedikit usaha. Platform IPONWEB adalah solusi umum yang disesuaikan dengan kebutuhan klien tertentu, sementara satu pengembang dan satu manajer dapat melakukan proyek. Baca kode pada Lua tidak hanya untuk pengembang itu sendiri, tetapi juga manajer proyek, dan kadang-kadang pelanggan. Bersama-sama, kami dengan cepat menemukan masalah, menemukan penyebab dan solusinya. Seringkali, manajer proyek memberi tahu pengembang tentang masalah dan segera menyarankan cara untuk menyelesaikannya.
Pada saat yang sama, kesederhanaan Lua bisa menipu, sementara minimalis dan kekompakan memiliki kelemahan. Jika kode ini ditulis, misalnya, dalam Perl atau Python, pengembang dapat menggunakan repositori besar modul siap pakai, Ruby memiliki RubyGems, dan banyak bahasa lain memiliki repositori yang kaya. Dan Lua memiliki
LuaRocks dan tiga ribu modul yang ada di sana. Selain itu, bahkan jika LuaRocks memiliki modul yang tepat, sangat mungkin bahwa Anda harus bekerja keras untuk menggunakannya di perusahaan tertentu. Lua menyediakan alat yang baik untuk menciptakan lingkungan yang aman untuk mengeksekusi kode (kotak pasir), dan ketika bekerja di kotak pasir, beberapa fungsi dapat dinonaktifkan. Ini berarti bahwa modul LuaRocks mungkin tidak berfungsi jika mereka menggunakan fungsi yang diblokir oleh lingkungan aman perusahaan. Ini adalah harga kekompakan dan kemampuan embeddability, tetapi sepadan dengan harganya - bahasa dengan baterai, seperti, misalnya, Python, dibuat tidak lebih rumit daripada Lua.
Bagaimana cara kerjanya?
Dasar dari platform kami adalah server HTTP yang dapat disesuaikan dengan API yang nyaman dan dapat dikembangkan yang menyediakan serangkaian fungsi untuk pengembang Lua dan dirancang untuk tugas-tugas pasar periklanan. Server ini memproses ratusan juta permintaan dan menulis terabyte log per hari. Permintaan yang masuk didistribusikan secara merata di seluruh utas sistem, dan di dalam utas sistem terdapat kotak pasir.

Ketika permintaan tiba di server,
coroutine dibuat di dalam kotak pasir di mana permintaan ini jatuh, yang memproses permintaan. Coroutine bekerja secara independen satu sama lain, masing-masing coroutine yang dibuat di antri untuk dieksekusi. Masa pakai setiap coroutine (total waktu pemrosesan permintaan, dengan mempertimbangkan respons yang diharapkan dari layanan yang terlibat: database, metrik, server anggaran) tidak boleh melebihi 120 milidetik.

Singkatnya, proses pemrosesan permintaan dapat dijelaskan sebagai berikut:
- Setiap permintaan yang diterima diuraikan dan melewati pemeriksaan standar untuk kebenaran.
- Corutin diluncurkan, yang bertanggung jawab untuk memproses permintaan ini. Di dalam setiap kotak pasir, ada banyak coroutine dalam status yang berbeda.
- Proses permintaan dimulai, yang dapat memiliki dua hasil:
- Pemrosesan selesai dengan sukses.
- Corutin mentransfer kontrol ke server. Ini biasanya terjadi ketika coroutine sedang menunggu tanggapan dari layanan lain. Dalam kasus-kasus seperti itu, pekerjaan korutin ditunda sampai suatu tanggapan tiba atau waktu tunggu berakhir. Saat mentransfer kontrol, server mulai memproses permintaan berikutnya. Ini bisa berupa permintaan baru atau permintaan yang menerima respons dari semua layanan yang terlibat dan siap untuk melanjutkan mengeksekusi kode. Urutan permintaan pemrosesan ditentukan oleh persyaratan logika bisnis.

Penggunaan corutin adalah topik menarik lainnya yang perlu dibahas secara terperinci. Sebagai contoh,
artikel ini merinci bagaimana corutins dapat digunakan untuk membuat cutscene di video game. Dan coroutine di server aplikasi harus menyediakan artikel terpisah, dan mungkin di masa depan kita akan melakukannya.
Apa selanjutnya
Dan kemudian, mungkin, penggunaan Lua di IPONWEB akan diperluas. Kami memiliki ide tentang bagaimana Anda masih dapat menggunakan Lua dalam bisnis kami, dan ketika ide-ide ini diterapkan, kami pasti akan berbagi pengalaman baru. Kenyamanan dan kemampuan Lua sebagai bahasa skrip tertanam dapat membantu kami, khususnya, mempercepat pemrosesan data klien. Tetapi ini masih dari bidang rencana dan prospek.
Kesimpulannya, kita dapat mengatakan bahwa pilihan kita terhadap bahasa logika bisnis, yang dibuat 11 tahun yang lalu, terus membenarkan dirinya sendiri, memungkinkan kita untuk berhasil mengatasi tugas bisnis kita sendiri dan membantu kita dalam memecahkan masalah pelanggan kita. Mudah dibaca, mudah diintegrasikan, cepat dan mudah dipelajari, Lua telah dan tetap menjadi salah satu bahasa scripting terbaik, yang ruang lingkupnya tidak terbatas pada pengembangan game. Logika bisnis IPONWEB yang tertulis di atasnya hanyalah salah satu contohnya.