vksdk
vksdk copied to clipboard
Поддержка zstd словаря
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?
В выступлении(статье) говорится о использовании zstd вместе с msgpack, но сам словарь(data_v2
) тренировался на json, что делает его бесполезным с msgpack...
¯_(ツ)_/¯
Проблема загрузки словаря
В модуле github.com/klauspost/compress/zstd используется опциональная функция zstd.WithDecoderDicts(data)
. Каждый вызов zstd.NewReader(resp.Body, optionWithDecoderDicts)
сначала разбирает словарь, а затем добавляет его к ридеру, что может сказаться на перфомансе
This close #180