vksdk icon indicating copy to clipboard operation
vksdk copied to clipboard

Поддержка zstd словаря

Open SevereCloud opened this issue 2 years ago • 0 comments

vk.EnableZstd()

err := vk.UpdateZstdDict()
if err != nil {
	log.Fatal(err)
}

Как это работает?

VK поддерживает сжатие запросов используя zstd со словарем. Для получения ссылки на словарь, вызвается метод account.getZSTDDict

type AccountGetZSTDDictResponse struct {
	Link    string `json:"link"`
	Version string `json:"version"`
	Hash    string `json:"hash"`
}

Файл начинается с версии словаря:

00 01 02 03 04 05 06 07 08 09 0A
64 69 63 74 5F 76 32 37 A4 30 EC
d i c t _ v 2 7 0

Сам zstd словарь начинается с магического номера0xEC30A437 в little-endian формате.

Версия словаря передается в поле x-zstd-dict-version

Странности

Сейчас метод account.getZSTDDict не работает(по некоторым причинам). Сам метод можно вызывать только с помощью токена пользователя.

Словарь для json или msgpack?

image

В выступлении(статье) говорится о использовании zstd вместе с msgpack, но сам словарь(data_v2) тренировался на json, что делает его бесполезным с msgpack...

¯_(ツ)_/¯

Проблема загрузки словаря

В модуле github.com/klauspost/compress/zstd используется опциональная функция zstd.WithDecoderDicts(data). Каждый вызов zstd.NewReader(resp.Body, optionWithDecoderDicts) сначала разбирает словарь, а затем добавляет его к ридеру, что может сказаться на перфомансе


This close #180

SevereCloud avatar Jan 31 '22 14:01 SevereCloud