Documentation
¶
Overview ¶
Package tp - высокоуровневая библиотека для работы с очередями на базе queued: аналог перлового MR::TP.
Описание проекта, режимы работы и конфигурация - в README: https://github.com/adventures-team/go-tp/blob/master/docs/README.md
Index ¶
- Constants
- Variables
- func CalcShard(eventID uint64, shardNum uint) uint
- func EncodeEvent(event Event) (eventData []byte, err error)
- func Register[EvType Event, EvSlice ~[]EvType](q Queue, handler func(context.Context, EvSlice) error) error
- type BaseEvent
- func (BaseEvent) AddonID(incompatible)
- func (bev BaseEvent) Defer(ctx context.Context, delay time.Duration) error
- func (bev BaseEvent) Done()
- func (bev BaseEvent) GetEventID() queuedproto.EventID
- func (bev BaseEvent) HasCustomDefer() bool
- func (bev BaseEvent) IsDone() bool
- func (BaseEvent) MarshalAddon(incompatible)
- func (BaseEvent) MarshalIProto(incompatible)
- func (BaseEvent) MarshalerDisabled(incompatible)
- func (bev BaseEvent) Queue() Queue
- func (bev BaseEvent) Shard(shardNum uint) uint
- func (BaseEvent) UnmarshalAddon(incompatible)
- func (BaseEvent) UnmarshalIProto(incompatible)
- type Builder
- type DisableMarshaler
- type Event
- type EventIDBuilder
- type EventWithCreationTime
- type Handler
- func WithMaxAge[EvType EventWithCreationTime, EvSlice ~[]EvType](handler Handler[EvType, EvSlice]) Handler[EvType, EvSlice]
- func WithRetry[EvType RetryableEvent, EvSlice ~[]EvType](handler Handler[EvType, EvSlice], opts ...RetryOption) Handler[EvType, EvSlice]
- func WithRetry2[EvType RetryableEvent2, EvSlice ~[]EvType](handler Handler[EvType, EvSlice], opts ...Retry2Option) Handler[EvType, EvSlice]
- type IgnoreDuplicateItems
- type InitOption
- type InitOptions
- type MarshalerDisabled
- type Middleware
- type Queue
- type QueueIDType
- type QueuedClient
- type Retry2Option
- type RetryOption
- type RetryableEvent
- type RetryableEvent2
- type StandaloneMaster
- type Stat
- type Unpacker
- type VersionType
Constants ¶
const DefaultProducerInstance = "producer"
DefaultProducerInstance - имя инстанса в онлайнконфе по умолчанию для продюсеров (веб-сервисы, и т.д.)
const MaxVersion = queuedproto.VersionMask
MaxVersion - максимальная версия события (в верхних битах хранятся флаги)
const SignalReload = syscall.SIGHUP
SignalReload - перечитывается конфиг (как и при изменении онлайнконфа)
Variables ¶
var ( // ErrUnknownType - тип данных не зарегистрирован при помощи Register ErrUnknownType = errors.New("unregistered type") // ErrUnknownQueue - очередь не зарегистрирована при помощи [Register] ErrUnknownQueue = errors.New("unregistered queue") // ErrUnknownVersion - версия события не зарегистрирована при помощи [Register] ErrUnknownVersion = errors.New("unregistered version") // ErrVersionTooBig - версия не должна превышать MaxVersion ErrVersionTooBig = errors.New("version number exceeds MaxVersion") // ErrInternalHandler - тип структуры юзерского события должен поддерживать pHandler], т.к. [Register] принимает [Handler]. Говорит о серьёзной ошибке внутри tp ErrInternalHandler = errors.New("internal error: handlerInfo.dataType is not Handler") // ErrHardMemoryLimit - достигнут лимит по памяти oom_hard_limit ErrHardMemoryLimit = errors.New("memory usage is over the hard limit, stopping processing") // ErrPointerRequired - методу tp.Next требуется указатель на ресивер метода Handler (т.е. указатель на указатель на объект юзерского события) ErrPointerRequired = errors.New("tp.Next: pointer to Handle method's receiver is required") // ErrEventTypesDiffer - в цепочке событий типы различаются (скорее всего, внутренняя ошибка в eventListFromItems) ErrEventTypesDiffer = errors.New("tp.Next: event types differ") // ErrMisconstructedEvent - не надо инициализировать внутренности событий вручную. // Скорее всего, установили next = (*MyEvent)(nil) вместо Handler(nil) ErrMisconstructedEvent = errors.New("tp.Next: misconstructed event") // ErrStructRequired - для использования автозаполнения, тип события должен быть структурой/указателем на структуру ErrStructRequired = errors.New("struct type is required for autofill feature") // ErrExportedRequired - для использования автозаполнения требуется экспортируемое (публичное) поле ErrExportedRequired = errors.New("exported (public) field is required for autofill feature") // ErrFieldNotFound - не найдено поле с типом аргумента autofill ErrFieldNotFound = errors.New("no field found") )
SignalsExit - graceful exit (дожидается завершения обработки всех событий, и выходит)
Functions ¶
func CalcShard ¶
CalcShard - см. queuedclient.CalcShard.
func EncodeEvent ¶
EncodeEvent кодирует событие.
Если нужно только отправлять события, регистрация не требуется (в отличие от предыдущих версий tp).
При соответствии интерфейсам Builder и/или EventIDBuilder вызываются соответствующие методы.
Кодировщику безразлично, передаётся указатель или значение, но для вызова методов по указанным интерфейсам нужно соблюдать правильный тип (тот, для которого объявлен метод - очевидно, для Builder нужен указатель).
ID события, кроме интерфейса EventIDBuilder, можно также передать явно. Номер шарда будет вычислен из ID события, если оно задано одним из этих способов. Если EventID.ID == 0, шард будет выбран по round robin (queuedclient.BalanceShard).
func Register ¶
func Register[EvType Event, EvSlice ~[]EvType](q Queue, handler func(context.Context, EvSlice) error) error
Register регистрирует обработчик очереди для получения событий. Для отправки (Publish) регистрация не требуется. handler принимает слайс событий, поддерживающих интерфейс Event (конкретных типов - не слайс интерфейсов). ID очереди и версия события определяется методами QueueID и Version. Для одной очереди могут быть зарегистрированы обработчики событий нескольких версий.
Types ¶
type BaseEvent ¶
type BaseEvent struct {
// contains filtered or unexported fields
}
BaseEvent - базовый тип события, должен встраиваться в пользовательские типы событий.
func NewBaseEvent ¶
func NewBaseEvent() BaseEvent
NewBaseEvent - для использования в тестах. Возвращает проинициализированный BaseEvent, в котором будут работать флаги (в частности, метод Done). Для отправки инициализировать событие не нужно, функция предусмотрена только для тестов, которым нужно проверить установку Done.
func (BaseEvent) AddonID ¶
func (BaseEvent) AddonID(incompatible)
AddonID - не поддерживается. Тип BaseEvent не предназначен для передачи по протоколу
func (BaseEvent) Defer ¶
Defer устанавливает задержку события.
Время задержки устанавливается сразу же. По завершении цикла обработки событиям, для которых не был вызван метод Done либо Defer, проставляется задержка по умолчанию.
Если событие было помечено как выполненное при помощи Done, а потом был вызван Defer, пометка на удаление снимается.
func (BaseEvent) Done ¶
func (bev BaseEvent) Done()
Done помечает событие обработанным.
События удаляются не сразу, а по завершении цикла обработки всех событий, полученных за один запрос из queued. В случае возникновения паник (в т.ч. необработанных), удаление все равно должно произойти до выхода из tp.Queue.Work
func (BaseEvent) GetEventID ¶
func (bev BaseEvent) GetEventID() queuedproto.EventID
GetEventID - возвращает ID события. Код, работающий с конкретным событием (не через интерфейс) может обращаться к полу EventID напрямую.
func (BaseEvent) HasCustomDefer ¶
HasCustomDefer - установлено ли явно время повторной активации вызовом методов BaseEvent.Defer или Queue.Replace
func (BaseEvent) MarshalAddon ¶
func (BaseEvent) MarshalAddon(incompatible)
MarshalAddon - не поддерживается. Тип BaseEvent не предназначен для передачи по протоколу
func (BaseEvent) MarshalIProto ¶
func (BaseEvent) MarshalIProto(incompatible)
MarshalIProto - не поддерживается. Тип BaseEvent не предназначен для передачи по протоколу
func (BaseEvent) MarshalerDisabled ¶
func (BaseEvent) MarshalerDisabled(incompatible)
func (BaseEvent) Shard ¶
Shard распределяет события по шардам в зависимости от хеша от ID события. Совместимо с перлом (алгоритм хеширования - crc от строкового десятичного представления eventID, распределение по шардам - остаток от деления).
func (BaseEvent) UnmarshalAddon ¶
func (BaseEvent) UnmarshalAddon(incompatible)
UnmarshalAddon - не поддерживается. Тип BaseEvent не предназначен для передачи по протоколу
func (BaseEvent) UnmarshalIProto ¶
func (BaseEvent) UnmarshalIProto(incompatible)
UnmarshalIProto - не поддерживается. Тип BaseEvent не предназначен для передачи по протоколу
type Builder ¶
type Builder interface {
Build() error
}
Builder - при поддержке этого интерфейса типом события, метод Build вызывается при добавлении события в очередь. Можно использовать для автозаполнения часто используемых полей (время создания, etc). Аналог в перле - builder/default (для отдельных полей)
type DisableMarshaler ¶
type DisableMarshaler struct{}
DisableMarshaler - встраивание этого типа в структуру отключает сериализацию средствами iproto
func (DisableMarshaler) MarshalIProto ¶
func (DisableMarshaler) MarshalIProto(buf []byte) ([]byte, error)
MarshalIProto - не делает ничего
func (DisableMarshaler) MarshalerDisabled ¶
func (DisableMarshaler) MarshalerDisabled()
func (DisableMarshaler) UnmarshalIProto ¶
func (DisableMarshaler) UnmarshalIProto(buf []byte) ([]byte, error)
UnmarshalIProto - не делает ничего
type Event ¶
type Event interface {
// Marshaler используется для кодирования события при отправке. Должен быть
// реализован/сгенерён для типа события.
// Если не реализовать/сгенерить Unmarshaler, обрабатываться такие события
// не будут (их не получится зарегистрировать вызовом [Register]),
// доступна будет только отправка (Publish)
iproto.Marshaler
// Version нужно определить для типа события.
Version() VersionType
// QueueID нужно определить для типа события.
QueueID() QueueIDType
// Shard принимает количество шардов, и должен возвращать номер
// шарда queued, в который будет отправлено событие. Обычно
// для этого используется ID события.
//
// В BaseEvent определён метод Shard, совместимый с перловой реализацией.
// Тип события может переопределить метод шардирования.
Shard(shardNum uint) uint
// GetEventID возвращает ID события.
//
// Определён в BaseEvent.
GetEventID() queuedproto.EventID
// Queue возвращает интерфейс [Queue] для работы с API очередей.
//
// Определён в BaseEvent.
Queue() Queue
// Defer откладывает следующую активацию события на указзанную задержку.
// Выполняется сразу, а не в конце обработки пачки событий (как это
// происходит при вызове Done, или при дефолтном дефере).
//
// Определён в BaseEvent.
Defer(context.Context, time.Duration) error
// HasCustomDefer возвращает признак, был ли вызван метод [Defer] явно.
//
// Определён в BaseEvent.
HasCustomDefer() bool
// Done помечает событие успешно обработанным. Такие события удаляются из очереди
// в конце цикла обработки пачки событий, полученных из очереди (под пачкой имеются
// ввиду все события из одной очереди, включая все их версии - т.е. потенциально
// больше, чем размер слайса, переданного обработчику). Удаление выполняется
// одним запросом.
//
// Определён в BaseEvent.
Done()
// IsDone возвращает признак успешного выполнения события.
//
// Определён в BaseEvent.
IsDone() bool
}
Event - интерфейс обработчика очереди. Структура обработчика должна встраивать тип BaseEvent.
Нужно определить два метода - Version и QueueID, остальные унаследуются от встроенного BaseEvent.
type EventIDBuilder ¶
type EventIDBuilder interface {
BuildEventID() uint64
}
EventIDBuilder - события, поддерживающие этот интерфейс, могут генерить ID события сами (аналог в перле - generate_id). По дефолту, ID событий генерит queued. Поля, автозаполненные при помощи Build(), можно использовать в методе BuildEventID()
type EventWithCreationTime ¶
type EventWithCreationTime interface {
Event
GetCreationTime() addons.CreationTime
}
EventWithCreationTime - событие, встраивающее addons.CreationTime.
Поддерживает middleware addons.CreationTime
type Handler ¶
func WithMaxAge ¶
func WithMaxAge[EvType EventWithCreationTime, EvSlice ~[]EvType](handler Handler[EvType, EvSlice]) Handler[EvType, EvSlice]
WithMaxAge - ограничивает время обработки события значением max_age, которое может задаваться в конфиге для очереди, инстанса или глобально.
Пример:
tp.Register(q, tp.WithMaxAge(func (ctx context.Context, events []MyEvent) error {
// обычный обработчик
for _, event := range events {
// события старше max_age сюда не попадут
}
return nil
}))
func WithRetry ¶
func WithRetry[EvType RetryableEvent, EvSlice ~[]EvType](handler Handler[EvType, EvSlice], opts ...RetryOption) Handler[EvType, EvSlice]
WithRetry - ограничивает количество попыток обработки события.
При помощи опций можно задать коллбеки:
- OnRetry - вызывается после увеличения счётчика событий в случае неудачной обработки (вызова метода Retry). После последней попытки не вызывается.
- OnRetryExhausted - вызывается после последней неудачной попытки обработки.
Настройки в onlineconf (задаются для очереди или глобально):
retry_limit - максимальное количество попыток, после которого событие удаляется. Формат - int retry_type - тип задержки - const или constant - постоянная, lin или linear - линейная, exp или exponential - экспоненциальная retry_delay - постоянная часть задержки (для всех типов). Формат - [time.ParseDuration] retry_coeff - коэффициент (для линейной или экспоненциальной задержки). Формат - [time.ParseDuration] retry_exp - экспонента. Формат - float. Значение по умолчанию - 2. Задержка вычисляется по формуле: constant: retry_delay linear: retry_delay + retry_coeff * retryCount exponential: retry_delay + retry_coeff * retry_exp ^ retryCount
где Count - номер текущей попытки (начиная с 0)
Пример:
type MyEvent struct {
addons.Retry
UserID uint64
// ...
}
tp.Register(q, tp.WithRetry(func (ctx context.Context, events []MyEvent) error {
for _, event := range events {
data, err := SelectUserByID(event.UserID)
if err != nil {
continue // пытаемся обработать событие неограниченное кол-во раз
// с постоянной задержкой defer_time.
// после выхода из обработчика для всех необработанных событий
// будет вызван Defer (одним запросом)
}
resp, err := SendToRemoteSystem(ctx, data)
if err != nil {
event.Retry() // пытаемся обработать указанное в конфиге кол-во раз
// задержка и её тип указаны в конфиге (retry_*)
}
// ...
event.Done() // успешная обработка, после выхода из обработчика
// все обработанные события удаляются (одним запросом)
}
}))
func WithRetry2 ¶
func WithRetry2[EvType RetryableEvent2, EvSlice ~[]EvType](handler Handler[EvType, EvSlice], opts ...Retry2Option) Handler[EvType, EvSlice]
type IgnoreDuplicateItems ¶
type IgnoreDuplicateItems interface {
IgnoreDuplicateItems() bool
}
IgnoreDuplicateItems - для событий, вернувших true, игнорируются дубли по ID сообщения (выставляется флаг FlagIgnoreWrongItem). Следует использовать вместе с EventIDBuilder, если нужна идемпотентность ID. Перловый аналог называется так же.
type InitOption ¶
type InitOption func(*InitOptions)
InitOption - WithInstanceName, WithLogger, WithMetrics, WithLogLevelConfig
func WithInstanceName ¶
func WithInstanceName(instanceName string) InitOption
WithInstanceName устанавливает имя инстанса.
По умолчанию, для обработчиков читается из командной строки из флага -instance, для продюсеров - DefaultProducerInstance ("producer")
func WithLogLevelConfig ¶
func WithLogLevelConfig(lc advslog.LevelConfig) InitOption
WithLogLevelConfig включает пер-пакетные уровни логгирования из указанного поддерева онлайнконфа (advslog.WithLevelConfig) - например, module.Subtree("/tp/go/log"). Оверрайд для пакета задаётся ключом "<root>/<import-path>/level", в частности "/tp/go/log/github.com/adventures-team/go-iprotoconn/level" задаёт уровень логгирования iproto-транспорта независимо от прикладных уровней.
Правила использования:
- НЕ создавайте ключ "<root>/level": глобальным уровнем владеет параметр log_level (применяется из applyConfig) - иначе за глобальный уровень начнут конкурировать два писателя;
- поддерево должно раздаваться с child lists (ключи "<path>/" со списками детей) - без них advslog не найдёт оверрайды и не подпишется на изменения;
- опция действует, только когда tp сам строит логгер по умолчанию: вместе с WithLogger она игнорируется (владелец логгера сам решает, как его собрать);
- advslog.Init выполняется один раз на процесс: если приложение уже вызывало его без опций, поднастройка не применится - опция должна попасть в самый первый Init.
func WithLogger ¶
func WithLogger(logger *slog.Logger) InitOption
WithLogger устанавливает логгер.
По умолчанию, вызывается advslog.Init.
func WithMetrics ¶
func WithMetrics(ms advmetricsset.Set) InitOption
WithMetrics подключает сбор метрик.
type InitOptions ¶
type InitOptions struct {
// contains filtered or unexported fields
}
InitOptions - тип напрямую использовать не надо. Не сделан приватным для упрощения написания тестов.
type MarshalerDisabled ¶
type MarshalerDisabled interface {
MarshalerDisabled()
}
MarshalerDisabled - для проверки, отключен ли у типа маршалер средствами DisableMarshaler
type Middleware ¶
type Queue ¶
type Queue interface {
// Client возвращает интерфейс низкоуровневого API очередей
Client() QueuedClient
// Config возвращает высокоуровневый конфиг очередей с возможностью определения значений
// для каждой очереди, с возможностью задания глобальных и per-instance дефолтов.
Config() *queueconfig.Config
// NewPoller возвращает интерфейс для опроса событий из очереди.
// Вынесен для возможности внешней реализации разных стратегий опроса очереди
// (например, managed master).
NewPoller(logger *slog.Logger) workerpool.Poller
// IsRegistered проверяет, зарегистрирована ли указанная очередь вызовом Register.
IsRegistered(queueID uint16) bool
// Publish кодирует событие при помощи метода Encode, и отправляет его в очередь методом [queuedclient.Publish].
// Клиент очередей должен быть проинициализирован.
//
// Возвращается ID события (сгенерённый методом BuildEventID(), либо возвращённый queued).
//
// Если у события есть метод IgnoreDuplicateItems, и он возвращает true, дубли при
// совпадении ID события игнорируются (также подавляется ошибка в логе queued флагом queuedproto.FlagIgnoreWrongItem).
Publish(ctx context.Context, event Event, opts ...queuedclient.PublishOption) (queuedproto.EventID, error)
// Replace заменяет существующее событие в очереди. ID события должно быть обязательно задано.
// Если время срабатывания не установлено через опции, оно не изменяется.
Replace(ctx context.Context, event Event, opts ...queuedclient.PublishOption) error
MetricsSet() advmetricsset.Set
SetMetricsSet(advmetricsset.Set)
}
Queue - высокоуровневое API очередей.
В комментариях описано поведение реализации, возвращаемой NewQueue.
func InitProducer ¶
func InitProducer[T queueconfig.OnlineConf](conf queueconfig.OnlineConfWithSubtree[T], opts ...InitOption) Queue
InitProducer - инициализация типового продюсера (веб-сервис, и т.д.):
func main() {
conf, err := onlineconf.OpenSubtree("TREE", "/project/queued")
queue := tp.InitProducer(conf)
err := queue.Register(QueueID, &QueueEvent{}, nil)
if err != nil { zLog.Fatal().Err(err).Send() }
err = queue.Register(AnotherQueueID, &AnotherQueueEvent{}, nil)
if err != nil { zLog.Fatal().Err(err).Send() }
svc := NewService(myServiceConfig{
...
Queue: queue,
...
})
...
svc.Serve()
}
func (svc *Service) PostUserDataHandler(...) {
...
svc.Queue.Publish(&QueueEvent{
UserID: params.UserID(),
...
})
...
}
Опции:
- WithInstanceName - по умолчанию, `producer`
- WithLogger - если не указано явно, инициализируется при помощи advslog.Init.
В случае ошибки инициализации происходит выход с логгированием на уровне FATAL. Предполагается вызов из функции main.
func NewQueue ¶
func NewQueue(ctx context.Context, conf *queueconfig.Config, opts ...queuedclient.DialOption) (Queue, error)
NewQueue создаёт объект для высокоуровневой работы с API очередей. Инициализирует клиент очередей (queuedclient) с указанным конфигом.
Опции передаются в queuedclient.Dial; в частности, queuedclient.WithMetricsSet включает транспортные метрики iproto_* (реестр подключается при создании клиента).
type QueueIDType ¶
type QueueIDType = uint16
QueueIDType - тип id очереди. Используем type alias - просто для удобства восприятия, "настоящий" тип (с методами, и громоздким приведением типов) нам не нужен.
type QueuedClient ¶
type QueuedClient interface {
// Publish отправляет событие в очередь.
// Автоинкремент ID и способы задания задержки описаны в документации к пакету queuedclient.
Publish(ctx context.Context, queueID uint16, eventID queuedproto.EventID, flags uint32, eventData []byte, opts ...queuedclient.PublishOption) (queuedproto.EventID, error)
// Replace заменяет существующее событие в очереди.
Replace(ctx context.Context, queueID uint16, eventID queuedproto.EventID, eventData []byte, opts ...queuedclient.PublishOption) (bool, error)
// Defer устанавливает задержку обработки для указанных событий. Если задержка не указана (delay == 0), используется значение defer_time из конфига.
Defer(ctx context.Context, queueID uint16, delay time.Duration, eventIDs []queuedproto.EventID) error
// Delete удаляет указанные события параллельно изо всех необходимых шардов пачками по update_batch_size событий.
Delete(ctx context.Context, queueID uint16, eventIDs []queuedproto.EventID) error
// GetActive получает активные события из очереди queueID изо всех шардов одновременно.
GetActive(ctx context.Context, queueID uint16, count int) (queuedproto.ItemList, error)
// GetByIDs запрашивает события из очереди queueID с указанными ID из указанных шардов параллельно.
GetByIDs(ctx context.Context, queueID uint16, eventIDs []queuedproto.EventID) (queuedproto.ItemList, error)
// GetByIDsBroadcast запрашивает события из очереди queueID с указанными ID изо всех шардов одновременно.
GetByIDsBroadcast(ctx context.Context, queueID uint16, eventIDs []uint64) (queuedproto.ItemList, error)
// SetActivationTime устанавливает время активации для указанных событий.
SetActivationTime(ctx context.Context, queueID uint16, atime time.Time, eventIDs []queuedproto.EventID) error
// QueueStat запрашивает статистику очереди queueID изо всех шардов одновременно (результат - по шардам).
QueueStat(ctx context.Context, queueID uint16) ([]queuedproto.RespQueueStat, error)
// ShardNum возвращает количество сконфигурированных шардов queued.
ShardNum() uint
// MakeBroadcastRequest посылает запрос req параллельно во все шарды.
MakeBroadcastRequest(ctx context.Context, req queuedproto.Request, resFunc queuedclient.ResultFunc) error
// MakeMulticastRequest посылает запросы для указанных eventIDs в нужные шарды.
MakeMulticastRequest(ctx context.Context, batchSize int, eventIDs []queuedproto.EventID, reqFunc queuedclient.RequestFunc, resFunc queuedclient.ResultFunc) error
// MakeUnicastRequest посылает запрос req к указанному шарду.
MakeUnicastRequest(ctx context.Context, shard uint, req queuedproto.Request) (usedShard uint, respBytes []byte, err error)
MetricsSet() advmetricsset.Set
SetMetricsSet(advmetricsset.Set)
// IsHealthy сообщает о работоспособности кластера queued: ни у одного шарда
// не открыт circuit breaker, и в каждом шарде есть пригодный сервер.
// Холодный старт (соединения ещё не установлены) считается здоровым состоянием.
IsHealthy() bool
// IsOnline проверяет доступность кластера queued.
//
// Deprecated: эквивалентен IsHealthy (живые TCP-соединения больше не проверяются,
// go-iprotoconn устанавливает их по требованию и в фоне) - используйте IsHealthy.
IsOnline() bool
}
QueuedClient - интерфейс низкоуровневого API очередей (клиента queued). Реализован в queuedclient.QueuedClient (там же - более подробное описание методов).
type Retry2Option ¶
type Retry2Option func(*retry2Opt)
func OnRetry2 ¶
func OnRetry2[T RetryableEvent2](f func(T)) Retry2Option
OnRetry2 аналог OnRetry для WithRetry2
func OnRetry2Exhausted ¶
func OnRetry2Exhausted[T RetryableEvent2](f func(T, string)) Retry2Option
OnRetry2Exhausted аналог OnRetryExhausted для WithRetry2. В обработчик так же передаётся имя счётчика — cnt
func Retry2CounterNames ¶
func Retry2CounterNames(retry1, retry2 string) Retry2Option
Retry2CounterNames позволяет задать альтернативные имена для настроек счётчиков в онлайнконфе. По умолчанию, "1" и "2".
type RetryOption ¶
type RetryOption func(*retryOpt)
RetryOption - OnRetry, OnRetryExhausted
func OnRetry ¶
func OnRetry[T RetryableEvent](f func(T)) RetryOption
OnRetry определяет пользовательский обработчик, который будет вызван при ретрае. Используется для реализации кастомной обработки события при ретрае, будь то логгирование, отправка метрики и т.п.
func OnRetryExhausted ¶
func OnRetryExhausted[T RetryableEvent](f func(T)) RetryOption
OnRetryExhausted определяет пользовательский обработчик, который будет вызван при исчерпании лимита ретраев. Используется для реализации кастомной обработки события при ретрае, будь то логгирование, отправка метрики и т.п.
type RetryableEvent ¶
type RetryableEvent interface {
Event
IncRetryCount()
GetRetryCount() uint32
Retry()
NeedRetry() bool
}
RetryableEvent - событие, встраивающее addons.Retryable. Поддерживает middleware WithRetry.
type RetryableEvent2 ¶
type RetryableEvent2 interface {
Event
IncRetry1Count()
IncRetry2Count()
GetRetry1Count() uint32
GetRetry2Count() uint32
Retry1()
Retry2()
NeedRetry1() bool
NeedRetry2() bool
}
RetryableEvent2 - событие, встраивающее addons.Retryable2. Поддерживает middleware WithRetry2.
type StandaloneMaster ¶
type StandaloneMaster struct {
Queue
// contains filtered or unexported fields
}
StandaloneMaster - управление пулом обработчиков очередей при помощи onlineconf. Поддерживает все методы типа Queue.
Не путать с перловым менеджером очередей.
func InitProcessor ¶
func InitProcessor[T queueconfig.OnlineConf](conf queueconfig.OnlineConfWithSubtree[T], opts ...InitOption) *StandaloneMaster
InitProcessor - инициализация типового обработчика очередей. Простейший случай:
func main() {
conf, err := onlineconf.OpenSubtree("TREE", "/project/queued")
qm := tp.InitProcessor(conf)
app := NewService(myServiceConfig{...})
err := qm.Register(QueueID, &QueueEvent{}, app)
if err != nil { zLog.Fatal().Err(err).Send() }
err = qm.Register(AnotherQueueID, &AnotherQueueEvent{}, app)
if err != nil { zLog.Fatal().Err(err).Send() }
qm.Manage()
}
Опции:
- WithInstanceName - по умолчанию - читается параметр командной строки -instance (flag.Parse() из main() в этом случае вызывать до вызова InitProcessor не следует).
- WithLogger - если не указано явно, инициализируется при помощи advslog.Init.
В случае ошибки инициализации происходит выход с логгированием на уровне FATAL. Предполагается вызов из функции main.
func NewStandaloneManager ¶
func NewStandaloneManager(queue Queue, pool *workerpool.WorkerPool, logger *slog.Logger) *StandaloneMaster
NewStandaloneManager создаёт новый объект для управления пулом.
Это - низкоуровневый интерфейс. Для типового кейса следует юзать обёртку InitProcessor.
func (*StandaloneMaster) Run ¶
func (qm *StandaloneMaster) Run()
Run - для обработчиков очередей. Запуск управления пулом воркеров из конфига. Применяет конфиг сразу при вызове, а также при изменении конфига, и по сигналу SIGHUP. Если в конфиге при первом запуске обнаружены ошибки - пул воркеров останавливается, и функция возвращается. При изменении конфига/по сигналу выход/остановка происходят только при ошибке достижения oom_hard_limit. Для обычных ошибок - пишется ошибка в лог, и остаётся старый конфиг. Вызывать из main, при возврате - выходить.
При возврате (после остановки пула) горутина менеджера конфига тоже останавливается, Run дожидается её выхода (иначе она продолжала бы жить и логгировать после Stop - в тестах это приводило к панике "Log in goroutine after test has completed").
func (*StandaloneMaster) Stop ¶
func (qm *StandaloneMaster) Stop()
Stop - враппер для WorkerPool.Stop. Останавливает обработку новых событий, по завершению запущенных обработчиков, метод Manage выходит.
type Stat ¶
type Stat struct {
// contains filtered or unexported fields
}
Stat is used by managed master. Not an application metrics.
type Unpacker ¶
type Unpacker interface {
Unpack() error
}
Unpacker - если у события объявлен метод Unpack, он вызывается при поступлении события после его распаковки. Можно использовать для извлечения полей, запакованных в EventID.
type VersionType ¶
type VersionType = uint8 // из-за флагов в номере версии в перле, максимальный номер версии - 31 (queuedproto.FlagEnableAddons-1).
VersionType - id версии событий.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
queued-mover
command
queued-mover переносит события очередей из одного кластера queued (источник, A) в другой (приёмник, B): читает активные события из шардов A, публикует их в B как есть (тело события не декодируется) и удаляет из A. Логика - пакет internal/mover, краткое описание - в docs/README.md.
|
queued-mover переносит события очередей из одного кластера queued (источник, A) в другой (приёмник, B): читает активные события из шардов A, публикует их в B как есть (тело события не декодируется) и удаляет из A. Логика - пакет internal/mover, краткое описание - в docs/README.md. |
|
queued-stresser
command
queued-stresser - parallel and asynchronous queued stress test.
|
queued-stresser - parallel and asynchronous queued stress test. |
|
Package encodings - поддержка сериализации событий.
|
Package encodings - поддержка сериализации событий. |
|
mover
Package mover - логика утилиты queued-mover: перенос событий очередей из одного кластера queued (источник, A) в другой (приёмник, B) поверх queuedclient.
|
Package mover - логика утилиты queued-mover: перенос событий очередей из одного кластера queued (источник, A) в другой (приёмник, B) поверх queuedclient. |
|
managed
|
|
|
stats
Package stats provides functionality for tracking and managing statistical data related to queues and slots.
|
Package stats provides functionality for tracking and managing statistical data related to queues and slots. |
|
Package queueconfig - доступ к конфигу с возможностью переопределения значений для очереди и инстанса.
|
Package queueconfig - доступ к конфигу с возможностью переопределения значений для очереди и инстанса. |
|
Package queuedclient - низкоуровневый клиент queued.
|
Package queuedclient - низкоуровневый клиент queued. |
|
examples
command
|
|
|
mock/event
Package mockevent is a generated GoMock package.
|
Package mockevent is a generated GoMock package. |
|
mock/mover
Package mockmover is a generated GoMock package.
|
Package mockmover is a generated GoMock package. |
|
mock/onlineconf
Package mockonlineconf is a generated GoMock package.
|
Package mockonlineconf is a generated GoMock package. |
|
mock/poller
Package mockpoller is a generated GoMock package.
|
Package mockpoller is a generated GoMock package. |
|
mock/queue
Package mockqueue is a generated GoMock package.
|
Package mockqueue is a generated GoMock package. |
|
mock/slotpool
Package mockslotpool is a generated GoMock package.
|
Package mockslotpool is a generated GoMock package. |
|
mock/stats
Package mockstat is a generated GoMock package.
|
Package mockstat is a generated GoMock package. |
|
Package workerpool - абстрактный пул воркеров.
|
Package workerpool - абстрактный пул воркеров. |