Лучшее сжатие веб-сокетов с использованием дефлятирования внутри сообщения - PullRequest
0 голосов
/ 05 сентября 2018

Я считаю, что все современные браузеры поддерживают сжатие веб-сокетов в форме "permessage-deflate". Однако, насколько я понимаю (и как следует из названия), это сжимает только каждое сообщение в отдельности. В моем случае (и, как я предполагаю, довольно часто) это бесполезно, так как я отправляю много маленьких сообщений JSON.

Существует ли какой-либо текущий или предлагаемый браузер для непрерывного сжатия? Мое исследование нашло экспериментальные расширения веб-сокетов, называемые deflate-stream и deflate-application-data, но они, похоже, умерли. Например, deflate-stream был удален из FireFox в 2011 . Это странно, так как это было бы очень полезно.

Мое текущее узкое место - пропускная способность сети, и я думаю, что мое приложение могло бы значительно выиграть от непрерывного (то есть "внутри-сообщения") сжатия. Например, мое самое распространенное сообщение обычно отправляется не реже одного раза в секунду, и для десятков тысяч веб-сокетов это начинает перегружать 100-мегабитное соединение. Это выглядит примерно так (без пробелов):

{
    "Response": "i",
    "Data": {
        "AlwaysSameId": 12345678,
        "Type": 0,
        "Style": 0,
        "Name": "long.similar.names.often.the.same",
        "Time": 1532492191000000
    }
}

, где большинство полей всегда или обычно одинаковы, и только поле времени всегда изменяется (но все еще похоже). Мои тесты показали, что с такого рода данными, используя сжатие «внутри сообщения», можно сжать JSON на 95% (это в 20 раз меньше!), Но сжатие «на сообщение» дает небольшое или никакое сокращение (так как словарь deflate должен быть отправляется каждый раз).

Я мог бы реализовать собственное сжатие внутри сообщения на более высоком уровне. (Я делал подобные вещи раньше в C, используя zlib 1.2.3) Это может быть немного утомительно, поскольку мне приходится реализовывать оба конца или, по крайней мере, направление с большинством данных - то есть сжимать в бэкэнд (Golang) и распаковать во внешнем интерфейсе (Javascript).

Я только после советов и разъяснений о том, что происходит со сжатием websocket.

...