← Все этапы
05 · ПРАКТИКАУрок 12 из 1290 мин

Проект: JSON API событий

Строим каталог событий и измеряем задержку чтения при росте набора данных.

Чтение каталога должно быть измеримым

Маршрут связывает HTTP-запрос с обработчиком, а JSON-кодировщик преобразует типизированные записи в ответ. Замерьте задержку чтения на фиксированном наборе событий до и после оптимизации, не меняя объём входных данных.

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"time"
)

type Event struct {
	ID string
	Name string
	StartsAt string
}

var events = []Event{
	{ID: "evt-1", Name: "Кинопоказ", StartsAt: "2026-10-01T18:00:00Z"},
	{ID: "evt-2", Name: "Лекция", StartsAt: "2026-10-02T16:30:00Z"},
}

func eventsHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodGet {
		http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
		return
	}
	started := time.Now()
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
	if err := json.NewEncoder(w).Encode(events); err != nil {
		log.Printf("encode events response: %v", err)
		return
	}
	log.Printf("events read completed in %s", time.Since(started))
}

func main() {
	http.HandleFunc("/events", eventsHandler)
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal(fmt.Errorf("serve events API: %w", err))
	}
}

Сначала получите базовые p50 и p95, затем меняйте один участок чтения за раз и повторяйте ту же серию запросов. Измеряйте задержку обработчика и отдельно следите за кодами ответа; содержимое событий в лог не записывайте.

Практика

Попробуйте сами

Создайте GET /events с полями id, name, startsAt и фильтром ?date=YYYY-MM-DD. Добавьте события evt-1 на 2026-10-01 и evt-2 на 2026-10-02; запрос без фильтра возвращает оба, а ?date=2026-10-01 — только evt-1. Затем заполните каталог 10 000 записями, выполните 1 000 одинаковых запросов списка до и после одного улучшения чтения и запишите p50/p95.

Проверка результата

Как понять, что получилось

Оба HTTP-ответа имеют статус 200 и валидный JSON: без фильтра два события, с date=2026-10-01 только evt-1. Для каждой версии записаны p50 и p95 по 1 000 запросам на тех же 10 000 записях; сравнение не заявляет улучшение, если измерения его не показывают.

Проект: JSON API событий | Go | WebSchool · Go