Существует ли шаблон разработки для контакта с большими наборами данных по Интернету?

не используют следующие названия зарезервированного устройства названия файла:

ДОВОД "ПРОТИВ", PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 и источник LPT9

: MSDN

Другие имена, такие как имена дисковода, не может использоваться также:

CLOCK$, A:-Z:

Источник: поддержка Microsoft

13
задан Jason Jackson 4 November 2009 в 19:32
поделиться

8 ответов

Я проголосовал за пару хороших ответов, но нашел решение с некоторыми изменениями внутренних данных и новым способом получения данных из Silverlight. Вот что делается для решения этой проблемы:

  1. Я использую bean-компоненты для представления этого большого графа данных. Это удалило большую часть передачи XML. В любом случае меня интересует только часть данных, хотя это довольно значительная часть. Сглаживая данные в bean-компонент, я думаю, что сократил размер сериализованного объекта примерно до 20-25% от исходного графа объекта.
  2. Почти все данные на бэкенде теперь будут иметь поле, когда оно было изменено в последний раз. . Мне удалось получить это для всех больших данных. Есть несколько фрагментов данных, в которых этого нет, но с его помощью были решены реальные проблемы с производительностью запросов и агрегированием данных. Как общее решение для других, похоже, что это довольно просто реализовать в ряде СУБД.
  3. Я пишу новые API для извлечения данных, которые были обновлены после предоставленного DateTime. Это позволяет мне запрашивать только новые и измененные объекты из серверной системы (это веб-служба, вызывающая эти API-интерфейсы, а Silverlight вызывает веб-службу).
  4. Совокупные изменения в веб-службе и определение наличия часть дейтаграфа изменилась. Для простоты я просто отправляю весь датаграф, если что-то изменилось. На самом деле это было сложнее всего понять. Часть датаграфа может иметь новое обновленное время, но основной объект графика не обновлен. В итоге мне пришлось писать API для поиска изменений подобъектов, а затем API ' s, чтобы найти корневые объекты на основе этих подобъектов (если они были изменены). Граф объектов может быть возвращен с корневым объектом (и фактически большей частью графа объекта), который не обновлялся с момента последнего опроса. Логика веб-службы запрашивает небольшое количество изменений, поэтому, хотя запросы по отдельности недешевы, они потенциально могут выполняться только несколько раз за опрос. Даже в очень больших установках нашего продукта этот цикл запросов будет выполняться только 10 или 20 раз за цикл опроса (см. О моем решении для опроса ниже). Хотя наши системы очень динамичны, не , что сильно меняется за 30 секунд. Вызов веб-службы, который обрабатывает все это, реагирует на вызов начальной загрузки так же, как и на опрос. Все, что его интересует, - это получение данных новее заданного времени.
  5. Я написал коллекцию, унаследованную от ObservableCollection, которая обрабатывает запросы и опросы. Клиентский код, использующий эту коллекцию, предоставляет делегата, который запрашивает данные. Дата возвращается асинхронно и в страницах. Я еще не остановился на размере страницы. Он продолжает запрашивать страницы до тех пор, пока сервер не вернет страницу, размер которой меньше максимального размера страницы. В коллекции также предоставляется информация о том, как определить самую последнюю дату самого нового объекта в коллекции. Он периодически опрашивает обновления, которые новее, чем самый новый элемент в коллекции. На самом деле эта «самая последняя дата» на самом деле является объектом, содержащим несколько дат различных частей исходного графа объектов. Если элемент возвращается с сервера, который существует в коллекции, элемент в коллекции обновляется с помощью этих возвращенных данных. Я сделал это вместо того, чтобы вставлять новый элемент и удалять старый, потому что он работает в большем количестве ситуаций с привязкой к данным.

Этот шаблон можно улучшить. Я мог отправлять в Silverlight только дельты для изменений. Я все еще мог бы попробовать использовать какую-нибудь технологию push. Но это решение дает мне один вызов веб-службы, который может возвращать данные для различных случаев. Опрос также очень прост, и извлечение всех данных выполняет только одна вещь. Движущихся частей не так много. Это обрабатывает изменения состояния объекта как во время начальной загрузки данных, так и во время опроса с помощью одного и того же механизма. Это тоже хорошо масштабируется. Первоначальный вызов кажется самым дорогостоящим, а последующие вызовы выполняются все быстрее и быстрее. Я предполагаю, что это связано с тем, что данные, которые остаются на сервере, становятся все меньше и меньше с каждым проходом.

У меня все еще есть один вопрос о моей реализации этого, который я разместил здесь .

Спасибо за все предложения. Хотя я не прислушался ко всем советам, несколько идей либо напрямую помогли мне, либо заставили меня задуматься о другом пути, как заставить это работать.

0
ответ дан 2 December 2019 в 01:31
поделиться

Здесь я нашел статью, которая, кажется, объясняет, как создавать сокеты в Silverlight 2. Silverlight 2 и System.Net.Sockets.Socket

Я не читал его очень глубоко (для меня уже слишком поздно), но похоже, что его можно было бы использовать в вашем случае. Основное ограничение, которое я заметил, заключается в том, что ваше приложение Silverlight может подключаться только к серверу, с которого оно было загружено.

Здесь руководство по каналу 9 Silverlight с использованием сокета

