QStash เป็น task scheduler และ message queue system ที่ออกแบบสำหรับ serverless environments มันเป็นเครื่องมือมีค่าให้นักพัฒนา เพราะช่วยให้ตั้งค่า automated workflows ที่รันในช่วงเวลาเฉพาะ ได้ทั้งครั้งเดียวหรือซ้ำๆ โดยไม่ต้องกังวลเรื่องการจัดการ state
คุณลองเล่นบน QStash console ได้ เพื่อรู้จักวิธีสร้าง request:

The Use Case
ผลิตภัณฑ์ของผม GPT Hotline คือ ChatGPT บน WhatsApp (ใช้ underlying model เดียวกัน) คุณส่งข้อความให้บอทบนเบอร์เฉพาะได้เหมือนบน ChatGPT app
GPT Hotline มีฟีเจอร์เพิ่มเติมนอกจากแค่ส่งข้อความ เช่น image search, video search, และ news นอกจากนี้ ผมอยากเพิ่มฟีเจอร์ reminders ให้ผู้ใช้ส่งข้อความให้บอทเพื่อรับข้อความในเวลาที่กำหนด
Flow เรียบง่าย: ส่งข้อความให้บอท เพื่อส่งข้อความกลับมาในเวลาที่กำหนด จะหน้าตาประมาณนี้:

ผมเคยใช้ Upstash สำหรับ serverless Redis มาก่อน จึงรู้จัก QStash ประมาณนิดหน่อย และดูเหมือนโอกาสดีในการเรียนรู้เพิ่มเติม!
Let's Dive In
High-level workflow ที่เราอยาก code:
User ส่ง reminder message → QStash job ถูก setup → QStash trigger API ในเวลาที่กำหนด → ส่งข้อความให้ user
เพื่อให้เรียบง่าย ผมจะ focus แค่ QStash code GPT Hotline มี "Power Commands" ที่ override bot's default response คำสั่งตั้ง reminder format ดังนี้:
sudo reminder <TIME-INTERVAL> <MY-MESSAGE>
ตัวอย่าง ถ้าส่งข้อความ:
sudo reminder 3h go for a walk
คำสั่ง "sudo reminder" จะ trigger reminder code และ "3h" บ่งบอกว่าอยากให้ reminder ("go for a walk") ส่งในอีก 3 ชั่วโมง
GPT Hotline สร้างด้วย Next.js ดังนั้นเราสามารถ trigger QStash ได้หลายวิธี พวกเขามี verifySignature function สำหรับ authenticate แต่เราจะใช้ REST API approach เพื่อความเรียบง่าย
// Note: มี CURL Command examples ใน QStash docs
const YOUR_API_URL = "https://api.example.com";
const MY_MESSAGE = "go for a walk";
const REMINDER_TIME = "3h";
const MESSENGER = "1800-MCDONALDS";
await fetch(`https://qstash.upstash.io/v1/publish/${YOUR_API_URL}`, {
headers: {
Authorization: `Bearer ${process.env.QSTASH_TOKEN}`,
"Upstash-Delay": REMINDER_TIME,
"Content-Type": "application/json",
},
method: "POST",
body: JSON.stringify({
message: MY_MESSAGE,
messenger: MESSENGER,
}),
});
นี่คือตัวอย่าง fetch request ที่ส่งไป QStash ผม hardcode values และลบ extra fields แต่เป็น representation ที่ดีของ actual fetch request ในแอป
QStash ต้องการ URL เพื่อส่งข้อความไป นี่คือ API URL ที่เราอยาก trigger ในเวลาที่กำหนด
ค่า Upstash-Delay กำหนดเวลาส่งข้อความ รับค่าเป็น seconds (s), minutes (m), hours (h), และ days (d) เช่น 30m คือ 30 นาที 2d คือ 2 วัน ถ้าอยาก setup job ที่รัน periodically แทนครั้งเดียว ใช้ field Upstash-Cron ด้วย cron logic
เราส่ง message ใน body พร้อมเบอร์ผู้รับ (messenger) และ authenticate ด้วย QSTASH_TOKEN ที่ตั้งเป็น environment variable
แค่นี้! ถ้าทำงานตามคาด จะได้ confirmation ว่า reminder ถูกตั้งค่า และ QStash จะ trigger API ในเวลาที่ตั้งไว้ พร้อม message และ messenger values (ซึ่งจะส่ง reminder ให้ผู้รับ)
สรุป
ผมเลื่อนฟีเจอร์นี้มานานเพราะคิดว่าจะซับซ้อน แต่ด้วย QStash ทำเสร็จในแค่คืนเดียว!
แนะนำให้ลองดู พวกเขามี Free Tier ใหญ่ 500 messages/day เริ่มใช้ได้เลย และจ่ายตอนแอป scale เท่านั้น ไม่มีเหตุผลไม่ลอง
Cheers, Bilal
sudo reminder 1m Good Luck!
