Я ищу шаблон дизайна, который обрабатывает большие наборы данных через Интернет и выполняет периодическое обновление этих объектов. Я разрабатываю приложение, которое будет отображать тысячи записей в пользовательском интерфейсе за один раз. Кроме того, различные свойства этих объектов являются довольно временными и нуждаются в обновлении на клиенте, чтобы информировать пользователя об изменении состояния этих записей в системе. У меня есть несколько идей, как подойти к этой проблеме, но предположил, что там может быть шаблон (или шаблоны) дизайна, который обрабатывает этот тип сценария.
Ограничения:
- Клиентская сторона для этого написана в Silverlight.
- Объекты сами по себе не очень большие (около 15 значений типа и строковых свойств), но запросы для всех данных дороги. 15 свойств содержат данные из разных источников; никакая умная операция объединения или индексация не ускорит запрос. Я подумываю о заполнении только подмножества свойств при начальной загрузке и затем заполнении более дорогих деталей, когда пользователь приближается к заданной группировке объектов. Подумайте, Google maps, но вместо улиц и зданий он показывает объекты.
- Я смогу ограничить часть тысяч объектов, которые обновляются. Тем не менее, я буду нуждаться в том, чтобы пользователь мог "уменьшить" контекст, который позволяет гранулировать обновление, которое показывает все тысячи объектов. Я предполагаю, что обновление будет снова отключено для объектов, когда они оставят достаточный контекст масштабирования.
Идеи о том, как решить всю или часть этой проблемы? Как я уже упоминал, я уже подумываю о нескольких идеях, но ничто из того, что я собрал до сих пор, не дает мне хорошего представления об успехе этого проекта.
Edit:
Я думаю, что трудные части действительно сводятся к двум вещам, для которых мне могут понадобиться две разные модели/практики/стратегии:
- Загрузка большого количества записей через Интернет (~ 5k).
- Сохранение подмножества этих объектов (~ 500) с обновлением по Интернету.
Существует несколько шаблонов проектирования, которые можно использовать для всего остального.
Изменить 2:
Спасибо за ссылки на различные реализации "push" в Silverlight. Я мог поклясться, что сокеты были вывезены из Silverlight, но нашли ссылку Silverlight 3, основанную на ответе ниже. Для меня это все равно не было большой проблемой, и я не потратил много времени на изучение, поэтому я редактирую это из оригинального текста. Независимо от того, происходят ли обновления в опросах или через push, общие проблемы дизайна все еще существуют. Хорошо знать, что у меня есть варианты.
Редактировать 3: Последующие действия над технологиями push.
Как я и предполагал, реализация дуплекса Silverlight WCF кометный push. Это не будет масштабироваться, и есть множество статей о том, как это не происходит в реальном мире.
Реализация сокетов в Silverlight повреждена несколькими способами. Похоже, что это будет бесполезно в нашем сценарии, так как веб-сервер может зависеть от любого конкретного брандмауэра клиента, который не позволит нестандартным портам, а разъемы Silverlight не будут подключаться на 80, 443 и т.д.
Я все еще думаю, используя подход WCFduplex в некотором ограниченном ключе, но похоже, что опрос будет ответом.
Изменить 4: Найден шаблон для решения половины моей проблемы
Я нашел этот шаблон (PDF), который иллюстрирует использование шаблона итератора для извлечения страниц данных из сервер и представить их как простой итератор. В среде .Net я предполагаю, что это будет реализовано как IEnumerable (код примеров находится в Java и Oracle SQL). Особый интерес для меня представлял асинхронный предварительный выбор страниц, в основном буферизирующий результирующий набор на стороне клиента. С объектами 5k все сразу не будет помещаться на экране, поэтому я могу использовать стратегию не получать все сразу, но скрывать эту деталь реализации из пользовательского интерфейса. Основные объекты, которые приложение будет извлекать, находятся в базе данных, тогда для полного заполнения этих объектов требуются другие функции поиска. Эта методология кажется хорошим подходом к быстрому извлечению некоторых данных клиенту.
Теперь я думаю об использовании этого patter + своего рода шаблона прокси-объекта, который прислушивается к дельтам к набору результатов и соответственно обновляет объект. Есть несколько стратегий, которые можно было бы предпринять здесь. Я мог загружать все данные upfront, а затем отправлять дельтах изменений (что, вероятно, потребуется дополнительный код в подсистемах для уведомления об изменениях). Это может быть мой первый подход. Я все еще смотрю. Спасибо за все идеи.