Структура кадра
Бинарный фрейминг с префиксом длины, переносящий RPC Raft. В отличие от кадров клиентского протокола, завершаемых \n, здесь сначала передаётся длина, а затем читается ровно столько байт. На одном соединении запрос-ответ идут последовательно, и инициатором всегда является вызывающая (dial) сторона.
Запрос (вызывающая сторона → принимающая)
Структураrefresh
Ответ (принимающая сторона → вызывающая)
Структураrefresh
| Поле | Размер | Содержимое |
|---|---|---|
tag | u8 | вид RPC — см. Виды RPC (только в запросе) |
len | u32, big-endian | количество байт следующего payload |
payload | len байт | тип openraft, сериализованный в формате postcard |
Правила управления соединением
- Верхняя граница
len— 64 МиБ (проверяется при получении). Превышение, некорректный кадр, неизвестныйtagили ошибка обработки Raft — во всех случаях соединение закрывается, а вызывающая сторона (openraft) переподключается и повторяет попытку. - Вызывающая сторона переиспользует одно соединение на каждый целевой узел. При ошибке ввода-вывода или отмене запроса в процессе соединение отбрасывается, и при следующем вызове устанавливается заново — чтобы наполовину прочитанный поток не переиспользовался в рассинхронизированном состоянии.
Термины
- Префикс длины (length-prefix) — фрейминг, при котором сначала передаётся длина тела, а затем читается именно столько байт. Не нужно искать разделитель вроде
\n, поэтому можно передавать произвольные бинарные данные как есть. - Сериализация — преобразование структуры в памяти в поток байтов, пригодный для передачи.
- RPC (remote procedure call) — пара запрос-ответ, при помощи которой функция другого сервера вызывается как будто напрямую, через сеть.