ในการพัฒนาโปรแกรมที่ต้องทำงานแบบอัตโนมัติเป็นระยะเวลา เช่น การสั่งส่งอีเมลทุกเช้า หรือเรียก 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