Уведомление AppFabric о тайм-ауте

Я включил уведомление в AppFabric и пытаюсь получать уведомления, когда элемент удаляется из кеша по истечении времени ожидания, указанного во время добавления. Бывший :

TimeSpan timeout = new TimeSpan(0,0,10); 
m_cache.Add(OrderId.Text, order, timeout);
m_cache.AddItemLevelCallback(OrderId.Text,DataCacheOperations.RemoveItem,myCacheLvlDelegate);

Я поставил точку останова в методе «myCacheLvlDelegate», но она никогда не достигается даже после 10-секундного тайм-аута (тест). Для целей тестирования я вызвал явно

 m_cache.Remove(OrderId.Text); 

после, а затем был вызван делегат!

Таким образом, метод делегата вызывается только в том случае, если я явно вызываю функцию удаления, но не в случае истечения времени ожидания...

У вас есть решение для получения уведомления после тайм-аута (указанного во время добавления)?

Мне это нужно, потому что я хотел бы вызвать веб-сервис после тайм-аута, чтобы обновить данные и снова кэшировать результат.

Спасибо,

Фабрис


person fabrice    schedule 06.10.2011    source источник


Ответы (3)


Что вам действительно нужно, так это получать напоминания через определенные промежутки времени об обновлении элементов кэша Appfabric.

Вы можете попробовать использовать кеш AppFabric вместе с блоком Caching из Microsoft Enterprise Library. Блок кэширования предоставляет вам возможность получать уведомления, когда срок действия элемента истекает. Однако это создаст два кеша.

Сохраняйте идентификатор объекта в кэше, предоставленном блоком приложения, с необходимым интервалом тайм-аута, при этом вы можете «Поместить» актуальные данные в кэш AppFabric без интервала тайм-аута. Используйте «Поместить» вместо «Добавить», чтобы убедиться, что вы заменили объект, если он существует, иначе создайте его.

person BKN    schedule 06.10.2011

Я не думаю, что вы сможете это сделать, так как не думаю, что механизм обратного вызова предназначен для таких вещей. Я вижу, чего вы пытаетесь достичь, и я вижу, как вы пришли к этому вопросу, но я думаю, что пока ваш клиент использует шаблон без кеша везде, где вы касаетесь кеша, вы получите эффект.

Для обзора шаблон кэширования:

  • Проверить кеш на наличие нужного элемента
  • If the item is NOT in the cache
    • Get the item (from whatever source e.g. database, web service)
    • И положить в кеш
    • Вернуть предмет звонящему
  • If the item IS in the cache
    • (Cast it to the expected type)
    • Вернуть предмет звонящему

e.g.

Order order;
// Check to see if the order is in the cache
Object cachedOrder = m_cache.Get(OrderId.Text);

if (cachedOrder == null)
{
    // The order is NOT in the cache, so get it from the web service
    order = OrderWebservice.Get(OrderId.Text);
    // Cache the order for 10 seconds
    m_cache.Add(OrderId.Text, order, New TimeSpan(0,0,10);
}
else
{
    // The order IS in the cache, so cast it
    order = (Order)cachedOrder;
}
// Return the order to the client, whether it's the cached order or the one from the web service
return order;

Таким образом, кешированный заказ никогда не будет старше десяти секунд, потому что, если время ожидания истекло из кеша, следующий вызывающий объект получит нулевой результат из кеша и снова вызовет веб-службу, чтобы получить заказ из веб-службы. . Вы получите тот же эффект, но поскольку кеш будет заполняться по запросу, вы должны увидеть меньшее влияние на ваш сервер, поскольку он не будет запускать запрос веб-службы каждые десять секунд.

person PhilPursglove    schedule 06.10.2011
comment
Спасибо за ваш ответ. 10 секунд были для примера. На самом деле это больше, и вызов веб-сервиса для заполнения кеша очень тяжелый (10 секунд), поэтому я не могу дождаться, когда клиент вызовет страницу, чтобы кэшировать результат веб-сервиса. - person fabrice; 10.10.2011
comment
@PhilPursglove, этот подход зависит от относительно небольшого времени создания данных для кэширования. Когда вы кэшируете вывод ресурсоемких операций, кэширование по запросу может быть недоступно, и вы хотели бы, чтобы обратный вызов с истечением срока действия был запущен. - person zaitsman; 09.02.2014

Я не знаю, если вопрос имеет глубокое значение, но если срок действия элемента истекает в appfabric, уведомление будет получено после истечения срока его действия. Даже если это обратный вызов уровня элемента или обратный вызов уровня кэша.

Мой код

CustomDataCacheOperations.InsertIntoCache(myTestCache, txtKey.Text, InputTable.Text, 10);    
 ndCacheLvlAllOps = myTestCache.AddItemLevelCallback(txtKey.Text, allCacheOperations, myCacheLvlDelegate);

И метод вставки

public static void InsertIntoCache(DataCache curCache, string Key, object value,int timeoutInSeconds)
    {
        if (curCache.Get(Key) == null)
            curCache.Add(Key, value,new TimeSpan(0,0,timeoutInSeconds));
        else
            curCache.Put(Key, value, new TimeSpan(0, 0, timeoutInSeconds));
    }

И он должным образом дает уведомления для всех операций. Уведомление об истечении срока действия придет только после того, как элемент будет вытеснен из памяти, а не когда закончится TTL (время жизни). Я подтвердил это от Microsoft. вам следует немного подождать, чтобы получать уведомления.

person sriharsha KB    schedule 23.07.2013
comment
сколько стоит бит? Что такое значение перечисления DataCacheOperations в обратном вызове? РЕДАКТИРОВАТЬ: ЭТО действительно сработало, но примерно через минуту (!) ожидания. Не очень приемлемо в некоторых сценариях. - person zaitsman; 09.02.2014
comment
Ожидается 1 минута. Поверьте мне, у нас были длительные совещания по этому поводу со службой поддержки Microsoft. Все, что мы получили, это то, что они все еще работают над этим, и уведомления не в режиме реального времени. Сказали, мы не можем гарантировать своевременное уведомление esp. Поэтому, если вы собираетесь развернуть его в продакшене, подумайте дважды. В нашем случае уведомления приходили через 2-3 минуты после истечения срока действия. - person sriharsha KB; 10.02.2014