Опрос клиентов по активности - PullRequest
0 голосов
/ 12 марта 2012

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

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

Чтобы выполнить это требование, я добавил простой Dictionary<Guid, List<string>> (_activity) к своему сервису, который собирает сообщения об активности. Ключ Guid представляет CalculationTask.Id, а значение List<string> содержит сообщения от отдельных этапов расчета.

Я наивно добавил метод к службе, который вызывается клиентами (через wcf) для опроса сообщений об активности. Клиент передал бы lastPolledTimeStamp, пытаясь сообщить службе: « передайте мне все ваши сообщения с момента последнего опроса » ...

private readonly Dictionary<Guid, List<string>> _activity = new Dictionary<Guid, List<string>>();
public List<string> GetActivity(DateTime lastPolledTimeStamp)
{
   var snapshot = _activity.ToList();

   return snapshot.SelectMany(x => x.Value)
      .Where(x => x.TimeStamp > lastPolledTimeStamp)
      .OrderBy(x => x.TimeStamp)
      .ToList();
}

Вот мои проблемы и вопросы:

(1) Когда клиент и служба находятся на разных компьютерах, попытки фильтровать результаты по сравнению даты и времени не будут работать. И я не могу просто вернуть все в _activity каждый раз, когда вызывается GetActivity - слишком много данных. Должна быть какая-то фильтрация. Какие еще варианты у меня есть?

(2) Еще одна «проблема» - знать, когда можно удалить пару ключ / значение в словаре _activity. Клиенты опрашивают каждые 5 секунд. Я хочу хранить пару ключ / значение достаточно долго, чтобы у клиентов была возможность подобрать ее ... Возможно, мне следует включить другой таймер, который выполняется для периодической очистки старых записей в _activity. Мысли?

Ответы [ 2 ]

1 голос
/ 12 марта 2012

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

Для второй проблемы: если вычисления / шаги могут производить сообщения с разной скоростью, а не иметь буфер фиксированного размера для каждого набора обновлений, я бы продолжал периодически выполнять задание очистки, удаляя сообщения старше, чем [небольшой кратный интервал проверки связи клиента].

0 голосов
/ 12 марта 2012

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

...