exchangepace

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: 4 Imported by: 0

Documentation

Overview

Package exchangepace — темп «запросов в секунду на ключ» у поверхности выдачи (kaname#315): ведро в одну секунду объявленного темпа.

Держит две оси приёмки ceremony-pace-is-named-by-number.md: П2 — обменов в секунду на ЗАЯВЛЕННЫЙ идентификатор клиента (машинные полосы токен-эндпоинта; тратят только принятые предъявления — вызывающий возвращает бронь) и П4 — запросов авторизации в секунду на источник (точка авторизации; тратит всякий запрос, прошедший проверку метода, — бронь не возвращается).

Бронь, а не «спросить» и «списать»

Решение и его следствие — ОДНА операция: Pace.Reserve сам списывает обмен и сам отвечает, остался ли он. Отдельного вопроса «есть ли темп» на пути решения нет: разнесённые, вопрос и списание пропускают параллельные запросы сверх темпа, и потолок становится «темп × параллелизм».

Списанное возвращается вызывающим, когда обмен НЕ состоялся (отвергнут до принятия предъявления). Так темп клиента тратят только принятые предъявления: предъявитель без ключа клиента, назвавший чужой идентификатор, держит бронь лишь пока его проверяют, и чужой темп не расходует.

Ведро и его запас

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

Память ограничена числом обменивавшихся, а не числом заявленных

Ключ ведра — ЗАЯВЛЕННЫЙ идентификатор, и заявить можно любой. Поэтому ведро, вернувшееся к полному, удаляется: полное ведро неотличимо от отсутствующего. Возвращённая бронь (отвергнутый обмен) оставляет полное ведро — и строки не оставляет. Удержанная бронь пополняется за горизонт в одну секунду; проход уборки идёт, когда таблица удвоилась с прошлого прохода либо горизонт прошёл, поэтому в таблице живут только обменивавшиеся за последний горизонт.

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

Ведро живёт в памяти процесса. Несколько реплик за балансировщиком дают клиенту до «темп × число реплик»: величина объявляется в расчёте на реплику, и это сказано в описании ручки.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Pace

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

Pace — темп обменов по ключу.

func New

func New(perSec int, now func() time.Time) (*Pace, error)

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

func (*Pace) PerSecond

func (p *Pace) PerSecond() int

PerSecond — объявленный темп в секунду: ёмкость ведра и скорость его пополнения.

func (*Pace) Reserve

func (p *Pace) Reserve(key string) (refund func(), retryAfter time.Duration, ok bool)

Reserve списывает один обмен по ключу.

ok=false — темп исчерпан; retryAfter — время до одного целого обмена, и refund в этом случае nil: возвращать нечего. ok=true — обмен списан; refund возвращает его, если обмен не состоялся. Повторный вызов refund холост.

Jump to

Keyboard shortcuts

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