เขียน Cron Job และ Scheduler ด้วย Go

Sharing is caring!

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

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *