Частичное чтение / запись сообщений Cap’n Proto

Я пытаюсь использовать Cap’n Proto в существующем проекте, состоящем из клиента и сервера, взаимодействующего по UDS. У меня нет ресурсов (и я сомневаюсь, что это будет принято), чтобы повторить все клиент-серверные RPC, но я хотел воспользоваться механизмами сериализации Cap’n Proto. К сожалению, мне кажется, что это невозможно.

Самая большая проблема — это сторона сервера, которая является однопоточной (и останется таковой, если нет серьезных аргументов для многопоточности) и использует свой собственный цикл на основе опроса. Все события читаются частично, сервер не может заблокировать ожидание какого-либо события, чтобы быть полностью прочитанным — и это то, где я застрял. У нас есть собственный протокол и классы, которые обертывают сообщение, которое может потреблять байты из файлового дескриптора и уведомлять, когда событие полностью прочитано, чтобы сервер мог его обработать. Я думаю, что я проанализировал большинство интерфейсов Cap’n Proto (сериализация, асинхронная сериализация), и кажется, что он не может использоваться таким же образом без каких-либо модификаций.

Я действительно надеюсь, что что-то пропустил. Сделал я?

0

Решение

Есть два способа решить эту проблему:

  • Трудный путь: Вы можете попытаться интегрироваться с платформой асинхронного ввода-вывода KJ (используется Cap’n Proto). Цикл событий KJ может фактически интегрироваться с другими циклами событий и запускаться поверх них — но это сложно. Например, node-capnp включает код для интеграции цикла событий KJ с libuv, как видно в первой части этот исходный файл. Как только вы получите необходимый клей, вы можете написать асинхронный код в стиле KJ, который использует интерфейсы в capnp/serialize-async.h,
  • Простой способ: Вместо того, чтобы пытаться интегрировать KJ, вы можете написать простой код, используя вашу инфраструктуру событий, которая считывает данные из файлового дескриптора напрямую, а затем использует capnp::expectedSizeInWordsFromPrefix() (от capnp/serialize.h) выяснить, получил ли он еще целое сообщение. Если эта функция возвращает число больше, чем у вас уже есть, то у вас нет полного сообщения и вам придется ждать. Получив полное сообщение, вы можете использовать capnp::FlatArrayMessageReader разобрать это.
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector