การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง
ใช้ HEALTHCHECK, tini และการจัดการสัญญาณในคอนเทนเนอร์
การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปลายทางตรวจสอบสถานะ
ปลายทางตรวจสอบสถานะช่วยให้ตัวจัดสรรโหลดและตัวจัดการระบบตรวจสอบได้ว่าบริการยังทำงานอยู่และพร้อมรับปริมาณการใช้งาน มีอยู่สองประเภทที่ใช้กันทั่วไป ได้แก่ liveness ซึ่งตรวจสอบว่ายังทำงานอยู่หรือไม่ และ readiness ซึ่งตรวจสอบว่าสามารถให้บริการคำขอได้หรือไม่
ปลายทาง liveness
ส่งคืน 200 OK หากกระบวนการยังทำงานอยู่ ตัวจัดการคำขอแบบง่ายที่ผ่านเสมอเพียงพอ เพราะการที่กระบวนการยังทำงานอยู่ถือว่าเพียงพอ:
mux.HandleFunc("/healthz/live", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
})ปลายทาง readiness
ส่งคืน 200 เฉพาะเมื่อบริการพร้อมใช้งาน เช่น เชื่อมต่อ DB แล้ว แคชอุ่นเครื่องแล้ว และการย้ายโครงสร้างเสร็จสิ้น หากอยู่ระหว่างการเริ่มต้นหรืออยู่ในสถานะลดความสามารถ จะส่งคืน 503:
mux.HandleFunc("/healthz/ready", func(w http.ResponseWriter, r *http.Request) {
if err := db.PingContext(r.Context()); err != nil {
w.WriteHeader(http.StatusServiceUnavailable); return
}
w.WriteHeader(http.StatusOK)
})โพรบของ Kubernetes
กำหนดโพรบ liveness และ readiness ในข้อกำหนด Deployment ของ Kubernetes:
livenessProbe:
httpGet: { path: /healthz/live, port: 8080 }
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet: { path: /healthz/ready, port: 8080 }
initialDelaySeconds: 3
periodSeconds: 5การปรับ GOMAXPROCS
ในคอนเทนเนอร์ GOMAXPROCS จะมีค่าเริ่มต้นเป็นจำนวน CPU ของโฮสต์ ไม่ใช่ขีดจำกัด CPU ของคอนเทนเนอร์ ให้ใช้ go.uber.org/automaxprocs เพื่อตั้งค่าอย่างถูกต้องจากขีดจำกัดของ cgroup
import _ "go.uber.org/automaxprocs"ขีดจำกัดหน่วยความจำ
ตั้งค่า GOMEMLIMIT (Go 1.19 ขึ้นไป) ให้เท่ากับขีดจำกัดหน่วยความจำของคอนเทนเนอร์ เพื่อให้ GC ใช้หน่วยความจำได้มากขึ้นก่อนที่ตัวหยุดกระบวนการ OOM จะทำงาน:
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024) // 512 MiBการปรับ GC
ตั้งค่า GOGC เพื่อควบคุมความถี่ของ GC ค่าเริ่มต้นคือ 100 ซึ่งหมายถึงทำ GC เมื่อฮีปมีขนาดเพิ่มเป็นสองเท่า ค่าที่ต่ำลงจะลดการใช้หน่วยความจำแต่ทำให้ GC ทำงานบ่อยขึ้น ส่วนค่าที่สูงขึ้นจะแลกกับการใช้หน่วยความจำมากขึ้นเพื่อให้ GC ทำงานน้อยลง
os.Setenv("GOGC", "200") // allow heap to grow 2× before GCการปรับพูลการเชื่อมต่อ
ตั้งค่าขีดจำกัดของพูลการเชื่อมต่อฐานข้อมูลให้เหมาะสมกับขีดจำกัดทรัพยากรของคอนเทนเนอร์และค่า max_connections ของฐานข้อมูล:
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(5 * time.Minute)การเปิดเผยเมตริก
เปิดเผยเมตริกของ Prometheus บนพอร์ตแยกต่างหาก ไม่ใช่พอร์ต API หลัก เพื่อป้องกันข้อมูลภายในรั่วไหลไปยังไคลเอ็นต์ภายนอก:
go func() {
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":9090", nil)
}()การปิดระบบอย่างสุภาพใน Kubernetes
ตั้งค่า terminationGracePeriodSeconds ในข้อกำหนดของพ็อด เพื่อให้มีเวลาเพียงพอสำหรับหมดเวลาการปิดระบบ เมื่อได้รับ SIGTERM ให้ส่งคืน 503 จากโพรบ readiness ทันที
การทำโพรไฟล์ในสภาพแวดล้อมจริง
เปิดใช้ pprof บนพอร์ตที่ไม่เปิดเผยต่อสาธารณะและมีการยืนยันตัวตน อย่าเปิดเผยพอร์ตนี้ต่อสาธารณะ เพราะจะเปิดเผยสถานะภายในและอาจถูกใช้เพื่อทำให้บริการหยุดชะงักด้วย DoS
ตรวจสอบความเข้าใจ
เหตุใดจึงควรตั้งค่า GOMAXPROCS ตามขีดจำกัด CPU ของคอนเทนเนอร์ แทนที่จะใช้จำนวน CPU ของโฮสต์
สรุป: การตรวจสอบสถานะและการปรับแต่งสำหรับสภาพแวดล้อมจริง
ประเด็นสำคัญ:
- Liveness: กระบวนการยังทำงานอยู่ Readiness: บริการสามารถรองรับปริมาณการใช้งานได้
- automaxprocs ตั้งค่า GOMAXPROCS จากขีดจำกัด CPU ของคอนเทนเนอร์
- GOMEMLIMIT ป้องกันการหยุดกระบวนการจาก OOM ส่วน GOGC ใช้ปรับความถี่ของ GC
- เปิดเผยเมตริกบนพอร์ตแยกที่เข้าถึงได้เฉพาะภายใน
คำถามที่พบบ่อย
บทเรียน “การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง”
ใช้ HEALTHCHECK, tini และการจัดการสัญญาณในคอนเทนเนอร์ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้าง Docker หลายขั้นตอนสำหรับ Go
- การกำหนดค่าสภาพแวดล้อมและข้อมูลลับ
- Docker Compose สำหรับการพัฒนาในเครื่อง
- การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง