2010-11-26 3 views
4

Я работаю над веб-сервисом для чтения данных из стороннего канала, немного его модифицирую и сохраняю, а затем возвращаю его своим клиентам. Он должен обновляться только с стороннего сайта. Он будет работать как служба WCF в веб-роли в Azure.Как архивировать кеш веб-службы в C#

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

public void ParseFeed() 
    { 
     if (DateTime.Now > lastrun.AddMinutes(1)) 
     { 
     //Fetch updated data into something shared here. 
     //thedata is a public static in Global class 
     thedata = fetchdata(); 
     lastrun=DateTime.Now;    
     } 
    } 

Но я предполагаю, что, поскольку выборка может возьмите 1-2 (ее веб-сервис), чтобы сразу несколько пользователей сразу попали в этот код.

из http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607 Поскольку статические члены любого класса, в том числе класса приложения, не поточно-код, пользователь должен предоставить соответствующую блокировку для доступа к статическим членам. Это относится к любому статическому члену, который вы добавляете в класс приложения.

  • я мог бы использовать замок (не знаю, как) EDIT: много информации here

  • Я мог бы избежать статического вар и использовать кэш-память, и кладу в нем данные (но это будет удаляться по истечении срока действия, а несколько пользователей будут пытаться извлекать данные)

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

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

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

У меня такое ощущение, что есть простое решение, которое я полностью пропустил. Идеи?

+0

Я заметил этот http://stackoverflow.com/questions/39112/what-is-the-best-way-to-lock-cache-in-asp-net#40065, который показывает, как управлять замками. Это может быть применимо к большинству опций и по-прежнему оставляет вопрос о том, использовать ли кеш, статические вары или если есть более простой механизм – Andiih 2010-11-26 09:53:24

ответ

1

Из Вашего вопроса, он выглядит следующим образом:

  • Это не приемлемо для обслуживания данных, который более чем за одну минуту из даты
  • Это приемлемо, если два экземпляра службы возвращают разные данные из-за обновления раз быть синхронизированы
  • это приемлемо для вызывающих абонентов, чтобы блокировать в течение 1-2 секунд, в то время как данные обновляются

Предполагая, что это все правда, то самое простое решение просто для использования статической переменной для хранения данных, с конструкцией lock вокруг всего блока проверки/обновления.Я даже не стал бы пытаться сделать что-нибудь умное, как шаблон блокировки двойной проверки; блокировка конкуренции просто не будет проблемой, поскольку время, проведенное в критическом регионе, будет незначительным по сравнению с накладными расходами на работу с веб-службой, за исключением случаев, когда она блокируется, и все должны блокировать в любом случае.

+0

Я бы сказал, что как только данные будут примерно на минуту устаревать, время для получения новых данных. Было бы лучше начать фоновое неблокирующее обновление при обслуживании устаревших данных. С другой стороны, если данные говорят, что час устарел (без использования в одночасье), мне нужно будет блокировать выборку и возврат. – Andiih 2010-11-26 12:42:06

1

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