Надеюсь, это поможет

1
ответ дан 2 December 2019 в 01:31
поделиться

2 предлагаемых решения могут быть

1) сжать вашу коллекцию и распаковать ее после передачи.

2) Использовать шаблон прокси Flyweight +.

2
ответ дан 2 December 2019 в 01:31
поделиться

In general I think the answer to your question is that there isn't one or more Design Patterns that will really solve your problem. Instead, this is a great example of a decently large-scale application which just needs a lot of planning and design work.

When you're designing, I think you'll come across some DPs that may help you on a small level, but the details of how this giant thing should work is more of a general (and interesting) design problem.

Perhaps clarifying your questions slightly may help lead people to giving advice on the overall design for this system. Also, once you've put some design/effort into coming up with a high-level design of how this should work, you could ask for critiques/suggestions. It's hard for someone to come up with this completely as an answer to a StackOverflow question. :)

1
ответ дан 2 December 2019 в 01:31
поделиться

I think you might be missing something: since Silverlight 3 there's the ability to push data to the client. Here's an article which might be helpful with that.

0
ответ дан 2 December 2019 в 01:31
поделиться

Шаблон проектирования прокси - это шаблон, который помогает в передаче данных из одной точки в другую. Шаблон проектирования прокси позволит вам рассматривать удаленные объекты, как если бы они были локальными.

2
ответ дан 2 December 2019 в 01:31
поделиться

Если я правильно понимаю, здесь действительно есть две проблемы:

  1. Состояние системы представлено данными, поступающими из нескольких источников данных. В результате запрос состояния обходится дорого.
  2. Объем данных, описывающих состояние системы, велик. В результате запрос всех данных, описывающих состояние, обходится дорого.

Стандартные шаблоны для решения этих проблем включают введение среднего уровня и использование дельт для обновления состояния. Например:

  1. Очевидно, вы не хотите, чтобы ваши клиенты Silverlight напрямую общались с серверными системами. Это не только невозможно, но и очень неэффективно, поскольку каждый клиент может запросить один и тот же источник данных о своем состоянии. Чтобы избежать этого стандартного решения, необходимо ввести средний уровень, который объединяет данные, поступающие из всех внутренних источников данных, а также предоставляет клиентам общий интерфейс. В результате внутренние источники данных будут опрашиваться только по мере необходимости (может быть настроено для каждого источника данных на среднем уровне), а также клиентам не придется иметь дело с особенностями этих поддерживаемых источников данных. Кроме того, вы можете реализовать индексацию данных на среднем уровне на основе запросов, наиболее распространенных для клиентов.

  2. Предполагая, что каждая запись будет иметь идентификатор, клиент должен запрашивать только дельты с момента последнего обновления. Один из многих шаблонов - использовать метку времени. Например, когда клиент инициализирует, он запрашивает состояние системы, а средний уровень отправляет это состояние с отметкой времени. Когда клиенту необходимо обновить определенные записи, он предоставляет идентификаторы в запросе и отметку времени последнего обновления. Поэтому средний уровень будет отправлять только изменения с последней отметки времени, и только для запрошенных идентификаторов. Если объект имеет 15 свойств, и только 3 из них были изменены с момента последней отметки времени, то обновление будет содержать только значения этих 3 свойств.

Что касается push vs. poll - push автоматически не является лучшим решением. Это действительно сводится к вопросу о компромиссе между частотой обновления клиента и объемом трафика между клиентом и средним уровнем. Например, если изменение состояния происходит часто, но редко (например, затрагивает только несколько свойств за раз) и нет необходимости обновлять состояние клиента немедленно, клиент может предпочесть, чтобы изменения накапливались, а не получали каждое обновление, поэтому опрос будет предпочтительнее.

Что касается push vs. poll - push автоматически не является лучшим решением. Это действительно сводится к вопросу о компромиссе между частотой обновления клиента и объемом трафика между клиентом и средним уровнем. Например, если изменение состояния происходит часто, но редко (например, затрагивает только несколько свойств за раз) и нет необходимости обновлять состояние клиента немедленно, клиент может предпочесть, чтобы изменения накапливались, а не получали каждое обновление, поэтому опрос будет предпочтительнее.

Что касается push vs. poll - push автоматически не является лучшим решением. Это действительно сводится к вопросу о компромиссе между частотой обновления клиента и объемом трафика между клиентом и средним уровнем. Например, если изменение состояния происходит часто, но редко (например, затрагивает только несколько свойств за раз) и нет необходимости обновлять состояние клиента немедленно, клиент может предпочесть, чтобы изменения накапливались, а не получали каждое обновление, поэтому опрос будет предпочтительнее.

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

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

1
ответ дан 2 December 2019 в 01:31
поделиться

Интересно, можно ли вообще уменьшить объем данных, поступающих на экран клиента? В любом случае вы не можете увидеть сразу 5 000 точек данных. И если вам нужно прокрутить для поиска важных вещей, подумайте о том, чтобы для начала отфильтровать неважные. Рассмотрим несколько вариантов дизайна пользовательского интерфейса (приборная панель и тип приборов), чтобы пользователь видел только проблемные места. Затем они могут углубиться в детали и принять необходимые меры.

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

2
ответ дан 2 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: