четверг, 4 августа 2011 г.

Сериализация в AppFabric Caching

Как известно, AppFabric Caching ("Velocity") использует XML-сериализацию. На форумах часто задается вопрос: "Можно ли использовать binary serialization?" Т.е. можно ли слегка "сжать" кэшируемые объекты. Встроенной поддержки нет, но вроде ничего не мешает делать её самому. Какие тут могут быть недостатки? Единственное, что мне пришло в голову - формат кэшированных данных станет специфичным для платформы .NET, т.е. с ними не смогут работать программисты Java или там PHP... но на это плевать.

Сделал: перед каждой операцией записи сериализую объект в byte array, при чтении наоборот. Поначалу казалось, что всё замечательно: расход оперативной памяти сократился аж в 4 раза. Памяти в кластере у нас пока много, но важно и другое: снизилась нагрузка на сеть, ведь кэшируемые объекты стали меньше.

Но обнаружился подводный камень с local caching. Как я понимаю, если объект нашелся в локальном кэше, то API просто возвращает ссылку на него, без каких-либо дополнительных операций. Это работает очень быстро. В моем же случае получается, что в локальном кэше хранится не "настоящий" объект, а его копия, сериализованная в byte array. При каждой операции чтения её надо десериализовывать. Казалось бы, это не очень сложно, но если объект очень часто используется, то это может быть дорого. Например, если это - справочник валют, которые используется тысячи раз в минуту.

К сожалению, local caching реализовали прозрачно. Т.е. я не знаю, взят ли объект из локального или глобального кэша. В идеале я хотел бы "распаковывать" только то, что передается из кластера на клиента, но не то, что передается внутри клиента.

Пока Microsoft не усовершенствует API, моя рекомедация такая: если Вы пользуетесь local caching, то лучше использовать binary serialization только для тех объектов, которые читаются из кэша относительно редко.


Другой недостаток AppFabric: нет возможности выборочно включать и отключать локальное кэширование для различных ключей. Можно, правда, использовать две разные DataCacheFactory с разными установками, но Microsoft так делать не советует (потому что тогда, как я понимаю, удваивается количество соединений с кластером).

Комментариев нет:

Ratings by outbrain