Panduan baharu berpusatkan Laravel menunjukkan kepada pembangun cara untuk mengelakkan bot Telegram daripada mengalami masa tamat (timeout), menduplikasi tindakan, atau terhenti (crash) di bawah bebanan dengan mengamankan webhook, menggunakan Redis untuk idempotensi dan memindahkan kerja berat ke dalam barisan (queues).
Mengapa webhook Telegram memerlukan lebih daripada sekadar laluan (route) ringkas
Telegram menghantar setiap interaksi pengguna kepada bot sebagai HTTP POST ke URL yang ditentukan oleh pembangun. Platform tersebut menjangkakan 200 OK dalam masa beberapa saat; jika lebih lama, ia akan mencuba semula permintaan tersebut. Percubaan semula bermakna update_id yang sama boleh tiba berkali-kali, dan jika bot menulis ke pangkalan data atau memanggil API luaran di dalam permintaan tersebut, ia boleh menghasilkan baris pendua, mesej berganda, atau keadaan perlumbaan (race conditions). Bagi bot yang mengendalikan berpuluh atau beratus mesej sesaat, kependaman (latency) tersebut akan menjadi penghalang dengan cepat.
1. Kunci titik akhir (endpoint) dengan pengepala rahsia
Telegram menambah pengepala X-Telegram-Bot-Api-Secret-Token pada setiap panggilan webhook. Bandingkan pengepala tersebut dengan rahsia yang disimpan pada pelayan—menggunakan fungsi hash_equals PHP untuk mengelakkan serangan masa (timing attacks)—dan tolak sebarang permintaan yang tidak berasal daripada Telegram. Dalam Laravel, letakkan semakan ini dalam middleware supaya pengesahan dijalankan sebelum pengawal (controller) menyentuh payload.
2. Jadikan setiap kemas kini bersifat idempotensi dengan Redis
Setiap payload yang masuk membawa update_id yang unik. Panduan ini mencadangkan penulisan ID tersebut ke Redis dengan bendera NX (set-if-not-exists). Operasi tersebut hanya berjaya untuk kejadian pertama; percubaan semula akan mendapati kunci tersebut sudah ada dan webhook boleh segera mengembalikan 200 OK, menandakan kepada Telegram bahawa kemas kini telah dikendalikan. Oleh kerana Redis berada dalam memori, semakan tersebut hampir tidak menambah kependaman, dan kunci tersebut kekal untuk mengesan pendua.
3. Serahkan kerja berat kepada tugasan latar belakang (background jobs)
Walaupun dengan semakan Redis yang pantas, logik perniagaan bot—penulisan pangkalan data, panggilan API pihak ketiga, komposisi mesej—tidak sepatutnya dijalankan di dalam permintaan webhook. Hantar (dispatch) tugasan beratur (queued job) Laravel sebaik sahaja webhook disahkan dan update_id disimpan. Hantar respons HTTP dengan serta-merta, membiarkan pekerja (worker) memproses tugasan mengikut rentaknya sendiri. Ini memastikan bot kekal dalam tempoh masa respons Telegram dan menghalang platform daripada melakukan percubaan semula.
Penambahbaikan gred pengeluaran (production-grade)
- Hormati had kadar (rate limits). Telegram mengembalikan 429 Too Many Requests dengan pengepala
Retry-Afterapabila bot melebihi had sesaatnya. Pekerja barisan (queue workers) harus membaca pengepala tersebut dan berhenti seketika sebelum mencuba semula tugasan yang gagal. - Simpan (persist) sebelum anda membalas. Tulis sebarang data pengguna ke pangkalan data terlebih dahulu; hanya selepas komit (commit) yang berjaya, bot harus menghantar mesej pengesahan. Susunan ini mengelakkan senario di mana mesej sampai kepada pengguna tetapi rekod yang berkaitan tidak pernah wujud.
- Ringkaskan payload callback. Telegram mengehadkan
callback_datakepada 64 bait. Simpan blob yang lebih besar dalam pangkalan data dan hanya hantar ID rujukan dalam payload butang untuk kekal dalam had tersebut.
Kesimpulannya: Mengesahkan permintaan, menghapuskan pendua dengan Redis, dan memindahkan kerja ke barisan (queues) membolehkan pembangun Laravel membina bot Telegram yang menjawab dengan serta-merta, kekal dalam had kadar, dan berkembang secara bersih apabila permintaan pengguna meningkat.
