Если ваши рабочие роли записывают подробности каждой законченной работы в таблицу, используя PK, например, (DateTime.MaxValue - DateTime.UtcNow).Ticks.ToString("d19")
, у вас будет отсортированный список последних обработанных работ. Установите свою веб-роль для опроса таблицы следующим образом:
var q = ctx.CreateQuery<LatestJobs>("jobstable")
.Where(j => j.PartitionKey.CompareTo(LastIndexTime.GetReverseTicks()) < 0)
.Take(1)
.AsTableServiceQuery()
if (q.Count() > 0)
{
//new jobs exist since last check... re-index.
}
Для рабочих ролей, которые выполняют индексирование, это замечательно, потому что они могут без разбора записывать в таблицу, не опасаясь конфликта. У вас также есть журнал аудита работ, которые они обрабатывают (при условии, что вы добавили туда некоторые детали).
Однако у вас осталась одна проблема: похоже, у вас есть 1 веб-роль, которая обновляет индекс. Эта одна веб-роль может, конечно, опрашивать эту таблицу с любой выбранной вами частотой (просто отследите LastIndexTime для поиска позже). Ваша проблема заключается в том, как контролировать параллелизм веб-ролей, если у вас их несколько. Поддерживает ли каждая веб-роль свой собственный индекс, или у вас есть один, где он хранится для всех? Извините, но я не эксперт в Lucene, если это должно быть очевидно.
В любом случае, если у вас есть несколько экземпляров в вашей WebRole и один индекс, который все могут видеть, вам нужно запретить нескольким ролям обновлять индекс снова и снова. Вы можете сделать это путем аренды индекса (если он хранится в хранилище больших двоичных объектов).
Обновление на основе комментария:
Если каждый экземпляр WebRole имеет свой собственный индекс, вам не нужно беспокоиться об аренде. Это только если они совместно используют ресурс BLOB-объектов вместе. Таким образом, этот метод должен работать как есть, и ваше единственное потенциальное препятствие заключается в том, что интервалы опроса для веб-ролей могут быть немного не синхронизированы, что приведет к несколько разным результатам до полного обновления (в зависимости от того, какой экземпляр вы нажали). Опрос каждые 30 секунд на столе, и это будет вашим максимальным из синхронизации. Каждому экземпляру веб-роли просто необходимо отследить, когда он обновлялся в последний раз, и выполнять добавочный поиск с этой точки.