ในการพัฒนาโปรแกรมที่ต้องทำงานแบบอัตโนมัติเป็นระยะเวลา เช่น การสั่งส่งอีเมลทุกเช้า หรือเรียก API ทุก 10 นาที เรามักใช้สิ่งที่เรียกว่า “Cron Job” หรือ “Scheduler” และในภาษา Go ก็มีเครื่องมือที่สะดวกและรวดเร็วให้เราใช้งาน ทั้งแบบ manual ด้วย time package และแบบ advance ด้วย robfig/cron
📌 Cron Job คืออะไร?
- เป็นงานที่ถูกตั้งเวลาให้ทำงานซ้ำตามช่วงเวลาที่กำหนด
- รูปแบบเวลาจะใช้ cron expression เช่น
*/5 * * * *
(ทุก 5 นาที) - นิยมใช้ในระบบ server, automation, microservices หรือ data pipeline
🔧 วิธีที่ 1: ใช้ time.Ticker สร้าง scheduler
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() for t := range ticker.C { fmt.Println("🕑 Job running at:", t) } }
ข้อดีคือใช้งานง่าย เหมาะกับ task ที่ต้องทำงานซ้ำทุก ๆ N วินาที/นาที แต่ไม่สามารถตั้งเวลาแบบละเอียดเหมือน cron ได้
🧰 วิธีที่ 2: ใช้ robfig/cron
ติดตั้ง:
go get github.com/robfig/cron/v3
📜 ตัวอย่างการใช้งาน
package main import ( "fmt" "time" "github.com/robfig/cron/v3" ) func main() { c := cron.New() // ทุกนาที c.AddFunc("* * * * *", func() { fmt.Println("🟢 Job ทุกนาที:", time.Now()) }) // ทุกวันตอนเที่ยงคืน c.AddFunc("0 0 * * *", func() { fmt.Println("🌙 Job เที่ยงคืน:", time.Now()) }) c.Start() // รอไม่ให้ main ออกจากโปรแกรม select {} }
🧠 ความเข้าใจ cron expression
*/5 * * * *
= ทุก 5 นาที0 9 * * *
= 9 โมงเช้าทุกวัน30 22 * * 1-5
= 4 ทุ่มครึ่ง จันทร์ถึงศุกร์
🔁 Run แบบ Dynamic ด้วย parameter
func CreateJob(msg string) func() { return func() { fmt.Println("📦", msg, "at", time.Now()) } } func main() { c := cron.New() c.AddFunc("@every 10s", CreateJob("โหลดข้อมูล API")) c.Start() select {} }
📈 Use Cases
- ส่งอีเมลแจ้งเตือนรายวัน
- เก็บ log backup ทุกเที่ยงคืน
- เรียก API เช็คสถานะเซิร์ฟเวอร์ทุก 30 วินาที
- Trigger งานเบื้องหลังใน microservice
🚀 ข้อดีของ robfig/cron
- ตั้งเวลาได้ละเอียด
- รองรับ time zone
- จัดการหลาย job พร้อมกันได้
- รองรับทั้ง cron expression และ interval
🔐 ข้อควรระวัง
- อย่าลืม
select {}
ป้องกัน main จบก่อน - ควร log หรือ recover panic ภายใน job
- อย่ามีงานที่ใช้เวลานานเกินหรือ block job อื่น
📚 สรุป
การเขียน Cron Job หรือ Scheduler ด้วย Go ทำได้ง่ายมาก โดยใช้ทั้ง time.Ticker
สำหรับงาน loop ซ้ำ และ robfig/cron
สำหรับงานที่ต้องการความยืดหยุ่นของเวลา เหมาะกับงาน automation, backend service และ data sync อย่างยิ่ง
🔗 แหล่งอ้างอิง
📝 ข้อความสำหรับ SEO
Go cron job ภาษาไทย | สร้าง scheduler ด้วย Go | robfig/cron go ภาษาไทย | automation ด้วย Go | cron expression go