Ticketing
Документация

Структура кадра

Бинарный фрейминг с префиксом длины, переносящий RPC Raft. В отличие от кадров клиентского протокола, завершаемых \n, здесь сначала передаётся длина, а затем читается ровно столько байт. На одном соединении запрос-ответ идут последовательно, и инициатором всегда является вызывающая (dial) сторона.

Запрос (вызывающая сторона → принимающая)

Структураrefresh

Ответ (принимающая сторона → вызывающая)

Структураrefresh
ПолеРазмерСодержимое
tagu8вид RPC — см. Виды RPC (только в запросе)
lenu32, big-endianколичество байт следующего payload
payloadlen байттип openraft, сериализованный в формате postcard

Правила управления соединением

  • Верхняя граница len64 МиБ (проверяется при получении). Превышение, некорректный кадр, неизвестный tag или ошибка обработки Raft — во всех случаях соединение закрывается, а вызывающая сторона (openraft) переподключается и повторяет попытку.
  • Вызывающая сторона переиспользует одно соединение на каждый целевой узел. При ошибке ввода-вывода или отмене запроса в процессе соединение отбрасывается, и при следующем вызове устанавливается заново — чтобы наполовину прочитанный поток не переиспользовался в рассинхронизированном состоянии.

Термины

  • Префикс длины (length-prefix) — фрейминг, при котором сначала передаётся длина тела, а затем читается именно столько байт. Не нужно искать разделитель вроде \n, поэтому можно передавать произвольные бинарные данные как есть.
  • Сериализация — преобразование структуры в памяти в поток байтов, пригодный для передачи.
  • RPC (remote procedure call) — пара запрос-ответ, при помощи которой функция другого сервера вызывается как будто напрямую, через сеть.