Самый быстрый способ десериализации объектов из хранилища BLOB-объектов Azure?

После множества сбоев в работе нашего центрального RavenDb мы хотим кэшировать определенные объекты в хранилище BLOB-объектов Azure. Redis не имеет тех же гарантий SLA, что и ABS, поэтому Redis был исключен.

Получение и десериализация этих объектов происходит каждую минуту и ​​должно происходить очень быстро.

Вот код, который мы пытаемся использовать для десериализации, однако он примерно в 5-6 раз медленнее, чем получение объектов из Raven. Все равно оптимизировать? Размер объекта около 8 МБ

var blob = container.GetBlockBlobReference(entityId + ".json");

var serializer = new JsonSerializer
{
    ObjectCreationHandling = ObjectCreationHandling.Reuse,
    NullValueHandling = NullValueHandling.Include,
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
    PreserveReferencesHandling = PreserveReferencesHandling.All,
    TypeNameAssemblyFormat = FormatterAssemblyStyle.Full,
    TypeNameHandling = TypeNameHandling.All
};

using (var stream = new MemoryStream())
{
    blob.DownloadToStream(stream);
    stream.Position = 0;

    using (var sr = new StreamReader(stream))
    using (var jsonTextReader = new JsonTextReader(sr))
    {
        var accountOut =  serializer.Deserialize<Account>(jsonTextReader);
    }
}

person Igorek    schedule 10.08.2017    source источник
comment
Вы определяете, что в 5-6 раз медленнее? Дело в десериализации? Если да, то как вы выполняли десериализацию с помощью Raven? (Не знаю, что это) Или это GetBlockBlobReference? Если так, боюсь, с АБС ничего не поделаешь. Может быть переход на базу данных SQL Azure?   -  person fharreau    schedule 10.08.2017
comment
Самый быстрый способ - хранить и читать двоичные данные с помощью BinaryFormatter или делать это самостоятельно.   -  person user743414    schedule 10.08.2017
comment
@fharreau Я не знаю, что вызывает разницу в 5-6 раз, но предполагаю, что речь идет о сериализации. Однако RavenDb хранит свои объекты как JSON внутри. GetBlockBlobReference не вызывает Azure, а просто создает объект в памяти.   -  person Igorek    schedule 10.08.2017


Ответы (2)


Оказывается, использование одного объекта сериализатора без повторного создания в каждом цикле цикла было решением проблемы. После того, как мы начали кэшировать объект JsonSerializer и повторно использовать его, производительность десериализации из хранилища BLOB-объектов стала 50% от производительности RavenDb.

person Igorek    schedule 13.08.2017
comment
Мысль - при сериализации следует также учитывать затраты на память, очень частая сериализация вызывает гораздо больше циклов сборки мусора - person Michael; 26.08.2017
comment
большое спасибо за включение этого ответа, нам очень важно знать - person Alex Gordon; 08.07.2019

Хотите скорости и не можете использовать Redis (по какой-либо причине)? Есть только один правильный ответ: CosmosDB .

Это очень быстро и поддерживается SSD-накопителем. Доступность 99,99% в пределах одного региона (просто щелкните пользовательский интерфейс портала, чтобы выполнить георепликацию, если вам это нужно).

person evilSnobu    schedule 10.08.2017
comment
У меня создалось впечатление, что CosmosDb имеет ограничение в 2 МБ на объект? - person Igorek; 10.08.2017
comment
Да, вы правы - docs.microsoft.com / en-us / azure / cosmos-db / Может быть, вы можете семантически разделить эти JSON-файлы? Глупое предложение, я знаю. Почему вы отказались от Redis? Уровень Premium имеет главный / подчиненный узлы и постоянство (RDB). - person evilSnobu; 10.08.2017