Skip to content

kuzkuss/iproto_server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

iproto-сервер

Задание

Протокол

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 - сторадж недоступен

API

return_code:

  • 0 - успех, в этом случае клиент ожидает получить в body результат, описанный в таблице ниже
  • != 0 - ошибка, в этом случае клиент ожидает получить в body msgpack-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)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages