Коллеги, используйте 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 в проект, тем лучше. Потом все равно придется, но будет больно.