Sobes.tech
Back to questions
Middle+
5

Зачем нужен mutex в rate limiter? Можно ли решить проблему без mutex, используя sync.Map?

Companies where asked
ООО Дэстэн Партнерс

Answer from AI

sobes.tech AI

Mutex (взаимное исключение) в rate limiter нужен для защиты общих данных от одновременного доступа нескольких горутин, чтобы избежать гонок данных и некорректного подсчёта запросов.

Например, если несколько горутин одновременно обновляют счётчик запросов, без mutex можно получить неправильное значение.

Использование sync.Map помогает избежать блокировок при чтении и записи в карту, но не гарантирует атомарность комплексных операций, таких как инкремент счётчика. Поэтому без дополнительной синхронизации (например, mutex или атомарных операций) проблему не решить.

Пример:

type RateLimiter struct {
    mu sync.Mutex
    requests map[string]int
}

func (r *RateLimiter) Allow(key string) bool {
    r.mu.Lock()
    defer r.mu.Unlock()
    count := r.requests[key]
    if count >= 10 {
        return false
    }
    r.requests[key] = count + 1
    return true
}

Если использовать sync.Map, то для атомарного обновления значения всё равно потребуется дополнительная синхронизация или атомарные операции, иначе возможны гонки.