Documentation
¶
Overview ¶
Package queuedproto - поддержка протокола queued.
Кроме структур протокола самого queued, поддерживаются форматы перловых очередей. Perl addons (используются во всех современных проектах на perl) поддерживаются, perl extensions (используются только в одном крупном старом проекте) - нет.
Типы/константы названы так же, как в исходниках queued. В перле используется другая терминология.
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