Gzip
Коллеги, используйте gzip! Это простой способ уменьшить трафик в разы, если не на порядок. Буквально двумя строчками можно превратить гигабайты CSV в 200-300 мегабайтов. Разве не чудо? И делается это парой строк.
Теперь подробней. Gzip — старый алгоритм потокового сжатия. Ключевое слово “потоковый”. Это значит, алгоритму не нужен файл целиком; он читает окно байтов и выдает сжатое окно. За счет этого можно пережать любой поток, в том числе бесконечный.
В джаве потоки байтов используют часто. В ней легко втиснуть GzipInputStream
или GzipOutputStream
, чтобы закодировать или декодировать поток. Например,
если источник сжат Gzip, то обернем его так:
(-> "some.file.gzip"
(io/file)
(io/input-stream)
(GzipInputStream.))
При чтении получим нормальный текст. А чтобы закодировать поток, делаем иначе:
навесим на выходной поток GzipOutputStream
и колбасим в него. Только в конце
надо вызвать .finish
, чтобы добить незавершенное окно.
(let [out (-> "myfile.out.gzip"
io/file
io/input-stream)
gzip (new GzipOutputStream out)]
(while ...
(.write gzip <bytes>))
(.finish gzip))
Удивляет, что при всей банальности gzip используют мало. А ведь он отлично подходит для текстовых данных: HTML, JSON, CSS, JS, CSV. В текущем проекте сервисы гоняют гигабайты CSV и JSON, и хоть кто-нибудь подумал о сжатии…
Простой эксперимент: несжатый CSV — 146 мегабайтов, сжатый — 26. Почти в шесть раз. Даже если закодировать результат в base64, это даст +30% от 26 мегабайтов, то есть всего 35. Выгода все равно 4 раза. В том же Nginx сжатие gzip включается одной строкой в конфиге.
Еще больше мою веру укрепил крит на проде. Один из сервисов выплюнул 6 мегабайтов JSON, что не помещается в квоту AWS Lambda. Пришлось в спешке прикручивать сжатие, чтобы сообщенька пролезла.
Соответственно, бесят HTTP-клиенты, которые ничего не знают о Gzip. Работа с ними превращается в ад: сам проверь заголовки, сам закодируй-раскодируй… и в проекте используется именно такой! Он читает ответ как строку, не проверяя Content-Encoding, и если там gzip, получается чешуя. Авторам — большой ай-ай за игнор веб-стандартов.
Чем раньше вы возьмете gzip в проект, тем лучше. Потом все равно придется, но будет больно.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter