iproto - это бинарный протокол, работающий поверх TCP соединения.
Протокол позволяет делать простые вызовы RPC API с минимальными издержками на сериализацию/десериализацию данных.
Схема протокола:
<packet> ::= <request> | <response>
<request> ::= <header><body>
<response> ::= <header><return_code><body>
<header> ::= <func_id><body_length><request_id>
<func_id> ::= <uint32> - идентификатор вызываемой функции (см. раздел API)
<body_length> ::= <uint32> - длина тела запроса
<request_id> ::= <uint32> - идентификатор запроса, возвращается в ответе, нужен для асинхронной работы с сервером
<return_code> ::= <uint32> - код ответа (см. раздел API)
<body> ::= <byte>... - закодированная в MsgPack (см. раздел API) последовательность байт длиной <body_length>
Статический массив строк длиной 1000 элементов. Каждая строка не более 256 байт.
Сторадж может находится в следующих состояних:
READ_ONLY- доступен только на чтениеREAD_WRITE- доступен на чтение и записьMAINTENANCE- сторадж недоступен
return_code:
0- успех, в этом случае клиент ожидает получить вbodyрезультат, описанный в таблице ниже!= 0- ошибка, в этом случае клиент ожидает получить вbodymsgpack-encoded строку - текстовое описание ошибки. Спецификация кодов ошибок остаётся на усмотрение разработчика сервера.
Тела запросов и ответов закодированы в формате MsgPack. Спецификация формата: https://github.com/msgpack/msgpack/blob/master/spec.md
func_id |
Имя обработчика | Схема тела запроса | Схема тела ответа | Описание |
|---|---|---|---|---|
0x00010001 |
ADM_STORAGE_SWITCH_READONLY |
<nil> |
<nil> |
переводит сторадж в состояние READ_ONLY |
0x00010002 |
ADM_STORAGE_SWITCH_READWRITE |
<nil> |
<nil> |
переводит сторадж в состояние READ_WRITE |
0x00010003 |
ADM_STORAGE_SWITCH_MAINTENANCE |
<nil> |
<nil> |
переводит сторадж в состояние MAINTENANCE |
0x00020001 |
STORAGE_REPLACE |
<int><string> |
<nil> |
записывает в сторадж строку по индексу |
0x00020002 |
STORAGE_READ |
<int> |
<string> |
возвращает строку из стораджа по индексу |
Клонирование репозитория:
$ git clone git@github.com:kuzkuss/iproto_server.git && cd iproto_server
Запуск:
$ go run cmd/main.go
Пример клиента в client/client.go, запуск:
$ go run client/client.go
Коды ошибок (<return_code>):
1 -- ErrIndex (неверный индекс для получения или сохранения строки)
2 -- ErrFuncId (func_id не соответсвует объявленным в API)
3 -- ErrState (неизвестное состояние для стораджа)
4 -- ErrAccess (сторадж не доступен для требуемой операции)
5 -- ErrRead (ошибка чтения данных из соединения)
6 -- ErrWrite (ошибка записи данных в соединение)
7 -- ErrUnmarshal (невозможно десериализовать данные из body)