---
tags: tarantool, h2o, network
---
# Tarantool Network Framework API
Сетевой фреймворк — это набор интерфейсов для создания сетевых модулей в рамках платформы. Основное назначение фреймворка — дать возможность внешнему разработчику создать модуль, который сможет утилизировать отдельные потоки для обработки сетевых запросов и иметь коммуникационный канал для асинхронного обмена данными с транзакционным потоком.
Для чего это предполагается использовать?
- Интеграция HTTP-фреймворка H2O, когда воркеры H2O работают в отдельных тредах, крутят свой событийный цикл, терминируют TLS, обрабатывают HTTP-запросы, а в TX передаётся уже полностью разобранный запрос, на который он должен ответить.
- Реализация протокола Redis для прозрачной замены Redis
- Перенос сетевой части реализации memcached из tx в отдельный тред
Цель этого — максимально разгрузить транзакционный тред от обработки сетевых запросов, шифрования и прочей нецелевой нагрузки.
Разработчик создаёт модуль, который реализует необходимые ему функции. В функциях, работающих в tx-треде можно пользоваться методами работы с базой и файберами (в т.ч. yield'ить). Нельзя блокироваться. Нельзя запускать "свой" событийный цикл. В функциях, работающих в тредах, нельзя работать с базой, файберами, основным событийным циклом.
* Загрузка (`mod = require 'h2o'`)
- Должна быть выполнима до вызова `box.cfg()`
- Выполянется из TX треда.
- dlopen + проверка наличия нужных символов
- Создаёт lua-модуль и возвращает его
* Конфигурация и запуск. (`mod.cfg{ ... }`)
- Желательна возможность вызова до `box.cfg()`
- Вызывается из lua
- Принимает lua-таблицу с параметрами и передаёт на уровень C
- Проверяет все параметры и выбрасывает исключение в случае некорректности
- Инициализирует слушающие сокеты.
- Инициализирует и запускает необходимое количество рабочих тредов
- В рабочем треде запускается полезная нагрузка, реализующая listen/accept цикл
* Переконфигурация (`mod.cfg{ ... }` повторно)
- Вызывается из lua
- Принимает lua-таблицу с параметрами и передаёт на уровень C
- Проверяет все параметры и выбрасывает исключение в случае некорректности
- Инициализирует новые параметры. Должны поддерживаться:
+ Смена сокета
+ Изменение кол-ва рабочих тредов
- Cтарые треды и их соединения должны завершаются gracefully, т.е. по завершению запроса. (На совести разрабочика модуля)
+ Необходимо API для выставления треду признака работать/завершать-работу и сигнальный интерфейс
* Общение между тредами
- При обработке соединений и запросов может быть необходимо отправить сообщение и данные из рабочего треда в tx тред. Для этого нужен API вызов, который позволит передать данные, обратный контекст и вызовет функцию модуля в tx треде.
- Вызванная в tx треде функция может взаимодействовать с box api, вызывать fiber_yield и т.п. и в конце концов должна иметь возможность передавать данные и контекст обратно.
- Нужно учесть, что в рамках одной пользовательской сессии возможен многократный обмен сообщениями (напр. в сценариях WebSocket, HTTP/2, HTTP/3), т.е. простая пара call/return не подойдёт
- Т.о. необходим механизм двунаправленной асинхронной передачи сообщения вместе с вызовом функции.
* Насколько мне удалось разобраться в iproto.cc, всё уже есть и это называется `cbus`, `cpipe` и `cmsg`
- Нужно вытащить в виде публичного интерфейса для модулей cbus, cpipe и, возможно, rlist