В настоящее время я работаю над веб-сервисом, и есть вероятность, что возвращаемые результаты могут быть довольно большими (> 5mb).
Вполне допустимо, что этот набор данных будет таким большим, и веб-сервис может быть вызван как синхронно, так и асинхронно, но мне интересно мнение людей по поводу следующего:
Если соединение будет потеряно, то весь набор результатов придется регенерировать и отправлять заново. Есть ли есть ли способ сделать что-то вроде "возобновить", если соединение будет потеряно или сброшено?
Целесообразно ли вообще отправлять такой большой набор результатов? Может быть, лучше реализовать что-то вроде "подкачки", когда набор результатов генерируется и хранится на сервере, а клиент может затем загружать фрагменты набора результатов в меньшем количестве и собирать набор на своем конце?
Я видел, что все три подхода, пронумерованный страницы , хранят и восстанавливают , и крупный толчок .
Я думаю, что решение Вашей проблемы зависит в некоторой степени от того, почему Ваш набор результата настолько большой и как это произведено. Ваши результаты растут со временем, они вычислены внезапно и затем выдвинуты, Вы хотите течь их назад, как только у Вас есть они?
По моему опыту, использование подхода оповещения соответствующее, когда клиенту нужен быстрый доступ к довольно размерным частям набора результата, подобного страницам в результатах поиска. Соображения здесь - полная болтливость Вашего протокола, кэширование всего набора результата между запросами страницы клиента, и/или продолжительность обработки, которую требуется, чтобы произвести страницу результатов.
Сохраните и восстановите, полезно, когда результаты не произвольный доступ, и набор результата растет в размере, поскольку вопрос обработан. Проблемами, чтобы рассмотреть вот является сложность для клиентов и если Вы можете предоставить пользователю частичные результаты или если Вы должны вычислить все результаты прежде, чем возвратиться, что-либо клиенту (думайте, сортируя о результатах распределенных поисковых систем).
Крупный подход толчка почти наверняка испорчен. Даже если клиенту нужна вся информация, и она должна быть выдвинута в монолитном наборе результата, я рекомендовал бы проявить подход 'WS-ReliableMessaging' (или непосредственно или через Вашу собственную упрощенную версию) и большой Ваши результаты. Делая это Вы
Как другие сказали хотя, don' t делают что-либо, пока Вы не знаете своего размера набора результата, как он произведен, и эффективность работы, чтобы быть фактическими проблемами.
Не существует жесткого закона против 5 Мб в качестве размера набора результатов. Более 400 Мб может быть трудно отправить.
Вы'автоматически получите асинхронные обработчики (поскольку вы'используете .net)
реализуют что-то вроде "пагинации", где набор результатов формируется и хранится на сервере, а клиент может затем загружать фрагменты набора результатов в меньшими объемами и повторно собрать набор на своем конце
Это уже происходит для вас - это называется tcp/ip ;-) Повторная реализация этого может быть излишней.
Аналогично...
весь набор результатов должен быть регенерировать и отправить снова
Если это, например, MS-SQL, который генерирует большую часть набора результатов - то повторная генерация будет использовать преимущества некоторого неявного кэширования в SQL Server и последующие генерации будут быстрее.
В некоторой степени вы можете не беспокоиться об этих проблемах, пока они не проявятся как реальные проблемы - потому что платформа (платформы), которую вы используете, позаботится о многих узких местах производительности за вас.
Я несколько не согласен с комментарием SecretGeek':
Это уже происходит для вас - это называется tcp/ip ;-) Повторная реализация этого может быть излишней.
Бывают случаи, когда вам может понадобиться именно это, но только с точки зрения пользовательского интерфейса. Если вы реализуете какой-либо способ передачи данных клиенту (через что-то вроде механизма pushlets), или разделите их на страницы, как вы предлагаете, вы сможете загружать на клиент очень небольшое подмножество, а затем медленно наращивать пользовательский интерфейс с полным объемом данных.
Это делает пользовательский интерфейс более ловким и быстрым (с точки зрения пользователя), но вы должны оценить, будут ли дополнительные усилия стоить того... потому что я не думаю, что это будет незначительный объем работы.
Поэтому похоже, что вас заинтересует решение, которое добавляет 'начальный номер записи' и 'конечный номер записи' параметр к вашему веб-методу. (или 'номер страницы' и 'результаты на странице')
Это не должно быть слишком сложно, если хранилищем данных является sql server (или даже mysql), так как они имеют встроенную поддержку нумерации строк.
Несмотря на это, вы должны быть в состоянии избежать управления сессиями на сервере, избежать явного кэширования набора результатов, и просто полагаться на кэширование в хранилище, чтобы сохранить вашу жизнь простой.