Cosocket และ TCP แบบไม่บล็อก
ใช้ ngx.socket.tcp สำหรับการเชื่อมต่อแบ็กเอนด์แบบอะซิงโครนัสใน content_by_lua
Cosocket และ TCP แบบไม่บล็อก เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
โคซ็อกเก็ตคืออะไร
โคซ็อกเก็ตของ OpenResty คือซ็อกเก็ต TCP/UDP แบบไม่บล็อกที่ทำงานร่วมกับลูปเหตุการณ์ของ Nginx เมื่อรอข้อมูล โคซ็อกเก็ตจะพักโครูทีน ทำให้กระบวนการทำงานสามารถไปรองรับคำขออื่นได้
การสร้างโคซ็อกเก็ต TCP
ใช้ ngx.socket.tcp() เพื่อสร้างโคซ็อกเก็ต การเชื่อมต่อ การส่ง และการรับข้อมูลจะพักการทำงานโดยอัตโนมัติเมื่ออินพุต/เอาต์พุตอาจถูกบล็อก
-- 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)
endการส่งข้อมูล
sock:send(data) ส่งสตริง และส่งคืนจำนวนไบต์ที่ส่งหรือ nil + ข้อผิดพลาด
local bytes, err = sock:send("PING\r\n")
if not bytes then
ngx.log(ngx.ERR, "Send error: ", err)
endการรับข้อมูล
sock:receive(pattern) อ่านข้อมูล รูปแบบที่ใช้ได้มีดังนี้: "*l" อ่านหนึ่งบรรทัด "*a" อ่านทั้งหมดจนกว่าจะปิดการเชื่อมต่อ และตัวเลขจะอ่านไบต์ให้ได้ตรงตามจำนวน N
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)การกำหนดเวลาหมด
กำหนดเวลาหมดสำหรับการเชื่อมต่อ การส่ง และการรับ เพื่อป้องกันการค้าง
sock:settimeout(1000) -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000) -- connect, send, receive (ms)พูลการเชื่อมต่อ
sock:setkeepalive(timeout, pool_size) นำซ็อกเก็ตกลับไปไว้ในพูลเพื่อใช้ซ้ำ ซึ่งมีความสำคัญต่อประสิทธิภาพของ Redis/MySQL
sock:setkeepalive(60000, 100) -- 60s timeout, pool size 100การส่งคำขอ HTTP
ใช้งานคำขอ GET แบบ HTTP/1.0 อย่างง่ายโดยใช้โคซ็อกเก็ต
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
endโคซ็อกเก็ต UDP
ngx.socket.udp() สร้างโคซ็อกเก็ต UDP ซึ่งมีประโยชน์สำหรับการรายงานเมตริกของ statsd
local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")รูปแบบการจัดการข้อผิดพลาด
เมธอดโคซ็อกเก็ตทั้งหมดใช้รูปแบบตามธรรมเนียมของ Lua คือส่งคืน nil + ข้อความข้อผิดพลาดเมื่อทำงานล้มเหลว ควรตรวจสอบค่าที่ส่งคืนทั้งสองค่าเสมอ
ข้อจำกัดของโคซ็อกเก็ต
ไม่สามารถใช้โคซ็อกเก็ตใน init_by_lua, set_by_lua และ header_filter_by_lua ได้ ให้ใช้เฉพาะในระยะ content, access และ rewrite
การเปรียบเทียบประสิทธิภาพ
โคซ็อกเก็ตมีอัตรารับส่งข้อมูลเทียบเท่ากับโค้ด C ที่ใช้ epoll โดยตรง เนื่องจากใช้กลไกอินพุต/เอาต์พุตของ Nginx โดยตรง และไม่มีค่าใช้จ่ายเพิ่มเติมจากเธรดหรือกระบวนการ
คำถามเกี่ยวกับโคซ็อกเก็ต
จะเกิดอะไรขึ้นเมื่อโคซ็อกเก็ตกำลังรอข้อมูลจากเซิร์ฟเวอร์ที่ตอบสนองช้า
ทบทวน: โคซ็อกเก็ตและ TCP แบบไม่บล็อก
โคซ็อกเก็ตของ OpenResty ให้บริการ TCP/UDP แบบไม่บล็อกและพักการทำงานระหว่างอินพุต/เอาต์พุต ทำให้รองรับการทำงานพร้อมกันจำนวนมาก ใช้ setkeepalive สำหรับการรวมกลุ่มการเชื่อมต่อ กำหนดเวลาหมดเพื่อป้องกันการค้าง และใช้งานได้เฉพาะในระยะ content/access/rewrite
เรียนรู้ Lua ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 40
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “Cosocket และ TCP แบบไม่บล็อก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Cosocket และ TCP แบบไม่บล็อก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Cosocket และ TCP แบบไม่บล็อก”
ใช้ ngx.socket.tcp สำหรับการเชื่อมต่อแบ็กเอนด์แบบอะซิงโครนัสใน content_by_lua คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “Cosocket และ TCP แบบไม่บล็อก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สถาปัตยกรรม OpenResty
- การจัดการคำขอ HTTP ใน Lua
- Cosocket และ TCP แบบไม่บล็อก
- พจนานุกรมหน่วยความจำใช้ร่วมกัน