2016-08-05 3 views
2

Теория: если веб-искатель сканирует весь мой сайт, мой механизм кэширования по умолчанию (например, Redis) будет загружен и может возрасти неверные данные. (в зависимости от политики кэша).Как я могу предотвратить сканирование веб-сканеров на мой кеш (Redis, CDN и т. Д.)

Предполагая, что веб-робот не нужен прирост производительности, я предлагаю, чтобы конечные пользователь, я мог бы изменить мое приложение «защитить кэш»

Вопрос

  • Является ли это хорошая идея?
  • Выполняют ли веб-сканеры разницу во времени между поставляемым контентом?
  • Помимо пользовательского агента, должен ли я «пометить» сеанс, ссылающийся на файл robots.txt, и предположить, что он является искателем?
  • Как я должен административно или программно обрабатывать эту доставку?
  • В крайнем примере, могу ли я дросселировать веб-искатель?

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

  • Это нарушение какой-либо теории управления доменом, чтобы добавить перегрузку метода для определения необходимости обновления кеша?
  • Где я должен поместить логику «обновить Redis» или «не обновлять Redis» ... этот аспект я думаю, что имеет самое непосредственное отношение к DDD

HomeController.cs

public async Task<ActionResult> Events() 
{ 
     ViewBag.Events = await eventSvc.GetLiveEvents(DateTime.Now); 
    return View(); 
} 

Services.EventManagementService.cs

public async Task<List<Event>> GetLiveEvents(DateTime currentDate) 
{ 
    //return ctx.Events.Where(e => e.StatusId == (int)EventStatus.Live && e.EventDate >= DateTime.Now).ToList(); 
    return await cloudCtx.GetLiveEvents(DateTime.Now); 
} 

Data.CloudContext.cs

public async Task<List<Event>> GetLiveEvents(DateTime currentDate) 
    { 
     string year = currentDate.Year.ToString(); 
     var key = GenerateLiveEventsKey(year); 

     var yearEvents = await cache.GetFromCacheAsync<List<Event>>(key, async() => 
     { 
      List<Event> events = new List<Event>(); 
      string partitionKey = year; 

      TableQuery<EventRead> query = new TableQuery<EventRead>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey)); 
      TableQuerySegment<EventRead> currentSegment = null; 
      var result = tableEvents.ExecuteQuery(query); 
      while (currentSegment == null || currentSegment.ContinuationToken != null) 
      { 
       currentSegment = await tableMyEvents.ExecuteQuerySegmentedAsync(query, currentSegment != null ? currentSegment.ContinuationToken : null); 
       foreach (EventRead nosqlEvent in currentSegment.Results) 
       { 
        var eventObj = nosqlEvent.ToEvent(true); 
        events.Add(eventObj); 
       } 
      } 

      return events; 
     }); 
     return yearEvents.Where(e => e.EventDate >= currentDate).ToList(); 
    } 

Data.Cache.cs

public async Task<T> GetFromCacheAsync<T>(string key, Func<Task<T>> missedCacheCall, TimeSpan timeToLive) 
    { 
     if (!IsCacheAvailable) 
     { 
      var ret = await missedCacheCall(); 
      return ret; 
     } 

     IDatabase cache = Connection.GetDatabase(); 
     var obj = await cache.GetAsync<T>(key); 
     if (obj == null) 
     { 
      obj = await missedCacheCall(); 
      if (obj != null) 
      { 
       cache.Set(key, obj); 
      } 
     } 
     return obj; 
    } 

ответ

0
Is this a good idea? 

Не исправить его, если он не сломался (или если нет реальной проблемой в первое место).

Do web crawlers measure the time difference between delivered content? 

Google делает. Его боты будут замедлять сканирование, если это необходимо.

Aside from user agent, should I "tag" a session that references 
robots.txt and assume they are a crawler? 

Агент пользователя достаточно хорош.

How should I administratively, or programmatically handle this delivery? 

Верните 503, чтобы сообщить ботам, что они приходят слишком часто.

In an extreme example, can I throttle a web crawler? 

Да, см. Выше.