Как работает алгоритм uber-go / ratelimit?

#go #rate-limiting

# #Вперед #ограничение скорости

Вопрос:

Я пытался понять реализацию ratelimit с открытым исходным кодом от uber, но немного запутался

полный код выглядит следующим образом:

 // Take blocks to ensure that the time spent between multiple
// Take calls is on average time.Second/rate.
func (t *limiter) Take() time.Time {
    newState := state{}
    taken := false
    for !taken {
        now := t.clock.Now()

        previousStatePointer := atomic.LoadPointer(amp;t.state)
        oldState := (*state)(previousStatePointer)

        newState = state{}
        newState.last = now

        // If this is our first request, then we allow it.
        if oldState.last.IsZero() {
            taken = atomic.CompareAndSwapPointer(amp;t.state, previousStatePointer, unsafe.Pointer(amp;newState))
            continue
        }

        // sleepFor calculates how much time we should sleep based on
        // the perRequest budget and how long the last request took.
        // Since the request may take longer than the budget, this number
        // can get negative, and is summed across requests.
        newState.sleepFor  = t.perRequest - now.Sub(oldState.last)
        // We shouldn't allow sleepFor to get too negative, since it would mean that
        // a service that slowed down a lot for a short period of time would get
        // a much higher RPS following that.
        if newState.sleepFor < t.maxSlack {
            newState.sleepFor = t.maxSlack
        }
        if newState.sleepFor > 0 {
            newState.last = newState.last.Add(newState.sleepFor)
        }
        taken = atomic.CompareAndSwapPointer(amp;t.state, previousStatePointer, unsafe.Pointer(amp;newState))
    }
    t.clock.Sleep(newState.sleepFor)
    return newState.last
}
 

Я понял, что это алгоритм без блокировки, но я мало знаю об этой теме.

приветствуется, если кто-нибудь случайно узнал этот алгоритм и предложил мне несколько ответов / документов / блогов.

Комментарии:

1. извините, мой вопрос на самом деле пытается понять, почему это алгоритм без блокировки.

2. Возможно, тогда стоит обновить свой вопрос

3. да, и спасибо за совет.

4. Это не какой-то причудливый «алгоритм без блокировки», это просто какой-то танец CAS, имитирующий мьютекс.

5. разве CAS не является частью неблокирующего алгоритма?