Apa Perbedaan Antara OpenResty dan NGINX?
API7.ai
September 9, 2022
Keuntungan dari OpenResty sangat jelas, sebelum mempelajari secara detail, mari kita tinjau secara singkat proses pengembangan OpenResty, yang akan membantu Anda lebih memahami konten berikutnya.
Proses Pengembangan OpenResty
OpenResty tidak dibangun dari awal seperti bahasa pengembangan lainnya, tetapi didasarkan pada komponen open-source yang matang - NGINX dan LuaJIT. OpenResty lahir pada tahun 2007, tetapi versi pertamanya tidak memilih Lua, melainkan Perl, yang sangat terkait dengan preferensi teknis penulis.
Namun, kinerja Perl jauh dari memenuhi persyaratan, sehingga pada versi kedua, Perl digantikan oleh Lua. Namun, dalam proyek resmi OpenResty, Perl masih memainkan peran penting. Proyek ekosistem OpenResty dibangun dengan Perl, seperti framework pengujian, Linter, CLI, dll. Kami akan memperkenalkannya secara bertahap nanti.
Karena keunggulan kinerja tinggi dan dinamis OpenResty sangat cocok untuk kebutuhan bisnis CDN, OpenResty segera menjadi standar teknis CDN. Selain itu, melalui perpustakaan lua-resty-* yang kaya, OpenResty mulai perlahan-lahan melepaskan bayangan NGINX dan membentuk ekosistemnya sendiri, yang banyak digunakan di bidang API gateway, soft WAF, dan lainnya.
Saya sering mengatakan bahwa OpenResty adalah teknologi yang banyak digunakan, tetapi bukan teknologi yang populer, yang terdengar kontradiktif. Apa maksudnya?
Ini banyak digunakan karena OpenResty sekarang adalah server web kelima yang paling banyak digunakan di dunia.
Ini tidak populer karena proporsi penggunaan OpenResty untuk membangun sistem bisnis tidak tinggi. Sebagian besar pengguna menggunakan OpenResty untuk memproses lalu lintas masuk, dan mereka tidak mendalami bisnis. Jadi secara alami, penggunaan OpenResty hanya sekilas, dan itu cukup untuk memenuhi kebutuhan saat ini. Ini tentu saja juga terkait dengan kurangnya framework web dan ekosistem yang matang seperti Java dan Python di OpenResty.
Setelah mengatakan banyak hal, selanjutnya, saya akan fokus memperkenalkan beberapa aspek dari proyek open source OpenResty yang patut dipuji dan dipelajari.
Sorotan OpenResty
Dokumentasi dan kasus uji yang detail
Ya, dokumentasi dan pengujian adalah indikator kritis apakah sebuah proyek open source dapat diandalkan, bahkan lebih penting daripada kualitas kode dan kinerja.
Dokumentasi OpenResty sangat detail, dan penulis telah menulis setiap poin yang perlu diperhatikan dalam dokumentasi. Sebagian besar waktu, kita hanya perlu melihat dokumentasi dengan cermat untuk menyelesaikan masalah yang kita hadapi tanpa perlu mencari di Google atau melacak kode sumber. Untuk kemudahan, OpenResty juga dilengkapi dengan alat baris perintah, restydoc, yang dirancang untuk membantu Anda melihat dokumentasi melalui shell dan menghindari gangguan dalam proses pengkodean.
Namun, hanya ada satu atau dua cuplikan kode yang tersedia dalam dokumentasi, dan tidak ada contoh yang lengkap dan kompleks. Di mana saya dapat menemukan contoh seperti itu?
Untuk OpenResty, tentu saja di direktori /t, yang berisi semua kasus uji. Setiap kasus uji mencakup konfigurasi NGINX dan kode Lua yang lengkap, serta data input dan output yang diharapkan. Namun, framework pengujian OpenResty sangat berbeda dari framework pengujian gaya asersi lainnya, yang akan saya perkenalkan nanti dalam bab khusus.
Sinkron non-blocking
Coroutine adalah fitur baru yang ditambahkan oleh banyak bahasa skrip dalam beberapa tahun terakhir untuk meningkatkan kinerja. Tetapi mereka tidak diimplementasikan dengan sempurna, beberapa hanya berupa syntactic sugar, dan beberapa memerlukan deklarasi kata kunci eksplisit.
OpenResty telah mendukung coroutine sejak awal dan mengimplementasikan model pemrograman sinkron non-blocking. Ini penting karena programmer juga manusia, dan kode harus lebih sesuai dengan kebiasaan berpikir manusia. Callback eksplisit dan kata kunci async mengganggu pemikiran dan membuat debugging menjadi sulit.
Jadi apa itu sinkron non-blocking? Mari kita bicara tentang sinkron terlebih dahulu. Ini sangat sederhana: jalankan secara berurutan sesuai dengan kode. Misalnya, pseudocode berikut:
local res, err = query-mysql(sql) local value, err = query-redis(key)
Dalam permintaan yang sama, jika kita harus menunggu hasil query MySQL kembali sebelum melanjutkan query Redis, itu adalah sinkron; jika kita tidak perlu menunggu kembalinya MySQL dan kita dapat melanjutkan query Redis, maka itu adalah asinkron. Untuk OpenResty, sebagian besar operasi adalah sinkron. Hanya API yang terkait dengan timer latar belakang, seperti ngx.timer yang merupakan operasi asinkron.
Adapun non-blocking, yang merupakan konsep yang mudah dikacaukan dengan asinkron, ketika kita mengatakan blocking di sini, kita berarti memblokir thread sistem operasi. Mari kita lanjutkan melihat contoh di atas, asumsikan dibutuhkan 1s untuk query MySQL. Jika dalam 1s ini, sumber daya sistem operasi (CPU) menganggur dan hanya menunggu kembalinya hasil, itu adalah blocking; jika CPU mengambil kesempatan untuk memproses permintaan koneksi lain, itu adalah non-blocking. Non-blocking juga merupakan kunci untuk mencapai konkurensi tinggi seperti C10K dan C100K.
Konsep sinkron non-blocking sangat penting. Namun, menurut saya, konsep ini tidak boleh dipahami dengan analogi karena analogi yang tidak tepat kemungkinan besar akan membingungkan Anda lebih jauh.
Di OpenResty, pseudocode di atas dapat langsung mencapai sinkron non-blocking tanpa kata kunci eksplisit. Ini juga mencerminkan kembali bahwa memudahkan pengembang untuk digunakan adalah salah satu konsep OpenResty.
Dinamis
Salah satu keunggulan besar OpenResty, yang belum sepenuhnya dimanfaatkan, adalah sifat dinamisnya.
Server web tradisional, seperti NGINX, mengharuskan kita untuk memodifikasi file konfigurasi di disk dan memuat ulang untuk membuat perubahan berlaku karena mereka tidak menyediakan API untuk mengontrol perilaku runtime. Oleh karena itu, dalam microservices yang memerlukan perubahan yang sering, NGINX telah mencoba berkali-kali, tetapi tidak ada yang membaik. Dan kemunculan tiba-tiba Envoy, dengan API kontrol dinamis xDS, menimbulkan ancaman serius terhadap NGINX.
Tidak seperti NGINX dan Envoy, OpenResty dikendalikan oleh bahasa skrip Lua, dan dinamis adalah keunggulan alami Lua. Misalnya, melalui API Lua yang disediakan dalam modul lua-nginx-module di OpenResty, kita dapat secara dinamis mengontrol rute, upstream, sertifikat SSL, permintaan, respons, dll. Bahkan lebih jauh, kita dapat memodifikasi logika pemrosesan bisnis tanpa memulai ulang OpenResty, tidak terbatas pada API Lua yang disediakan oleh OpenResty.
Berikut adalah analogi yang bagus untuk membantu Anda memahami apa yang telah dikatakan tentang dinamika di atas. Bayangkan saja server web sebagai mobil yang melaju di jalan raya, NGINX perlu berhenti untuk mengganti ban dan mengubah warna cat; Envoy dapat mengganti ban dan warna sambil berjalan; dan OpenResty, selain kemampuan sebelumnya, juga dapat berubah menjadi SUV tanpa perlu berhenti.
Setelah menguasai kemampuan ajaib ini, lingkup kompetensi dan imajinasi OpenResty telah meluas ke bidang lain, seperti Serverless dan Edge computing.
Apa yang Harus Dipelajari?
Setelah membahas begitu banyak fitur penting OpenResty, apa yang harus kita pelajari? Saya lebih suka fokus pada garis utama daripada mencoba memahami semuanya sehingga kita dapat membangun sistem pengetahuan dengan konteks yang jelas.
Anda harus tahu bahwa tidak peduli seberapa komprehensif sebuah kursus, tidak mungkin mencakup semua masalah dan tidak dapat langsung membantu Anda menyelesaikan setiap bug dan pengecualian online.
Kembali ke studi OpenResty, menurut saya, jika Anda ingin mempelajari OpenResty dengan baik, Anda harus memahami delapan poin kunci berikut:
- Model pemrograman sinkron non-blocking
- Peran fase Request/Response yang berbeda
- Perbedaan antara LuaJIT dan Lua
- API OpenResty dan perpustakaan sekitarnya
- Coroutine dan cosocket
- Framework pengujian unit dan alat pengujian kinerja
- Flame graph dan rangkaian alat sekitarnya
- Optimasi kinerja
Poin-poin tersebut sangat penting dalam studi kita, dan saya akan membahasnya secara terpisah di setiap bab. Namun, dalam proses pembelajaran, saya harap Anda dapat menarik kesimpulan dari satu kasus dan membaca beberapa bab secara mendalam sesuai dengan minat dan latar belakang Anda.
Jika Anda adalah pemula dengan OpenResty, Anda dapat mengikuti perkembangan kursus, menginstal OpenResty di lingkungan Anda, dan menjalankan serta memodifikasi contoh kode. Ingat, fokus Anda adalah membangun gambaran besar OpenResty, bukan terjebak pada satu titik pengetahuan. Tentu saja, jika Anda memiliki pertanyaan, jangan ragu untuk menghubungi kami dalam obrolan langsung.
Jika Anda menggunakan OpenResty dalam proyek Anda, itu bagus! Namun, saya percaya bahwa ketika Anda membaca bab LuaJIT dan optimasi kinerja, Anda akan memiliki lebih banyak resonansi dan aplikasi praktis serta melihat peningkatan kinerja sebelum dan setelah optimasi dalam proyek Anda.
Selain itu, jika Anda ingin berkontribusi kode ke OpenResty dan perpustakaan sekitarnya, hambatan terbesar bukanlah memahami prinsip-prinsip OpenResty atau cara menulis modul C NGINX, tetapi kasus uji dan spesifikasi kode. Saya telah melihat terlalu banyak kontributor OpenResty (termasuk saya sendiri) yang berulang kali memodifikasi kasus uji dan gaya kode pada PR, dan ada terlalu banyak aturan tidak tertulis. Jadi, bagian spesifikasi kode dan pengujian unit dalam kursus ini adalah untuk Anda.
Dan jika Anda adalah seorang insinyur QA, bahkan jika Anda tidak menggunakan OpenResty, framework pengujian dan rangkaian alat analisis kinerja OpenResty akan memberi Anda banyak inspirasi. Bagaimanapun, investasi dan akumulasi OpenResty dalam pengujian cukup dalam.