HTTP API for Task Queue
Task Queue uchun HTTP API
Shu paytgacha qurgan Task Queue'imiz faqat Go kodi ICHIDA ishlatilardi. Endi uni tashqi dunyoga — boshqa dasturlarga yoki foydalanuvchilarga — HTTP orqali ochamiz: vazifa yaratish va uning holatini tekshirish uchun ikkita oddiy endpoint.
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"strings"
"sync"
)
type CreateTaskRequest struct {
Payload string `json:"payload"`
}
type CreateTaskResponse struct {
ID string `json:"id"`
}
type Store struct {
mu sync.Mutex
nextID int
statuses map[string]string
}
func NewStore() *Store {
return &Store{statuses: make(map[string]string)}
}
func (s *Store) Create() string {
s.mu.Lock()
defer s.mu.Unlock()
s.nextID++
id := fmt.Sprintf("task-%d", s.nextID)
s.statuses[id] = "pending"
return id
}
func makeCreateTaskHandler(store *Store) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req CreateTaskRequest
json.NewDecoder(r.Body).Decode(&req)
id := store.Create()
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(CreateTaskResponse{ID: id})
}
}
func main() {
store := NewStore()
handler := makeCreateTaskHandler(store)
body := `{"payload":"email yuborish"}`
req := httptest.NewRequest("POST", "/tasks", strings.NewReader(body))
rec := httptest.NewRecorder()
handler(rec, req)
fmt.Println(rec.Body.String())
}Bu — "Shorten Endpoint" darsida ko'rgan aynan shu naqsh: HTTP handler kerakli qismlarni (Store) PARAMETR sifatida oladi, JSON so'rovni o'qiydi, ichki mantiqni (store.Create()) chaqiradi, va JSON javob qaytaradi. Task Queue'ning "tashqi yuzi" — aynan shu oddiy REST endpoint'lar orqali ko'rinadi, garchi ICHKARIDA murakkab worker pool ishlayotgan bo'lsa ham.
Haqiqiy loyihada, store.Create() bilan bir vaqtda yaratilgan vazifa TaskQueuening kanaliga HAM yuborilardi ("Channel-Based Queue" darsini eslang) — bu yerda soddalik uchun faqat holatni saqlash qismini ko'rsatdik. Keyingi darsda butun tizimni (queue + worker pool + HTTP API) birlashtiramiz.
>_ Exercise
Vazifa holatini qaytaruvchi GET endpoint qo'shing.
- •makeGetStatusHandler(store *Store) http.HandlerFunc yozing: r.URL.Path'dan "/tasks/" prefiksini olib tashlab, ID'ni oling
- •store.statuses'dan status'ni qidiring: topilmasa http.StatusNotFound qaytaring
- •topilsa, fmt.Fprintf(w, "%s", status) yozing
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
HTTP API orqali Task Queue'ni tashqi dunyoga ochish — vazifa yaratish va uning holatini so'rash uchun oddiy, mustaqil endpoint'lar orqali amalga oshiriladi, ichki murakkablik (worker pool, retry) foydalanuvchidan yashiriladi.
NEXT UP
Graceful Shutdown
$ go run main.go
Kodingizni ishga tushiring