#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 не является частью неблокирующего алгоритма?