failurewindow

package
v0.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 27, 2026 License: AGPL-3.0 Imports: 3 Imported by: 0

Documentation

Overview

Package failurewindow — окно засчитанных отказов на ключ: ось П3 поверхности выдачи, «неудавшихся доказательств клиента за окно на источник» (приёмка ceremony-pace-is-named-by-number.md, Р5; kaname#315).

Решается при входе, растёт по исходу

Window.Admit судит ключ по счёту, набранному к моменту входа запроса, и ничего не списывает; Window.Record засчитывает отказ, когда он наступил. Разнести вопрос и запись здесь законно, а не гонка: засчитывается ИСХОД, и до исхода его не знает никто. Цена названа приёмкой (Р3): отвергаемые предъявления, допущенные одновременно при счёте ниже предела, выводят счёт за предел — не дальше числа одновременно допущенных, то есть потолка П1, — и срок ожидания это учитывает.

Окно скользит, срок — до «предел минус один»

Отказ в окне, пока с него прошло меньше длины окна; ровно через длину окна он из окна выходит. Не допущенному ключу называется срок до момента, когда в окне останется предел минус один отказ, — тогда следующий запрос будет допущен.

Память ограничена пределом, и ключ на пределе её не теряет

У ключа хранятся моменты его отказов в окне, по возрастанию, и не больше предела: допуск и срок решает отказ, предел-й с конца, а старейшие сверх него не решают ничего. Поэтому счёт за пределом (Р3) хранится пределом, и срок у него тот же, что у полного счёта.

Ключ, чьи отказы все вышли, неотличим от незаведённого и убирается: проходом по росту таблицы либо по прошествии окна с прошлого прохода. Отказы, вышедшие из окна, возвращают и своё место под моменты.

Ключ — адрес источника, и вызывающий, меняющий адрес, заводит ключ на каждый запрос. Поэтому засчитанных отказов в таблице, по всем ключам вместе, не больше MaxStoredFailures. Новому отказу, которому места нет, место освобождает ключ НИЖЕ предела: он забывается целиком, и его счёт начинается заново. Ключ НА пределе не забывается никогда — его отказ и срок переживают любой поток чужих источников. Ключ, отдающий место, ищется осмотром не больше [evictionProbes] ключей; когда среди осмотренных нет ключа ниже предела — таблица занята ключами на пределе, — новый отказ не засчитывается, пока место не освободит окно.

Величины — на процесс

Окно живёт в памяти процесса: за балансировщиком из N реплик источнику достаётся до N пределов. Величина объявляется в расчёте на реплику.

Index

Constants

View Source
const MaxStoredFailures = 1 << 18

MaxStoredFailures — предел засчитанных отказов в таблице, по всем ключам вместе.

Предел стоит на отказах, а не на ключах: место ключа растёт с числом его отказов, потолок которого — объявленный оператором предел оси, и предел на ключи оставил бы память функцией чужого числа. У всякого ключа в таблице есть хотя бы один отказ, поэтому ключей не больше этого числа.

Дороже всего отказ стоит у ключа с одним отказом. Замер на ключах — адресах IPv6 в 39 знаков, по одному отказу (TestWindowMemoryAtTheBudgetStaysBounded, go1.26): около 170 байт на отказ, то есть около 42 МиБ на таблицу, полную до предела. Это шестая часть резерва сверх проверок пароля, который страж старта требует у боевого профиля чарта (256 МиБ из 1280Mi, INSTALL.md).

Предел оси выше этого числа — отказ построения: ни один ключ не достиг бы своего предела, и ось молча не действовала бы.

Variables

This section is empty.

Functions

This section is empty.

Types

type Window

type Window struct {
	// contains filtered or unexported fields
}

Window — окно отказов по ключу.

func New

func New(limit int, window time.Duration, now func() time.Time) (*Window, error)

New собирает окно. Незаданная величина — ОТКАЗ ПОСТРОЕНИЯ: ноль означал бы «без ограничения», а величина, подставленная построением, стражу старта не видна.

func (*Window) Admit

func (w *Window) Admit(key string) (retryAfter time.Duration, ok bool)

Admit отвечает, допущен ли ключ по счёту, набранному к этому моменту.

ok=false — в окне не меньше предела; retryAfter — через сколько в окне останется предел минус один отказ. Срок положителен всегда.

func (*Window) Record

func (w *Window) Record(key string)

Record засчитывает отказ ключа в текущий момент.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL