Альтернативы ByteBuffers для низкоуровневой системы обмена сообщениями UDP - PullRequest
4 голосов
/ 14 марта 2011

Я работаю над низкоуровневым уровнем обмена сообщениями UDP для зашифрованной архитектуры P2P, если вам интересно, вы можете прочитать больше об этом на его странице github .

Я построилаккуратная структура сериализации, которая превращает POJO в компактные ByteBuffers, а также различные библиотеки, которые делают использование симметричной и асимметричной криптографии довольно безболезненным.

Сейчас я работаю над структурой обмена сообщениями, которая использует динамические прокси для достижения похожихфункциональность механизма RPC GWT.

Моя проблема в том, что на раннем этапе я решил сделать механизм сериализации для чтения и записи из ByteBuffers.Сейчас я обнаружил, что это имеет несколько проблем:

  • Вам необходимо знать максимальный размер байтового буфера до сериализации объекта
  • Они изменяемы, что делает их подверженными ошибкам
  • Они не особенно совместимы с DatagramPacket, а DatagramChannels сбивают с толку

Кто-нибудь может предложить альтернативные способы реализации сериализации в этой среде?

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

Может быть стоит взглянуть на KryoNet - он может соответствовать вашим потребностям, или, альтернативно, вы можете посмотреть, как они работают под капотом.

Между прочим, они используют ByteBuffers для TCP и UDP соединений. Я думаю, что хитрость заключается в том, чтобы абстрагироваться от ByteBuffers, чтобы любой клиентский код мог просто работать с POJO. Для этого вам, безусловно, понадобится логика, которая может разбить большой объект на несколько буферизованных записей.

Я думаю, что на самом деле вы все еще хотите использовать ByteBuffers, поскольку они очень быстрые, поддерживают различные нативные приемы ускорения и, как вам это нравится или нет, в конечном итоге вам нужно иметь дело с буферизацией в среде ввода-вывода с высокой пропускной способностью ....

0 голосов
/ 15 марта 2011

Кто-нибудь может предложить альтернативные способы реализации сериализации в этой среде?

Почему альтернатива, здесь я рассмотрю ваши основные проблемы:

  • Вам необходимо знать максимальный размер байтового буфера до сериализации объекта

Почему максимальный размер ByteBuffer? Вы можете использовать пул буферов. Вы должны быть готовы разбить объекты на несколько пакетов. Один пакет - один объект не будет работать для больших объектов. Сериализация - это интересная мысль: и, как правило, именно здесь она становится грязной. Вам понадобится неплохой уровень протокола (+ - повторная отправка пакетов и т. Д.)

  • Они изменчивы, что делает их подверженными ошибкам

Вы хотите, чтобы они были изменяемыми по соображениям производительности. У меня никогда не было проблем с их изменчивостью. Возможно, вам также нужны прямые буферы. Слава Богу, что они видоизменяются, поскольку они не дешевы (не) распределять. Прямые буферы отображаются прямо в код ОС (посмотрите на sun.nio.ch.DatagramDispatcher)

  • Они не особенно совместимы с DatagramPacket, и DatagramChannels сбивают с толку.

Они в порядке, вам просто нужно разделить ваши объекты на несколько пакетов. Если вы используете буферы, придерживайтесь буфера, и все будет хорошо.

...