Увеличение MaxBufferSize роли кэширования
Я пытаюсь поместить объект размером ~60 МБ в один элемент кэша, однако меня постоянно встречает следующая ошибка
ErrorCode<ERRCA0016>:SubStatus<ES0001>:The connection was terminated, possibly due to server or network problems or serialized Object size is greater than MaxBufferSize on server. Result of the request is unknown.. Additional Information : The client was trying to communicate with the server: net.tcp://127.255.0.0:20004/.
Сначала ошибка указывала на определенный размер, и было ясно, что клиент не может отправить такое большое сообщение, поэтому я увеличил MaxBufferSize в клиенте с помощью следующей
<transportProperties maxBufferSize="999999999"/>
Поиск в Google и поиск SO предоставили ограниченные ресурсы в отношении конфигурации роли кэша (большинство результатов вызывало изменение web.config веб-роли или аналогичного). Даже документация Microsoft ограничена.
Возможно ли, и если да, то как увеличить максимальный размер сообщения, которое может кэшировать роль кэша?
4 ответа
Максимальный размер отдельного объекта, который может быть кэширован, составляет 8 МБ после сериализации. Невозможно заставить библиотеку кеша поместить объект большего размера в кеш.
Вместо этого вы можете попробовать разбить объект в вашем клиенте на несколько (в данном случае 6) объектов, но это действительно грязно.
Если вы действительно не можете жить с 8-мегабайтным ограничением, вы должны отправить запрос на добавление сюда.
Вы только изменили настройку клиента Cache. Возможно в вашем app.config/web.config под:
<dataCacheClients>
<dataCacheClient name="default">
<transportProperties maxBufferSize="XXXXX" />
</dataCacheClient>
</dataCacheClients>
Теперь кеш-клиент разрешает вызов, но сервер не может его выполнить. Вам также нужно установить maxBufferSize для сервера. Сделать это
- Щелкните правой кнопкой мыши свою роль
- Добавить -> Новый элемент -> Файл XML
- Назовите это "CacheSettings.xml"
- Вставьте следующий XML:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="dataCache" type="Microsoft.ApplicationServer.Caching.DataCacheSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />
</configSections>
<dataCache size="Small">
<advancedProperties>
<transportProperties maxBufferSize="XXXX" maxBufferPoolSize="XXXX" />
</advancedProperties>
</dataCache>
</configuration>
Максимальный размер объекта составляет 8 МБ, как упоминал Абхинав ранее. Кэш предназначен для быстрого доступа к небольшим часто используемым объектам. Если вам действительно нужно хранить большие объекты и быстро их использовать, вам следует подумать о хранении таблиц. Это самый близкий к Cache уровень производительности.
В качестве альтернативы, храните ваши данные в разных частях и создайте одноэлементный / статический интерфейс фасада, который может предоставить вам отдельные компоненты или сконструировать конкретный объект и вернуть его в соответствии с требованиями.
Кажется, с 5 июля 2013 года были проблемы с кэшем. В одном приложении мы установили размер буфера, который устранил проблему, но в другом приложении это не помогло. Хотя ошибки кажутся временными. Хотя это не совсем решает проблему, повторные попытки остановят падение приложения. Мы поместили код, подобный приведенному ниже, для временного перекрытия проблем, с которыми мы столкнулись.
try
{
_cache.Value.Put("key", obj);
}
catch (DataCacheException e)
{
if (e.ErrorCode == 17)
{
Thread.Sleep(250);
_cache.Value.Put("key", obj);
}
else
{
throw;
}
}
Вышеуказанные проверки на наличие ошибок 17, но 16 должны быть похожими. Вы также захотите войти, когда вы делаете это, чтобы вы не забыли, что проблема все еще существует.