Cosocket dan TCP Non-Pemblokiran
Gunakan ngx.socket.tcp untuk koneksi backend asinkron dalam content_by_lua.
Cosocket dan TCP Non-Pemblokiran adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Apa Itu Cosocket?
Cosocket OpenResty adalah soket TCP/UDP non-pemblokiran yang terintegrasi dengan loop peristiwa Nginx. Saat menunggu data, cosocket menangguhkan coroutine sehingga pekerja dapat menangani permintaan lain.
Membuat Cosocket TCP
Gunakan ngx.socket.tcp() untuk membuat cosocket. Operasi koneksi, pengiriman, dan penerimaan semuanya otomatis menangguhkan coroutine saat I/O akan memblokir.
-- content_by_lua_block
local sock = ngx.socket.tcp()
local ok, err = sock:connect("redis.local", 6379)
if not ok then
ngx.log(ngx.ERR, "Connect failed: ", err)
return ngx.exit(500)
endMengirim Data
sock:send(data) mengirim string. Fungsi ini mengembalikan jumlah bita yang terkirim atau nil + kesalahan.
local bytes, err = sock:send("PING\r\n")
if not bytes then
ngx.log(ngx.ERR, "Send error: ", err)
endMenerima Data
sock:receive(pattern) membaca data. Pola: "*l" membaca satu baris, "*a" membaca semuanya sampai koneksi ditutup, sedangkan angka membaca tepat N bita.
local data, err = sock:receive("*l")
if not data then
ngx.log(ngx.ERR, "Receive error: ", err)
return ngx.exit(500)
end
ngx.say("Response: " .. data)Mengatur Batas Waktu
Atur batas waktu koneksi, pengiriman, dan penerimaan untuk mencegah proses menggantung.
sock:settimeout(1000) -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000) -- connect, send, receive (ms)Kumpulan Koneksi
sock:setkeepalive(timeout, pool_size) mengembalikan soket ke dalam kumpulan untuk digunakan kembali. Hal ini sangat penting bagi performa Redis/MySQL.
sock:setkeepalive(60000, 100) -- 60s timeout, pool size 100Membuat Permintaan HTTP
Implementasikan permintaan GET HTTP/1.0 sederhana menggunakan cosocket.
local function httpGet(host, path)
local sock = ngx.socket.tcp()
sock:connect(host, 80)
sock:send("GET " .. path .. " HTTP/1.0\r\nHost: " .. host .. "\r\n\r\n")
local resp = sock:receive("*a")
sock:close()
return resp
endCosocket UDP
ngx.socket.udp() membuat cosocket UDP. Cosocket ini berguna untuk pelaporan metrik statsd.
local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")Pola Penanganan Kesalahan
Semua metode cosocket mengikuti konvensi Lua: nil + string kesalahan saat terjadi kegagalan. Selalu periksa kedua nilai yang dikembalikan.
Batasan Cosocket
Cosocket tidak dapat digunakan dalam: init_by_lua, set_by_lua, header_filter_by_lua. Gunakan cosocket hanya dalam fase konten, akses, dan penulisan ulang.
Perbandingan Performa
Cosocket mencapai throughput yang sama dengan kode C mentah berbasis epoll karena langsung menggunakan mekanisme I/O Nginx. Tidak ada beban tambahan dari thread atau proses.
Pertanyaan tentang Cosocket
Apa yang terjadi saat cosocket menunggu data dari server yang lambat?
Ringkasan: Cosocket dan TCP Non-Pemblokiran
Cosocket OpenResty menyediakan TCP/UDP non-pemblokiran yang menangguhkan coroutine saat melakukan I/O, sehingga memungkinkan konkurensi tinggi. Gunakan setkeepalive untuk pengumpulan koneksi. Atur batas waktu agar proses tidak menggantung. Cosocket hanya tersedia dalam fase konten/akses/penulisan ulang.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Cosocket dan TCP Non-Pemblokiran” gratis?
Ya — teks lengkap “Cosocket dan TCP Non-Pemblokiran” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Cosocket dan TCP Non-Pemblokiran”?
Gunakan ngx.socket.tcp untuk koneksi backend asinkron dalam content_by_lua. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Cosocket dan TCP Non-Pemblokiran” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Arsitektur OpenResty
- Menangani Permintaan HTTP dalam Lua
- Cosocket dan TCP Non-Pemblokiran
- Kamus Memori Bersama