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