Ответ
RPS (Requests Per Second) — это ключевая метрика производительности, которая показывает, сколько запросов (например, HTTP-запросов) система способна обработать за одну секунду.
Она используется для:
- Оценки пропускной способности: Понять, какую нагрузку может выдержать сервис.
- Нагрузочного тестирования: Определить пределы производительности и найти узкие места.
- Планирования ресурсов: Рассчитать необходимое количество серверов или ресурсов для обработки ожидаемого трафика.
RPS vs Latency
Важно анализировать RPS в связке с latency (задержкой) — временем ответа на один запрос. Высокий RPS при высокой задержке может означать, что система обрабатывает много запросов, но каждый из них выполняется медленно, что плохо для пользовательского опыта.
Факторы, влияющие на RPS в Go:
- Производительность приложения: Эффективность алгоритмов, минимизация аллокаций памяти, правильное использование конкурентности (горутин и каналов).
- Взаимодействие с базой данных: Оптимизация запросов, использование индексов, пулов соединений и кэширования.
- Сетевая инфраструктура: Пропускная способность сети и задержки.
- Производительность зависимых сервисов: Если ваш сервис обращается к другим API, их скорость напрямую влияет на ваш RPS.
Пример измерения в Go
Хотя прямых инструментов для измерения RPS в стандартной библиотеке нет, можно использовать бенчмарки для оценки производительности обработчика, что косвенно связано с RPS.
// handler_test.go
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func handler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}
// Бенчмарк измеряет, сколько операций (обработок запроса) может быть выполнено в секунду.
func BenchmarkHandler(b *testing.B) {
req := httptest.NewRequest("GET", "/", nil)
rec := httptest.NewRecorder()
// b.N — это количество итераций, которое определяет сам фреймворк для получения статистически значимого результата.
for i := 0; i < b.N; i++ {
handler(rec, req)
}
}