Увеличение 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 для сервера. Сделать это

  1. Щелкните правой кнопкой мыши свою роль
  2. Добавить -> Новый элемент -> Файл XML
  3. Назовите это "CacheSettings.xml"
  4. Вставьте следующий 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 должны быть похожими. Вы также захотите войти, когда вы делаете это, чтобы вы не забыли, что проблема все еще существует.

Другие вопросы по тегам