Lua Academy · บทเรียน

Cosocket และ TCP แบบไม่บล็อก

ใช้ ngx.socket.tcp สำหรับการเชื่อมต่อแบ็กเอนด์แบบอะซิงโครนัสใน content_by_lua

บทเรียน 3 จาก 413 ขั้นตอน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สถาปัตยกรรม OpenResty
  2. การจัดการคำขอ HTTP ใน Lua
  3. Cosocket และ TCP แบบไม่บล็อก
  4. พจนานุกรมหน่วยความจำใช้ร่วมกัน
← กลับไปที่ Lua Academy