SSLEngine с блокировкой ввода-вывода

#java #ssl #nio

#java #ssl #nio

Вопрос:

Из документации SSLEngine: «Отделяя абстракцию SSL / TLS от транспортного механизма ввода-вывода, SSLEngine можно использовать для широкого спектра типов ввода-вывода, таких как неблокирующий ввод-вывод (опрос), выбираемый неблокирующий ввод-вывод, сокет и традиционныйПотоки ввода / вывода, локальные байтовые буферы или байтовые массивы, ..» Будет ли использование SSLEngine с обычными сокетами и блокировкой каналов лучше по сравнению с использованием SSLSocket для блокировки ввода-вывода.

Комментарии:

1. Нет. Он привязан к сети. Я тщательно тестировал это несколько лет назад. Вера в то, что NIO обладает лучшей производительностью, в целом является мифом. Что у него есть, или, по крайней мере, для чего он был разработан, так это лучшая масштабируемость. Это не одно и то же.

Ответ №1:

Незначительно, да. NIO — это не только неблокирующий ввод-вывод. Это также принесло:

  • API с более высоким уровнем использования, основанный на обернутых буферах (ByteBuffers), а не только на массивах байтов.
  • API «Рассеивания» и «сбора», то есть возможность использовать более одного последовательного буфера в одной операции ввода-вывода.
  • Прямой ввод-вывод: использование «прямых» байт-буферов, которые могут существовать вне кучи.

Последний пункт имеет очень конкретные общие последствия для производительности, потому что при использовании массивов / буферов на основе кучи JVM выполняет дополнительную копию любого массива, отправленного в собственном вызове, для облегчения синхронизации со сборщиком мусора. Этого можно избежать с помощью встроенных буферов, что может значительно снизить накладные расходы на сборку мусора.

Тем не менее, SSLEngine имеет огромные проблемы с удобством использования, поскольку его правильное использование серьезно затруднено, в частности, намного сложнее, чем использование старого доброго SSLSocket.

К счастью, эта библиотека позволяет использовать SSLEngine с интерфейсом байтового канала, выполняя всю тяжелую работу с SSLEngine (отказ от ответственности: я являюсь основным автором).