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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุผลที่มี context.Context
- WithCancel และ WithTimeout
- WithDeadline และ WithValue
- Context ในการเรียกใช้ HTTP และฐานข้อมูล