GoDasturchi
HTTP API for Task Queue

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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