0Pricing
Go Academy · บทเรียน

Context ในการเรียกใช้ HTTP และฐานข้อมูล

ส่งต่อ context ไปตามสายโซ่การเรียกใช้

Context ในการเรียกใช้ HTTP และฐานข้อมูล เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

ไคลเอ็นต์ HTTP ที่ใช้บริบท

ส่งบริบทไปยังคำขอ HTTP ขาออกด้วย req.WithContext(ctx) คำขอจะถูกยกเลิกหากบริบทถูกยกเลิกก่อนที่จะได้รับการตอบกลับ

req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
    if errors.Is(err, context.DeadlineExceeded) {
        // timeout
    }
}

http.NewRequestWithContext

ควรใช้ http.NewRequestWithContext (Go 1.13+) แทนการสร้างคำขอแล้วเรียก WithContext เนื่องจากโค้ดสะอาดกว่าและหลีกเลี่ยงการจัดสรรหน่วยความจำชั่วคราว

การยกเลิกคำขอ HTTP

สร้างบริบทที่ยกเลิกได้ด้วย WithCancel ส่งบริบทนั้นไปยังคำขอ แล้วเรียก cancel เมื่อดำเนินการเสร็จหรือเมื่อเกิดข้อผิดพลาด ไคลเอ็นต์จะยุติการเชื่อมต่อ TCP

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)

database/sql กับบริบท

เมธอดทั้งหมดของ database/sql มีรูปแบบ *Context ได้แก่ QueryContext, ExecContext และ PrepareContext รูปแบบเหล่านี้จะยกเลิกคำค้นหาเมื่อบริบทเสร็จสิ้น

rows, err := db.QueryContext(ctx, "SELECT id FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()

การตรวจสอบบริบทก่อนค้นหา

ตรวจสอบบริบทก่อนเริ่มคำค้นหาที่ใช้เวลานาน เพื่อหยุดการทำงานทันทีหากคำขอถูกยกเลิกไปแล้ว

if err := ctx.Err(); err != nil {
    return err // context already done
}
rows, err := db.QueryContext(ctx, ...)

บริบทกับการจัดการพูลการเชื่อมต่อ

เมื่อบริบทถูกยกเลิกระหว่างคำค้นหา database/sql จะทำเครื่องหมายการเชื่อมต่อว่าเสียหายหากไดรเวอร์รองรับ เพื่อป้องกันไม่ให้การเชื่อมต่อที่มีปัญหากลับเข้าสู่พูล

gRPC และบริบท

gRPC ใช้บริบทเพื่อส่งต่อกำหนดเวลา ไคลเอ็นต์กำหนดเวลาในบริบท ส่วนเซิร์ฟเวอร์จะตรวจสอบกำหนดเวลานั้นเมื่อรับข้อมูลจากสตรีมแต่ละครั้ง นอกจากนี้ยังส่งข้อมูลเมตาผ่านบริบทด้วย

resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: id})

บริบทของคำขอขาเข้า

เซิร์ฟเวอร์ HTTP แนบบริบทเข้ากับคำขอขาเข้าแต่ละรายการผ่าน r.Context() บริบทนี้จะถูกยกเลิกเมื่อลูกค้าตัดการเชื่อมต่อ

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    result, err := db.QueryContext(ctx, query)
}

บริบทในสายโซ่มิดเดิลแวร์

มิดเดิลแวร์จะเพิ่มข้อมูลให้บริบทของคำขอ เช่น กำหนดเวลา ข้อมูลการยืนยันตัวตน หรือรหัสติดตาม จากนั้นส่งคำขอที่เพิ่มข้อมูลแล้วไปยังตัวจัดการถัดไป

การส่งต่อบริบทผ่านการเรียกใช้บริการ

ในสถาปัตยกรรมไมโครเซอร์วิส ควรแทรกรหัสติดตามจากบริบทของคำขอขาเข้าลงในส่วนหัว HTTP และ RPC ขาออกทั้งหมด เพื่อให้การติดตามแบบกระจายทำงานได้ครบตลอดเส้นทาง

การทดสอบด้วยบริบท

ในการทดสอบ ให้ใช้ context.Background() หรือ context.WithTimeout เพื่อป้องกันไม่ให้กอร์รูทีนรั่วไหลระหว่างกรณีทดสอบ

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ฟังก์ชันใดใช้สร้างคำขอ HTTP พร้อมแนบบริบท?

สรุป: บริบทใน HTTP และฐานข้อมูล

ประเด็นสำคัญ:

  • ใช้ http.NewRequestWithContext สำหรับการเรียกใช้ HTTP ขาออก
  • เมธอด *Context ของ database/sql จะยกเลิกคำค้นหาเมื่อบริบทเสร็จสิ้น
  • ใช้ r.Context() กับคำขอขาเข้า โดยจะถูกยกเลิกเมื่อลูกค้าตัดการเชื่อมต่อ
  • ส่งต่อบริบท (รวมถึงรหัสติดตาม) ผ่านการเรียกใช้บริการถัดไปทั้งหมด

คำถามที่พบบ่อย

บทเรียน “Context ในการเรียกใช้ HTTP และฐานข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Context ในการเรียกใช้ HTTP และฐานข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Context ในการเรียกใช้ HTTP และฐานข้อมูล”

ส่งต่อ context ไปตามสายโซ่การเรียกใช้ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “Context ในการเรียกใช้ HTTP และฐานข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุผลที่มี context.Context
  2. WithCancel และ WithTimeout
  3. WithDeadline และ WithValue
  4. Context ในการเรียกใช้ HTTP และฐานข้อมูล
← กลับไปที่ Go Academy