Documentation
¶
Overview ¶
Package queuedproto - поддержка протокола queued.
Кроме структур протокола самого queued, поддерживаются форматы перловых очередей. Perl addons (используются во всех современных проектах на perl) поддерживаются, perl extensions (используются только в одном крупном старом проекте) - нет.
Типы/константы названы так же, как в исходниках queued. В перле используется другая терминология.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Code generated by iprotogen. DO NOT EDIT.
Index ¶
- Constants
- Variables
- func ErrorByRetCode(rc uint8) error
- func IsSoftError(err error) bool
- type EventID
- type ItemList
- type PerlAddonData
- type PerlAddons
- type PerlData
- type PerlExtensions
- type QueueItem
- type ReqAddData
- type ReqAddItem
- type ReqDeleteItems
- type ReqFullUpdate
- type ReqGetActive
- type ReqGetItems
- type ReqQueueStat
- type ReqUpdateItems
- type Request
- type RespQueueStat
- type UpdQueueItem
Constants ¶
const ( CmdAddItem = uint32(20) CmdGetActive = uint32(21) CmdDeleteItems = uint32(22) CmdUpdateItems = uint32(24) CmdGetItems = uint32(28) CmdFullUpdate = uint32(30) CmdAddData = uint32(34) CmdGetQueueStat = uint32(36) )
Коды команд queued
const ( // errors RcOK = uint8(0) RcLogicError = uint8(1) RcWrongItem = uint8(2) RcMemAllocationFailed = uint8(3) RcUnknownQueueType = uint8(4) RcReqAlreadyProcessed = uint8(8) RcItemLocked = uint8(9) RcWrongRequest = uint8(10) RcBadRequestLength = uint8(11) RcWrongVersion = uint8(12) // warnings RcNoActiveItems = uint8(5) RcInsufficientActiveCount = uint8(6) RcWrongID = uint8(7) )
Коды ответов queued
const ( FlagEnableExtensions = uint8(0x80) FlagEncodeInUTF8 = uint8(0x40) FlagEnableAddons = uint8(0x20) VersionMask = ^(FlagEnableExtensions | FlagEncodeInUTF8 | FlagEnableAddons) )
Флаги расширений, указываются в поле Version
const ( TimestampAbsolute = uint8(0) // указанный UnixTime - абсолютный (секунды с 1970-01-01T00:00:00Z) TimestampRelativePlus = uint8(1) // в Unixtime относительное время, которое необходимо прибавить к текущему серверному времени TimestampRelativeMinus = uint8(2) // в Unixtime относительное время, которое необходимо отнять от текущего серверного времени )
Типы времени для команды CmdUpdateItems
const FlagIgnoreWrongItem = uint32(1)
FlagIgnoreWrongItem - флаг команды CmdAddItem
const SkipTimeUpdate = 0xFFFFFFFF
SkipTimeUpdate - для запроса ReqFullUpdate - magic value для UnixTime, в случае передачи этого значения время не изменяется.
Variables ¶
var ( ErrQueued = errors.New("queued error") ErrLogic = fmt.Errorf("%w: logic error", ErrQueued) ErrWrongItem = fmt.Errorf("%w: wrong item", ErrQueued) ErrMemAllocationFailed = fmt.Errorf("%w: queued memory allocation failure", ErrQueued) ErrUnknownQueueType = fmt.Errorf("%w: unknown queue type", ErrQueued) ErrReqAlreadyProcessed = fmt.Errorf("%w: request has been already processed (duplicate ReqID)", ErrQueued) ErrItemLocked = fmt.Errorf("%w: item locked", ErrQueued) ErrWrongRequest = fmt.Errorf("%w: wrong request", ErrQueued) ErrBadRequestLength = fmt.Errorf("%w: bad request length", ErrQueued) ErrWrongVersion = fmt.Errorf("%w: wrong version", ErrQueued) )
Протокольные ошибки queued
Functions ¶
func ErrorByRetCode ¶
ErrorByRetCode - возвращает ошибку по коду, для неизвестных ошибок в тексте сообщается код. Для RcOK и всех ворнингов возвращается nil, если ворнинги нужны - их нужно обрабатывать вручную.
func IsSoftError ¶
IsSoftError сообщает, является ли ошибка логической - т.е. не связанной с низкоуровневыми проблемами (разрывы соединения, таймауты, блокировки, сбои сервера).
Все неизвестные протокольные ошибки считаются "жёсткими".
Запросы с логическими ошибками повторять не надо, с низкоуровневыми - можно/нужно.
Можно передавать также обёрнутые ошибки.
Types ¶
type EventID ¶
EventID - составной ID с номером шарда. Нужен, т.к. протокол (и сам queued) не поддерживает шардинг. Связка Shard:ID уникальна, тогда как сам по себе ID в списке событий может быть неуникальным, если события пришли из разных шардов. Такое возможно только при автогенерации ID событий на стороне queued.
В структурах запросах этот тип используется только для слайсов (чтобы не перелопачивать слайсы целиком из параметров метода, которому номер шарда должен как-то поступать). Скалярные айдишники надо будет скопировать (только ID, передающийся по прококолу).
func (EventID) MarshalText ¶
MarshalText - для упрощения логгирования списков событий при помощи zerolog.Event.Interface (не нужно переваливать слайс айдишников событий в слайс строк/стрингеров).
type ItemList ¶
type ItemList struct {
Items []QueueItem `iproto:"u32"`
}
ItemList - список событий
func (ItemList) MarshalIProto ¶
type PerlAddonData ¶
type PerlAddonData struct {
ID uint16 // addons.CreationTimeID, addons.RetryID, addons.Retry2ID или addons.ProducerID
Data []byte `iproto:"u8"`
}
PerlAddonData - данные аддона. Константы ID и структуры формата данных оперделены в пакете addons
type PerlAddons ¶
type PerlAddons struct {
List []PerlAddonData `iproto:"u8"`
}
PerlAddons - список аддонов
func (PerlAddons) MarshalIProto ¶
func (recvPerlAddons PerlAddons) MarshalIProto(buf []byte) ([]byte, error)
func (*PerlAddons) UnmarshalIProto ¶
func (recv_PerlAddons *PerlAddons) UnmarshalIProto(buf []byte) ([]byte, error)
type PerlData ¶
type PerlData struct {
Version uint8 // версия (содержит флаги FlagEnableExtensions, FlagEncodeInUTF8, FlagEnableAddons)
Addons PerlAddons // список данных аддонов (если установлен FlagEnableAddons - иначе поле не передаётся!)
Extensions PerlExtensions // данные расширения (если установлен FlagEnableExtensions - иначе поле не передаётся!)
Data []byte // данные в формате perl pack
}
PerlData - событие очереди в перловом формате.
Аддоны декодируются, только если установлен флаг FlagEnableAddons, иначе Addons.List устанавливается в nil. При кодировании, если len(Addons.List) != 0, они кодируются, и автоматически устанавливается флаг FlagEnableAddons.
Extensions - аналогично, однако их внутренности (пока) не обрабатываются (просто декодируются, как слайс байтов).
При кодировании флаг FlagEncodeInUTF8 устанавливается автоматически всегда.
func (PerlData) MarshalIProto ¶
MarshalIProto кодирует данные в перловом формате, передавая необязательные поля, только если они заданы. В этом случае устанавливаются соответствующие им флаги (FlagEnableAddons - для Addons, FlagEnableExtensions - для Extensions).
func (*PerlData) UnmarshalIProto ¶
UnmarshalIProto декодирует данные в перловом формате, обрабатывая необязательные поля, только если установлены соответствующие им флаги (FlagEnableAddons - для Addons, FlagEnableExtensions - для Extensions).
Если флаг для необязательного поля не установлен, оно сбрасывается в дефлотное значение, так сделано, чтобы не прилетели данные от предыдущей записи в случае переиспользования объекта.
type PerlExtensions ¶
PerlExtensions - данные расширений (пока не обрабатываются, де/кодируются как слайс байтов)
func (PerlExtensions) MarshalIProto ¶
func (recvPerlExtensions PerlExtensions) MarshalIProto(buf []byte) ([]byte, error)
func (*PerlExtensions) UnmarshalIProto ¶
func (recv_PerlExtensions *PerlExtensions) UnmarshalIProto(buf []byte) ([]byte, error)
type ReqAddData ¶
type ReqAddData struct {
StorageType uint16 // номер очереди
ID uint64 // ID изменяемого события
Data []byte `iproto:"u16"` // дописываемые данные (в сумме с существующими должно быть до 4кБ)
}
ReqAddData - формат tuple запроса на добавление данных в конец события
func (ReqAddData) MarshalIProto ¶
func (recvReqAddData ReqAddData) MarshalIProto(buf []byte) ([]byte, error)
func (*ReqAddData) UnmarshalIProto ¶
func (recv_ReqAddData *ReqAddData) UnmarshalIProto(buf []byte) ([]byte, error)
type ReqAddItem ¶
type ReqAddItem struct {
Pid uint32 // pid клиента
ReqID uint32 // номер запроса, в случае таймаута на сервере при перепосылке запроса ReqID 2й попытки должен совпадать с ReqID первой попытки
StorageType uint16 // номер очереди
ID uint64 // ID события, 0 - queued сам назначает ID (автоинкремент)
UnixTime uint32 // время активации события
Data []byte `iproto:"u16"` // данные события, до 4096 байт
Flags uint32 `iproto:"-"` // FlagIgnoreWrongItem. Поле опциональное (передаётся, только если не 0)
}
ReqAddItem - формат tuple запроса на создание новой записи в очереди.
func (ReqAddItem) MarshalIProto ¶
func (req ReqAddItem) MarshalIProto(buf []byte) ([]byte, error)
MarshalIProto кодирует запрос на создание новой записи в очереди.
Кастомный маршалер необходим из-за опциональности поля Flags.
func (*ReqAddItem) UnmarshalIProto ¶
func (req *ReqAddItem) UnmarshalIProto(buf []byte) ([]byte, error)
UnmarshalIProto декодирует запрос на создание новой записи в очереди.
Метод объявлен чисто для симметрии маршалеров, для проектов клиентов/обработчиков очередей он не нужен. Пригодится для тестов, прокси iproto/queued->grpc, ну и для гошной версии queued :)
type ReqDeleteItems ¶
ReqDeleteItems - формат tuple запроса на удаление событий по списку ID
func (ReqDeleteItems) Cmd ¶
func (ReqDeleteItems) Cmd() uint32
Cmd - команда queued: CmdDeleteItems (22)
func (ReqDeleteItems) MarshalIProto ¶
func (recvReqDeleteItems ReqDeleteItems) MarshalIProto(buf []byte) ([]byte, error)
func (*ReqDeleteItems) UnmarshalIProto ¶
func (recv_ReqDeleteItems *ReqDeleteItems) UnmarshalIProto(buf []byte) ([]byte, error)
type ReqFullUpdate ¶
type ReqFullUpdate struct {
StorageType uint16 // номер очереди
UnixTime uint32 // новое время активации обновлённых событий, если [SkipTimeUpdate] (0xFFFFFFFF), время не обновляется
Items []UpdQueueItem `iproto:"u32"`
}
ReqFullUpdate - формат tuple запроса на обновление нескольких событий в очереди
func (ReqFullUpdate) Cmd ¶
func (ReqFullUpdate) Cmd() uint32
Cmd - команда queued: CmdFullUpdate (30)
func (ReqFullUpdate) MarshalIProto ¶
func (recvReqFullUpdate ReqFullUpdate) MarshalIProto(buf []byte) ([]byte, error)
func (*ReqFullUpdate) UnmarshalIProto ¶
func (recv_ReqFullUpdate *ReqFullUpdate) UnmarshalIProto(buf []byte) ([]byte, error)
type ReqGetActive ¶
type ReqGetActive struct {
StorageType uint16 // номер очереди
Count uint32 // количество событий в ответе
}
ReqGetActive - формат tuple запроса на получение Count активных событий из очереди
func (ReqGetActive) MarshalIProto ¶
func (recvReqGetActive ReqGetActive) MarshalIProto(buf []byte) ([]byte, error)
func (*ReqGetActive) UnmarshalIProto ¶
func (recv_ReqGetActive *ReqGetActive) UnmarshalIProto(buf []byte) ([]byte, error)
type ReqGetItems ¶
ReqGetItems - формат tuple запроса на получение событий по ID
func (ReqGetItems) MarshalIProto ¶
func (recvReqGetItems ReqGetItems) MarshalIProto(buf []byte) ([]byte, error)
func (*ReqGetItems) UnmarshalIProto ¶
func (recv_ReqGetItems *ReqGetItems) UnmarshalIProto(buf []byte) ([]byte, error)
type ReqQueueStat ¶
ReqQueueStat - получение статистики
func (ReqQueueStat) Cmd ¶
func (ReqQueueStat) Cmd() uint32
Cmd - команда queued: CmdGetQueueStat (36)
func (ReqQueueStat) MarshalIProto ¶
func (recvReqQueueStat ReqQueueStat) MarshalIProto(buf []byte) ([]byte, error)
func (*ReqQueueStat) UnmarshalIProto ¶
func (recv_ReqQueueStat *ReqQueueStat) UnmarshalIProto(buf []byte) ([]byte, error)
type ReqUpdateItems ¶
type ReqUpdateItems struct {
StorageType uint16 // номер очереди
UnixTime uint32 // новое время активации для всех указанных событий
IDs []uint64 `iproto:"u32"`
TimestampType uint8 // TimestampAbsolute, TimestampRelativePlus или TimestampRelativeMinus
}
ReqUpdateItems - формат tuple запроса на обновление времени срабатывания события
func (ReqUpdateItems) Cmd ¶
func (ReqUpdateItems) Cmd() uint32
Cmd - команда queued: CmdUpdateItems(24)
func (ReqUpdateItems) MarshalIProto ¶
func (recvReqUpdateItems ReqUpdateItems) MarshalIProto(buf []byte) ([]byte, error)
func (*ReqUpdateItems) UnmarshalIProto ¶
func (recv_ReqUpdateItems *ReqUpdateItems) UnmarshalIProto(buf []byte) ([]byte, error)
type Request ¶
Request - структуры команд протокола должны поддерживать этот интерфейс (возвращать код команды методом Cmd)
type RespQueueStat ¶
type RespQueueStat struct {
ItemsCount uint32 // кол-во событий в очереди
ActiveCount uint32 // кол-во активных событий в очереди
LockedCount uint32 // кол-во заблокированных событий в очереди
}
RespQueueStat - ответ на команду запроса статистики
func (RespQueueStat) MarshalIProto ¶
func (recvRespQueueStat RespQueueStat) MarshalIProto(buf []byte) ([]byte, error)
func (RespQueueStat) String ¶
func (i RespQueueStat) String() string
String возвращает статистику в формате строки
func (*RespQueueStat) UnmarshalIProto ¶
func (recv_RespQueueStat *RespQueueStat) UnmarshalIProto(buf []byte) ([]byte, error)
type UpdQueueItem ¶
UpdQueueItem - аналог структуры QueueItem для запроса ReqFullUpdate. Если Data == nil, данные не обновляются - только время активации. Чтобы передать пустой массив данных, надо указать []byte{}.
func (UpdQueueItem) MarshalIProto ¶
func (uqi UpdQueueItem) MarshalIProto(buf []byte) ([]byte, error)
MarshalIProto кодирует структуру UpdQueueItem. Если Data == nil, передаётся длина 0xFFFF.
func (*UpdQueueItem) UnmarshalIProto ¶
func (uqi *UpdQueueItem) UnmarshalIProto(buf []byte) ([]byte, error)
UnmarshalIProto декодирует структуру UpdQueueItem. Если переданæ длина данных 0xFFFF, поле Data будет равняться nil.
Source Files
¶
- const.go
- doc.go
- error.go
- perl_format.go
- perl_format_generated.go
- queuedproto.go
- queuedproto_generated.go
- req_add_data.go
- req_add_data_generated.go
- req_add_item.go
- req_add_item_generated.go
- req_delete_items.go
- req_delete_items_generated.go
- req_full_update.go
- req_full_update_generated.go
- req_get_active.go
- req_get_active_generated.go
- req_get_items.go
- req_get_items_generated.go
- req_queue_stat.go
- req_queue_stat_generated.go
- req_update_items.go
- req_update_items_generated.go