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

การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง

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

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

  1. การสร้าง Docker หลายขั้นตอนสำหรับ Go
  2. การกำหนดค่าสภาพแวดล้อมและข้อมูลลับ
  3. Docker Compose สำหรับการพัฒนาในเครื่อง
  4. การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง
← กลับไปที่ Go Academy