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